2014-10-30 40 views
0

我在keydown上使用.one()函数来停止此运行中的函数,如果用户按住键。jQuery .one()只在页面上运行一次

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

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

有没有办法解决这个问题,或者一种替代方法?

我得到.one()表示一次,而且这是函数的重点。我试图让它每个keydown运行一次。

+4

'one()'就是这样命名的,因为它只会触发一次。你尝试过'()'吗? – Ski 2014-10-30 13:09:00

+0

我明白了,但是希望每个'keydown'运行一次。 .on()在按住键的情况下多次运行该函数。 – ccdavies 2014-10-30 13:10:36

+0

[如何在jQuery中禁用重复的keydown](http:// stackoverflow。com/questions/9098901/how-to-disable-repetitive-keydown-in-jquery) – PeterKA 2014-10-30 13:28:58

回答

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'); 
 
});
<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>

UPDATE:

请在类似的问题我们来看一看:

  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)
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

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

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)操作,你可能希望重新绑定调用在回调结束时而不是函数。

编辑:在阅读您的评论之后,可能最好的地方就是在键控监听器中进行重新绑定。

+0

谢谢。任何想法,为什么我会得到“E没有定义”? – ccdavies 2014-10-30 13:23:58