JavaScript / JQuery如何再次调用方法之前的设置时间?

时间:2014-03-16 05:28:11

标签: javascript jquery events queue keypress

我正在开发一款游戏。我的事件处理程序正在使用JQuery,游戏是用JavaScript编写的,我一直试图找到最好的方法来设置时间,然后再从我的事件监听器调用一个方法。

这是我当前的事件监听器:

function shootingHandler(key){
    switch(parseInt(key.which, 10)){
        case UpArrow:
        case Spacebar:
            setTimeout(player.shoot(), 1000);
            break;
    }
}

setTimeout()方法不适用于此,因为它只调用方法,然后等待指定的时间,然后触发它。所以在我的示例代码中,我试图让它成为player只能每秒发射一次,但如果玩家按住空格键则会自动射击数千次。

使一个方法一次只能被调用一次的好方法是什么,每隔几秒只能调用一次?

4 个答案:

答案 0 :(得分:1)

选中此fiddle

var timerActive;
function shootingHandler(key){
  switch(parseInt(key.which, 10)){
    case UpArrow:
    case Spacebar:
            if (timerActive){
                clearTimeout(timerActive);
             }
            timerActive= setTimeout(player.shoot(), 1000);
            };
        break;
    }
}

这里,如果在前一次调用的1秒之前再次调用函数shootingHandler,则计时器将重置为0.因此,只有当玩家释放空格键1秒钟时才会触发该功能。 这是一个老技巧,用于防止窗口大小调整在拖动时触发数百次。

答案 1 :(得分:1)

var disabled = false;
var shootOnEnabled = false;
function shootingHandler(key){
    switch(parseInt(key.which, 10)){
        case UpArrow:
        case Spacebar:
            if (disabled) { 
                shootOnEnabled = true;
                break; 
            }
            shoot();
            disabled = true;
            setTimeout(function () {
                disabled = false;
                if (shootOnEnabled) {
                    shootOnEnabled = false;
                    shootingHandler(key);  
                }
            }, 1000);
            break;
    }
}

答案 2 :(得分:0)

如果您被允许使用其他第三方库,请查看下划线

http://underscorejs.org/

它有一个非常好的功能,可以完全满足你的需要。

var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);

在此示例中, updatePosition 将在每100毫秒之前调用。

答案 3 :(得分:0)

player.shoot()中,首先检查玩家是否被允许射击。类似于if(allowedToShoot) { ... }

shootingHandler中,调用一个将标志设置为true的函数,调用player.shoot(),然后将标志设置回false。类似于setTimeout(allowShooting(), 1000);

function allowShooting(){
    allowedToShoot = true;
    player.shoot();
    allowedToShoot = false;
}