在初始按下XXX ms后延迟另一次按键

时间:2012-12-08 04:05:06

标签: jquery delay keydown

我正在努力寻找一种在keydown事件后添加短200 ms延迟的方法。

这是为了防止有人一个接一个地按键过快。

以下是目前的代码:

$(document).keydown(function (e) {
   if ($(e.target).is('input')) { e.stopPropogation(); }
   else if (e.keyCode == 37) { $(".pageback").click(); return false; }
   if (e.keyCode == 39) { $(".pagenext").click(); return false; } 
});

2 个答案:

答案 0 :(得分:2)

您无法阻止某人过快按键,并且可能不明智/无法阻止该消息传来。但是,您可以跟踪自上次按键以来的时间,如果时间过早则忽略该消息:

var last_time = null;
$(document).keydown( function (e) {
    var now = new Date().getTime(),
        diff;
    if ($(e.target).is('input')) { 
        e.stopPropogation(); 
    } else if (e.keyCode == 37 || e.keyCode == 39) { 
        if( last_time != null ) {
            diff = now - last_time;
            if( diff < 200 ) {
                return false;   // do nothing
            }
        }
        last_time = now;
        if (e.keyCode == 39) { 
            $(".pageback").click(); 
            return false; 
        } if (e.keyCode == 39) { 
            $(".pagenext").click(); 
            return false;
        } 
    } 
});

每按一次键,检查自上次成功按下的时间,如果有足够的延迟,则记录当前时间并继续。否则,退学。

有意义吗?

答案 1 :(得分:0)

var timer;

$(document).on('keydown', function (e) {
   clearTimeout(timer);

   timer = setTimeout(function() {
       if ($(e.target).is('input')) { 
           e.stopPropogation(); 
       }else if (e.keyCode == 37) { 
           e.preventDefault();
           $(".pageback").click(); 
       }

       if (e.keyCode == 39) { 
           e.preventDefault();
           $(".pagenext").click();
       } 
   }, 200);
});

使用按下键时清除的简单超时,如果用户每200ms输入的速度超过一个键,则该功能将无法执行。