如果我有一个密集的mousemove
处理程序
window.moveEventCounter = 0;
window.addEventHandler("mousemove", function(e) {
for (var i = 0; i < 100; i++) {
console.log(i);
}
window.moveEventCounter++;
});
处理的mousemove事件的计数小于为相同(或类似)鼠标操作注册快速事件处理程序时的事件计数。
我认为这是一个很聪明的浏览器引擎,当执行繁重时不会过度填充事件队列,但这不是我的预期。
用于删除(或不发出)mousemove事件的浏览器政策是什么? (在Firefox 30上观察到此行为)
答案 0 :(得分:1)
众所周知 - javascript本质上是单线程的。
这意味着当js代码被执行时 - 浏览器会冻结。这意味着,无论您何时在浏览器中“执行”操作 - 都不会由它处理,因为浏览器应用程序无法响应交互。
这意味着它不是事件被丢弃,但它发出的事件更少,因为现在浏览器花费更多的时间来执行JS而不是处理你的输入。
答案 1 :(得分:1)
浏览器肯定会掉线&#34;一些mousemove
事件,主要是因为它不能仅为光标通过的每个像素执行一次函数。执行频率取决于浏览器本身:
移动指针设备时事件的频率是实现,设备和平台特定的,但是应该针对持续指针设备触发多个连续的
mousemove
事件移动,而不是每个鼠标移动实例的单个事件。 鼓励实施方法确定最佳频率,以平衡响应度和性能。来源:http://www.w3.org/TR/DOM-Level-3-Events/#event-type-mousemove
Firefox可能只会在最后一个事件结束时触发另一个mousemove
事件,因为JavaScript是单线程的,并且它不想填满堆栈。你可以说Firefox是&#34;阻止&#34;事件,但我要说的是Firefox不太频繁地解决这个事件。