我在keydown上使用.one()函数,以便在用户按下键时连续停止此运行。
问题是,.one()函数只运行一次,并且只有在刷新页面时才会再次运行。
$(document).one('keydown',function(e){
if (e.keyCode == 37) {
prev();
return false;
}
});
有没有办法绕过这个或替代方法?
我明白了.one()意味着一次,这就是函数的重点。我试图让它在每个keydown运行一次。
答案 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;
<强>更新强>
请看一下类似的问题:
答案 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监听器中。