- PR -

JavascriptでのShiftキー機能

投稿者投稿内容
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-18 21:45
クロージャでイベントハンドラ追加していけば
全部の要素に追加する必要ないのか・・・

勉強になりました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-18 21:49
コード:
           form_elements.push(document.forms[0].elements[i]);


document.forms[0].elements[i] を直にいれずに
コントロールの双方向リストにしてから追加していったら後で楽?
こっちのほうがめんどくさいか・・・
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 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;
}
}
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 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]));
}
}
くー
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 86
投稿日時: 2006-01-19 09:20
すいません。
返事が遅くなってしまいました。

私のやり方よりスマートでびっくりしました!
ぜひぜひ参考にさせて頂きます。

mioさん、検証はこちらでします。


***************************************
ここから投稿の再編集です。
mioさんの上のプログラムのsetを使った方なのですが
動いたのにエラーが出てしまいました。
私の環境が悪いせいかもしれません^^;
下のプログラムの方は全く問題なかったです!

でっち6号さんのプログラムも動きました。
確かにドロップダウンリスト等の上下を使う場所では考え所ですね。

勉強になりました。
***************************************

[ メッセージ編集済み 編集者: パンダおにぎり 編集日時 2006-01-19 09:59 ]

[ メッセージ編集済み 編集者: パンダおにぎり 編集日時 2006-01-19 10:02 ]

スキルアップ/キャリアアップ(JOB@IT)