限制事件侦听器每秒触发的次数

时间:2013-02-02 22:04:53

标签: javascript

我正在使用Gamepad API - 特别是使用控制器上的操纵杆的轴。这些更新的位置经常发生 - 因此,我正在聆听的事件(棒上的动作)也会发生很多。有没有办法限制它发生在每秒25次以减少滞后?

4 个答案:

答案 0 :(得分:9)

您无法限制触发JavaScript事件的速率,但您的事件处理程序可能会选择不对某些调用执行任何操作。以下是使用mousemove的示例(我不知道您正在谈论哪个Gamepad API):

var lastMove = 0;
document.addEventListener('mousemove', function() {
    // do nothing if last move was less than 40 ms ago
    if(Date.now() - lastMove > 40) {
        // Do stuff
        lastMove = Date.now();
    } 
});

http://jsfiddle.net/jk3Qh/

答案 1 :(得分:1)

您可以执行以下操作,在此处检查您在1秒间隔内调用事件的频率以及是否处理该事件。代码示例,粗略概述了我的想法(没有gaurantee(就像那个拼写))。

function process_event() {
var curr = new Date().getTime();
if ((curr - timeObj.last) < 1000) { //One Second 
     if (timeObj.counter > 25) {
        for (var x=0;x<timeObj.times;x++) {
             if ((curr - timeObj.times[x]) >= 1000) {
                   timeObj.times.splice(x, 1);
                   timeObj.counter -= 1;
             }
        }
     }
     else { 
         timeObj.counter += 1;
         timeObj.times[timeObj.times.length()-1] = curr;
     }
}
else {
    timeObj.counter = 0;
    timeObj.times = [];
}
if (timeObj.counter > 25) {
    return False
 }  
 else {
   return True
 } 
}

答案 2 :(得分:0)

初始化一个每次事件侦听器激活时递增的变量。使它成为事件监听器输出的函数仅在变量低于25时发生。

答案 3 :(得分:0)

我很确定这可能是更好的解决方法。 ;)但不要相信我。大声笑。移动跟踪功能就是您要每秒触发25次的功能。

setInterval(movementTracking(), 40)

阅读有关它的摘要-> https://www.w3schools.com/jsref/met_win_setinterval.asp