防止下一个keydown事件,直到脚本执行完成

时间:2012-11-29 12:39:12

标签: javascript jquery

我想禁用keydown事件,直到keydown事件内的脚本完成执行。

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

目前,当我按下键并保持不释放时,keydown事件会反复触发,我想禁用它。

5 个答案:

答案 0 :(得分:1)

一旦keydown事件发生,您可以取消绑定事件:

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

然后在动画完成后重新绑定down函数(可能是回调函数)。

如果您对绑定/重新绑定不感兴趣,并且不喜欢icky全局变量,则可以使用类来指示动画是否正在进行中:

  $(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函数中将其删除,方式大致相同。

答案 1 :(得分: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;
    }
});

答案 2 :(得分:0)

绑定和重新绑定很昂贵。只需跟踪变量是否正在进行动画,并在再次执行之前进行检查:

var animating = false;

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

});

然后,您可以使用具有适当延迟的settimeout将动画设置为false;

答案 3 :(得分: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');
});

答案 4 :(得分:-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.
        }
    }
});