0

keydown イベント内のスクリプトが実行を終了するまで、keydown イベントの発生を無効にしたいと考えています。

  $(document).keydown(function(e){
        if (e.keyCode == 40){
           down(); //Assume down has some animate function executes for 1sec
        }
   });

現在、キーを押して離さずに押し続けると、keydownイベントが繰り返し発生するため、これを無効にしたいと考えています。

4

5 に答える 5

1

いくつかの変数を保持し、それもチェックします

var isAnimating = false;
$(document).keydown(function(e){
    if (!isAnimating && e.keyCode == 40){
        isAnimating = true;
        down(); //Assume down has some animate function executes for 1sec
        isAnimating = false;
    }
});
于 2012-11-29T12:42:13.627 に答える
1

keydown イベントが発生したら、イベントのバインドを解除できます。

  $(document).keydown(function(e){
        if (e.keyCode == 40){
           down(); //Assume down has some animate function executes for 1sec
           $(document).unbind('keydown');
        }
   });

down次に、アニメーションが完了したら (おそらくコールバックとして) 関数に再バインドします。

バインド/再バインドに興味がなく、厄介なグローバル変数が気に入らない場合は、クラスを使用して、アニメーションが進行中かどうかを示すことができます。

  $(document).keydown(function(e){
        if (e.keyCode == 40 && $('body').is(':not(.animating)')){
           down(); //Assume down has some animate function executes for 1sec
           $('body').addClass('animating');
        }
   });

downアニメーションが完了したら、ほぼ同じ方法で関数内で削除します。

于 2012-11-29T12:41:01.693 に答える
0

Asadの答えに基づく解決策:

$(document).keydown(function(e){
    if( $('body').hasClass('animating')){
        //DO NOTHING
    }
    else{
        if (e.keyCode == 40){
           down(); //Assume down has some animate function executes for 1sec
           $('body').addClass('animating');
        }
    }
 });


$(document).keyup(function(e){
    $('body').removeClass('animating');
});
于 2012-11-29T13:04:58.060 に答える
0

Binding and rebinding is expensive. Just keep track of whether animation is in progress with a variable, and check before doing it again:

var animating = false;

$(document).keydown(function(e){
    if (e.keyCode == 40 && !animating){
       down(); //Assume down has some animate function executes for 1sec
       animating = true;
    }

});

Then you can use a settimeout with an appropriate delay to set animating back to false;

于 2012-11-29T12:43:02.220 に答える
-1

イベントの発生を防ぐことはできませんが、無視することはできます。

var keyIsDown = false;
$(document).keydown(function(e){
    if(!keyIsDown) {
        keyIsDown = true;
        if (e.keyCode == 40){
            down(); //Assume down has some animate function executes for 1sec
            // set keyIsDown = false; on the animation callback, inside down func.
        }
    }
});
于 2012-11-29T12:41:09.033 に答える