Javascript mousemove事件处理程序是否阻止mousemove事件?

时间:2014-07-11 02:49:48

标签: javascript events mousemove

如果我有一个密集的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上观察到此行为)

2 个答案:

答案 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不太频繁地解决这个事件。