- - PR -
JavascriptでのShiftキー機能
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2006-01-18 21:45
クロージャでイベントハンドラ追加していけば
全部の要素に追加する必要ないのか・・・ 勉強になりました。 | ||||
|
投稿日時: 2006-01-18 21:49
document.forms[0].elements[i] を直にいれずに コントロールの双方向リストにしてから追加していったら後で楽? こっちのほうがめんどくさいか・・・ | ||||
|
投稿日時: 2006-01-18 23:45
ここまでやる必要はないと思いますが、一応できたんで。
あんまり動作検証してませんが。 function set(f, prev, next) { return function(event) { f.call(null, event||window.event, prev, next); }; } function set_onkeydown() { var elems = []; for (var i = 0, e = document.forms[0].elements, ei; (ei = e[i]); i++) { if (ei.type != "hidden") elems.push(ei); } var m = elems.length - 1; if (m == 0) return; if (document.addEventListener) { elems[0].addEventListener("keydown", set(element_onkeydown, elems[m], elems[1]), false); for (var i = 1; i < m; i++) { elems[i].addEventListener("keydown", set(element_onkeydown, elems[i - 1], elems[i + 1]), false); } elems[m].addEventListener("keydown", set(element_onkeydown, elems[m - 1], elems[0]), false); } else { elems[0].attachEvent("onkeydown", set(element_onkeydown, elems[m], elems[1])); for (var i = 1; i < m; i++) { elems[i].attachEvent("onkeydown", set(element_onkeydown, elems[i - 1], elems[i + 1])); } elems[m].attachEvent("onkeydown", set(element_onkeydown, elems[m - 1], elems[0])); } } function element_onkeydown(e, prev, next) { var target = e.target || event.srcElement; switch (e.keyCode) { case 38: prev.focus(); break; case 40: next.focus(); break; } } | ||||
|
投稿日時: 2006-01-19 00:12
setは汎用的なもの考えたけど、思い直しました。
function element_onkeydown(prev, next) { return function(event) { switch (event.keyCode) { case 38: prev.focus(); break; case 40: next.focus(); break; } }; } function set_onkeydown() { var elems = []; for (var i = 0, e = document.forms[0].elements, ei; (ei = e[i]); i++) { if (ei.type != "hidden") elems.push(ei); } var m = elems.length - 1; if (m == 0) return; if (document.addEventListener) { elems[0].addEventListener("keydown", element_onkeydown(elems[m], elems[1]), false); for (var i = 1; i < m; i++) { elems[i].addEventListener("keydown", element_onkeydown(elems[i - 1], elems[i + 1]), false); } elems[m].addEventListener("keydown", element_onkeydown(elems[m - 1], elems[0]), false); } else { elems[0].attachEvent("onkeydown", element_onkeydown(elems[m], elems[1])); for (var i = 1; i < m; i++) { elems[i].attachEvent("onkeydown", element_onkeydown(elems[i - 1], elems[i + 1])); } elems[m].attachEvent("onkeydown", element_onkeydown(elems[m - 1], elems[0])); } } | ||||
|
投稿日時: 2006-01-19 09:20
すいません。
返事が遅くなってしまいました。 私のやり方よりスマートでびっくりしました! ぜひぜひ参考にさせて頂きます。 mioさん、検証はこちらでします。 *************************************** ここから投稿の再編集です。 mioさんの上のプログラムのsetを使った方なのですが 動いたのにエラーが出てしまいました。 私の環境が悪いせいかもしれません^^; 下のプログラムの方は全く問題なかったです! でっち6号さんのプログラムも動きました。 確かにドロップダウンリスト等の上下を使う場所では考え所ですね。 勉強になりました。 *************************************** [ メッセージ編集済み 編集者: パンダおにぎり 編集日時 2006-01-19 09:59 ] [ メッセージ編集済み 編集者: パンダおにぎり 編集日時 2006-01-19 10:02 ] | ||||
