Javascript 限制事件侦听器每秒可以触发的次数
我正在玩Gamepad API,特别是使用控制器上的操纵杆的轴。这些信息的位置经常更新,因此,我所听到的事件(棍子上的移动)也经常发生。有没有办法将其限制在每秒25次以减少延迟?初始化一个变量,该变量在每次事件侦听器激活时递增。使事件侦听器输出的函数仅在变量小于25时发生。您不能限制JavaScript事件的触发速率,但您的事件处理程序可以选择在某些调用上不执行任何操作。下面是一个使用Javascript 限制事件侦听器每秒可以触发的次数,javascript,Javascript,我正在玩Gamepad API,特别是使用控制器上的操纵杆的轴。这些信息的位置经常更新,因此,我所听到的事件(棍子上的移动)也经常发生。有没有办法将其限制在每秒25次以减少延迟?初始化一个变量,该变量在每次事件侦听器激活时递增。使事件侦听器输出的函数仅在变量小于25时发生。您不能限制JavaScript事件的触发速率,但您的事件处理程序可以选择在某些调用上不执行任何操作。下面是一个使用mousemove的示例(我不知道您在谈论哪个Gamepad API): 您可以这样做,检查在1秒间隔内调用事件
mousemove
的示例(我不知道您在谈论哪个Gamepad API):
您可以这样做,检查在1秒间隔内调用事件的频率,以及是否处理它。代码示例,我所想的大致轮廓(没有gaurantee(像那样的拼写))
函数过程\事件(){
var curr=new Date().getTime();
如果((curr-timeObj.last)<1000){//1秒
如果(时间对象计数器>25){
对于(变量x=0;x=1000){
时间对象时间拼接(x,1);
timeObj.counter-=1;
}
}
}
否则{
timeObj.counter+=1;
timeObj.times[timeObj.times.length()-1]=当前值;
}
}
否则{
timeObj.counter=0;
timeObj.times=[];
}
如果(时间对象计数器>25){
返回错误
}
否则{
返回真值
}
}
我确信这可能是一个更好的解决方案但不要相信我的话。lol。移动跟踪功能将是您希望每秒触发25次的功能
setInterval(movementTracking(),40)
阅读有关它的摘要->您正在寻找的是所谓的节流。看一看这个问题:。这是一个简单的解决方案,但您可能会错过“最后一个”事件,这在某些场景中很重要。我认为您只会一遍又一遍地覆盖eventlistener,这似乎不是目标。您是对的Nico谢谢,我的意思是间歇性地调用该操作的函数
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();
}
});
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
}
}