7

「下」キーが押されたときに実行されるJavaScript関数があります。「下」キーを押したままにすると、機能がまったく実行されないことを望みます。

keydown と keyup の間のタイミングについて考えました。時間が 1 秒未満の場合、関数は keyup で実行されます。問題は、キーを押したままにすると、キーが連続して何度も押されているとブラウザが認識してしまうことです。

これを行うより良い方法はありますか?

ありがとう

4

7 に答える 7

2

キーが押されたときとキーが押されたときを 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');   
        }
    }
};

JSFiddle

于 2011-08-23T17:11:36.893 に答える
1

あなたの問題は、ブラウザが保持されているキーを複数のキーダウンイベントとして解釈することであると理解しています。キーを押したままにした場合と単に押した場合とでは、何か違うことが起こるようにしたいと考えています。その違いは、キーを「保持」する必要があると思われる時間に基づいている必要があります。そのため、キーアップ イベントを追跡して、ホールドとプレスを区別する必要があります。次の疑似コードは、この問題を解決します。

キーダウン時:

if !yourBool 
    start timer

yourBool = true 

キーアップ:

if timer < yourTime
    do something

yourBool = false

keyup イベントが発生しない限り、タイマーは再起動しないため、これは機能します。

さて...お使いのブラウザがキーの保持を次のように解釈する場合:
Keydown、Keyup、Keydown、Keyup .......
このアプローチには問題があります。

于 2011-08-23T17:09:56.417 に答える
0

ブラウザはキーが何度も押されていることを確認しますが、keydownイベントは最初に押されたときにのみ発生します。

あなたが望むのは、keydownイベントからではなく時間を計ることですkeypressed

于 2011-08-23T17:10:21.490 に答える
0

おそらく、キーダウンでカウンターをトリガーしてから、次のキーアップをリッスンできます。カウンターが 5 秒を超えるとすぐに、またはどれだけ時間が経過しても機能を開始できます。わかる?

于 2011-08-23T17:06:32.033 に答える
0

同様の問題がありました。「最初の」キーダウンイベントをすべてキャプチャしたかったのですが、キーが押された結果である場合は、連続するイベントを無視しました。それがあなたが望むものかどうかはわかりませんが、ここに1つのアプローチがあります:

var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
  if (!repeat) {
    // Run your code.
    repeat = true;
  }
});
于 2016-09-18T02:03:48.113 に答える