jQuery .one()只在页面上运行一次

时间:2014-10-30 13:06:41

标签: jquery

我在keydown上使用.one()函数,以便在用户按下键时连续停止此运行。

问题是,.one()函数只运行一次,并且只有在刷新页面时才会再次运行。

$(document).one('keydown',function(e){
    if (e.keyCode == 37) { 
        prev();
        return false;
    }
});

有没有办法绕过这个或替代方法?

我明白了.one()意味着一次,这就是函数的重点。我试图让它在每个keydown运行一次。

3 个答案:

答案 0 :(得分:1)

简单的黑客攻击:

var pressed = false;
$(document).on('keydown',function(e){
    if (e.keyCode == 37 && !pressed) { 
        pressed = true;
        prev();
        return false;
    }
});

然后,如果您想再次调用pressed = false;函数(可能在prev()函数的末尾...),您只需确保再次设置pev()。这可能会发生onkeyup

$(document).on('keyup',function(e){
    pressed = false;
});

这实际上取决于您的需求。

答案 1 :(得分:1)

如果时间差太短,您可以使用事件的timeStamp属性并与之前的值和return false进行比较 - 重复键。但是,您需要使用.on()



var t = Date.now();
$(document).on('keydown',function(e){
    if( e.timeStamp - t < 100 ) {
      t = e.timeStamp;
      $('pre.out').append( (e.timeStamp - t) + ': Bad\n' );
      return false;
    }
    t = e.timeStamp;
    if (e.keyCode == 37) { 
        $('pre.out').append( 'Bad\n' );
        return false;
    }
    $('pre.out').append( 'Good\n' );
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" name="test" />
<pre class="out"></pre>
&#13;
&#13;
&#13;

<强>更新

请看一下类似的问题:

  1. How to disable repetitive keydown in jQuery
  2. jQuery keypress event fires repeatedly when key is held - but not on all keys
  3. Stop key from repeating on hold. (jQuery)

答案 2 :(得分:1)

一个人就是你想要的,它运行一次!这实际上是防止人们双重提交表单等的一种非常好的方法,但需要稍微不同的设计。我发现自己在这里使用命名函数最简单,试试这个

function handle_key_down_event (e) {
    if (e.keyCode == 37) { 
        prev();
        return false;
    }
    document.one('keydown',handle_key_down_event (e));
}
document.one('keydown',handle_key_down_event (e));

通过在函数末尾重新声明声明,再次重置它。要记住的一个小技巧是,如果您正在执行异步(主要是ajax)操作,您可能希望重新绑定调用位于回调的末尾而不是函数。

编辑:阅读完你的评论后,最好放置重新绑定调用的地方可能是在keyup监听器中。