【发布时间】:2018-07-03 01:19:20
【问题描述】:
我想知道当您在 Javascript 的事件循环中有几个相同类型的其他事件时,是否可以跳转到并处理最新事件。我问这个是因为,我制作了一个 Javascript 程序,每次鼠标指针移动时都会报告“mousemove”事件。问题是,由于某种原因,事件处理没有达到应有的速度,而且我的 PC 或代码当然不是问题。
我认为问题在于网络浏览器限制了每帧可以处理的“mousemove”事件的数量。因此,我不想处理队列中的所有事件,而是跳到最新的事件并处理它并丢弃所有较旧的事件,而不是一个接一个地执行所有事件。
我不确定这是否可以通过 Javascript 实现,所以这就是我寻求帮助的原因。
任何帮助将不胜感激... :-)
Here 是我的应用程序。问题是,如果您尝试将窗口的标题栏区域向上或向下移动得太快,您将失去窗口本身的句柄。现在,这不应该在现代 GUI 中发生。
关于“去抖动”答案的更新:
所以,有人建议我应该使用去抖动功能。那不会解决我的问题。在最好的情况下,它只会延迟需要做的事情。因此,例如,如果我在 (4,0) 处有一个像素,然后尝试将其向左移动 3 个像素,到 (1,0),它会以正常方式出现,但只是一点点延迟。也就是说,如果假设(我正在编造这个)队列上的一个新的“mousemove”事件每 1 毫秒处理一次,并且此示例的代码运行所需的时间为 0 毫秒,并且在代码,我们使用代码设置函数在处理新事件后 2 毫秒执行。这意味着实际上,只有最新的事件将被处理,并且代码将在最新事件的侦听器函数开始运行后 2 毫秒运行。因此,要将一个像素向左移动 3 个像素,这仍然需要 5 毫秒。那仍然太慢了。我实际上需要用鼠标指针的坐标更新我的 Web 应用程序,从它实际的位置开始。
我的解决方案:
每次 'mousemove' 事件的侦听器开始执行时,我都应该从鼠标指针中获取坐标,而不是从事件的 .clientX 和 .clientY 属性中获取坐标。一旦注册了“mousemove”事件并且当时创建的事件对象(也没有最新的-鼠标指针的日期坐标)。我已经搜索了如何在没有实际事件对象的情况下获取实际鼠标指针坐标的解决方案,但到目前为止,我只阅读了有关它不可能的响应。
This 人和我有同样的问题。我现在正在记录鼠标的全局(文档)位置,但应用程序的行为仍然相同。
【问题讨论】:
-
你需要一个debouncer。
-
你所说的“最新事件”是什么?您无权访问队列,但您可以在“去抖动”函数中使用 setTimeout 创建自己的队列。非常简单的概念:当一个事件被调用时,将它安排在未来的某个时间。如果你得到另一个,取消最后一个并安排下一个。它仅在两个事件之间存在您指定的超时延迟时才执行。
-
这些都不行。请阅读我对原帖的最新补充。而且,我还添加了一个指向我的应用程序的链接,以便每个人都可以看到实际存在的问题。
标签: javascript events mousemove onmousemove