只能每半秒钟按一次空间



当我按Spacebar时,函数拍摄执行。

window.onkeydown=function(e){
    var which = e.keyCode;
    if(which == 32){
        shoot();
    }
}

如果您握住空间,请连续多次射击。我只希望该功能每500ms执行一次。

(function($){
    var lazerCharging = false,
        lazerChargeTime = 500;  // Charge time in ms
    function handleKeyPress(e){
        if(e.keyCode == 32){
            shoot(lazerChargeTime);   
        }
    }
    function shoot(chargeTime){
        if(!lazerCharging){        
            lazerCharging = true;       
            $("body").append("pew<br/>");
            setTimeout(function(){
                lazerCharging = false;
            }, chargeTime)            
        }        
    }
    $(window).on("keydown", handleKeyPress);
})($);

这是一个JSFIDDLE

您将要" debounce"

使用jQuery节气门/调试,您可以将延迟和功能传递给 $ .debounce获得一个新功能,当重复称为时, 每次"呼叫"只执行一次原始函数。

这对于限制处理程序的费率特别有用 关于将触发Ajax请求的事件。看看这个 示例自己看看!

Ben Alman在这里为您做了辛勤工作:http://benalman.com/code/projects/jquery-throttle-debouse/examples/debounce/

本质上是按照Mattc建议的审问。存储该功能的最后时间,并确保已通过500毫秒。另外,您可能应该使用.addEventListener而不是window.onkeydown

(function() {
    var lastCallTime = 0;
    window.onkeydown = function(e){
        var now = Date.now();
        if(e.keyCode == 32 && now - lastCallTime > 500) {
            shoot();
            lastCallTime = now;
        }
    }
});

我怀疑keydown/keypress事件总是会连续触发。它可能取决于浏览器,操作系统设置等。即使它们是"火率"也可能波动。您可能不想要这个。

我认为一个更好的主意是创建一个启动第一个keydown事件并在keyup事件上停止的计时器。

http://jsfiddle.net/kpblh/

var fireTimer = null;
function fire() {
    // do whatever you need
}
document.addEventListener("keydown", function(e) {
    if (e.keyCode == 32 && fireTimer === null) {
         fire(); // fire immediately...
         fireTimer = setInterval(fire, 500);  // ...and 500ms, 1000ms and so on after
    }
});
document.addEventListener("keyup", function(e) {
    if (e.keyCode == 32 && fireTimer !== null) {
        clearInterval(fireTimer);
        fireTimer = null;
    }
});

相关内容

  • 没有找到相关文章

最新更新