「下」キーが押されたときに実行されるJavaScript関数があります。「下」キーを押したままにすると、機能がまったく実行されないことを望みます。
keydown と keyup の間のタイミングについて考えました。時間が 1 秒未満の場合、関数は keyup で実行されます。問題は、キーを押したままにすると、キーが連続して何度も押されているとブラウザが認識してしまうことです。
これを行うより良い方法はありますか?
ありがとう
「下」キーが押されたときに実行されるJavaScript関数があります。「下」キーを押したままにすると、機能がまったく実行されないことを望みます。
keydown と keyup の間のタイミングについて考えました。時間が 1 秒未満の場合、関数は keyup で実行されます。問題は、キーを押したままにすると、キーが連続して何度も押されているとブラウザが認識してしまうことです。
これを行うより良い方法はありますか?
ありがとう
キーが押されたときとキーが押されたときを 200 ミリ秒区別するこの小さなスクリプトを書きました。おそらくあなたはそれを利用することができます:
document.onkeydown = function(e){
var keycode = window.event ? window.event.keyCode : e.which;
if(keycode == 40){
var timer = setTimeout(function(){
alert('Down key held');
document.onkeyup = function(){};
}, 200);
document.onkeyup = function(){
clearTimeout(timer);
alert('Down key pressed');
}
}
};
あなたの問題は、ブラウザが保持されているキーを複数のキーダウンイベントとして解釈することであると理解しています。キーを押したままにした場合と単に押した場合とでは、何か違うことが起こるようにしたいと考えています。その違いは、キーを「保持」する必要があると思われる時間に基づいている必要があります。そのため、キーアップ イベントを追跡して、ホールドとプレスを区別する必要があります。次の疑似コードは、この問題を解決します。
キーダウン時:
if !yourBool
start timer
yourBool = true
キーアップ:
if timer < yourTime
do something
yourBool = false
keyup イベントが発生しない限り、タイマーは再起動しないため、これは機能します。
さて...お使いのブラウザがキーの保持を次のように解釈する場合:
Keydown、Keyup、Keydown、Keyup .......
このアプローチには問題があります。
ブラウザはキーが何度も押されていることを確認しますが、keydown
イベントは最初に押されたときにのみ発生します。
あなたが望むのは、keydown
イベントからではなく時間を計ることですkeypressed
。
おそらく、キーダウンでカウンターをトリガーしてから、次のキーアップをリッスンできます。カウンターが 5 秒を超えるとすぐに、またはどれだけ時間が経過しても機能を開始できます。わかる?
同様の問題がありました。「最初の」キーダウンイベントをすべてキャプチャしたかったのですが、キーが押された結果である場合は、連続するイベントを無視しました。それがあなたが望むものかどうかはわかりませんが、ここに1つのアプローチがあります:
var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
if (!repeat) {
// Run your code.
repeat = true;
}
});