只能每半秒按一次空间

时间:2014-02-04 16:46:38

标签: javascript onkeydown function-call

当我按空格键时,功能拍摄会执行。

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

如果您按住空格,请连续多次拍摄电话。我只想让函数每500ms执行一次。

4 个答案:

答案 0 :(得分:2)

(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

答案 1 :(得分:1)

你想要“辩护”

  

使用jQuery油门/去抖动,您可以传递延迟和功能   $ .debounce来获取一个新函数,当重复调用时,   每次“一堆”调用只执行一次原始函数。

     

这对于处理程序的速率限制执行特别有用   在将触发AJAX请求的事件上。看看这个   例子,亲眼看看!

Ben Alman在这里为你付出了辛勤的努力:http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/

答案 2 :(得分:1)

基本上是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;
        }
    }
});

答案 3 :(得分:0)

我怀疑保证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;
    }
});