Javascript / jQueryを使用して、誰かがキーを押したときに、キーダウンイベントまたは同等のイベントを自動的に繰り返すにはどうすればよいですか?
私が実際に望んでいるのは、キーが押されているかどうかを確認できることですが、ここでの他の質問からは、それは不可能のようです。推奨される回避策は、キーダウンイベントとキーアップイベントを記録し、キーダウンイベントが記録され、その後のキーアップがない場合はキーがダウンしていると想定することです。
私の場合、その解決策は問題にぶつかります。私はオンライン実験を設計しています。ユーザーは、実験全体で「T」キーを押したままにし、決して離さないようにする必要があります。実験は複数の試行で構成されており、各試行は前の試行で記録された情報にアクセスできません。したがって、トライアル1はTのキーダウンを記録できますが、トライアル2はそのレコードにアクセスできないため、Tがダウンしたかどうかはわかりません。
ここで、Tキーを押したままにすると、Tに対して自動的に繰り返されるキーダウンイベントが生成される場合、トライアル2はTの次のキーダウンイベントをキャッチするだけなので、問題はありません。しかし、少なくともFirefoxでは、キーを押したままにすると自動的にキーダウンイベントが繰り返されることはないようです。私が見ることができることから、異なるブラウザがキーを押したままにする方法に変化があるように思われます。私の問題を解決するための良いクロスブラウザの方法は何ですか?
ちなみに、それが重要な場合は、これがすべて行われている間に、他のキーのキーアップイベントとキーダウンイベントも検出できる必要があります。
編集:コメントのいくつかを読んだ後、私は戻って、通常の状況下で実際にキーダウンイベントが繰り返されることを確認しました。しかし、私は実際にそれらを必要とする特定の状況でそれらを取得しません。問題を切り分けると思う簡単なコードがいくつかあります。
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<div id="target"></div>
</body>
<script type="text/javascript">
var i;
function foo() {
i++;
$('#target').html(i);
}
function doTrial() { // do trial
i=0;
$(document).keydown(foo);
$(document).keyup(endTrial);
}
function endTrial() { // end trial
$('#target').html('');
$(document).unbind('keydown',foo);
$(document).unbind('keyup',endTrial);
doTrial();
}
doTrial();
</script>
</html>
キーを押したまま離してからもう一度押すと、期待どおりの動作になります。つまり、キーを押している間は増加し、離すと消え、押すと再び増加し始めるカウンターがあります。また。
しかし、2つのキーを押してから1つを離すと、もう1つの(リリースされていない)キーがキーダウンイベントを送信し続け、カウンターが(リセット後)増加し続けると思います。実際、それは起こりません。なぜ、どのようにそれを実現するのか、何か考えはありますか?