【问题标题】:MouseMove event repeating every secondMouseMove 事件每秒重复一次
【发布时间】:2013-07-23 18:44:35
【问题描述】:

http://jsfiddle.net/MrkY9/

我的计算机(到目前为止,我的同事中没有其他计算机)在 Chrome、IE 和 Safari 中出现问题(但在 Firefox 中没有)。简单的mousemove 代码,例如以下(已经在上面的小提琴上运行)正确捕获mousemove 事件,但只要鼠标在 div 中,每秒捕获一个mousemove 事件 - 即使我' m 不再移动鼠标。

var number = 0;
$("#foo").on("mousemove", function() { this.innerHTML = number++ });

这似乎是一个基于浏览器的问题,因为它不会在 FireFox 上显示。 (Windows 本身也不会发生这种情况。即使计数器上升,如果我不理会键盘和鼠标,我的屏幕保护程序最终也会启动。)在断定这不是系统问题之前,我尝试更换鼠标并切换它插入的 USB 端口。毫不奇怪,这些解决方案都不能解决问题。

我还没有想出如何在浏览器中使用除 javascript 之外的任何东西进行测试。

问题: 有没有人遇到过这个?我需要做什么才能抓住它吗?我的代码远没有这个依赖于知道鼠标何时移动和不移动的小提琴那么琐碎。

【问题讨论】:

  • 我无法重现这个...
  • 有可能解决这个问题,方法是保存鼠标位置,并在做任何需要做的事情之前检查位置是否确实不同。
  • 您是否考虑过指针设备的硬件问题?
  • 您是否正在使用某种可以破坏屏幕保护程序的保活程序?还是我每秒都在模拟鼠标移动的其他东西?尝试一次删除一个后台程序,看看能否解决问题。
  • 我们在 WebApp 中发现了同样的问题,并将其报告给了 Chrome 团队。他们确认了这个问题:请投票here 来修复它。

标签: javascript mousemove


【解决方案1】:

好的,我发现了问题,但我不完全明白为什么会出现问题。

我让任务管理器在后台运行。并且由于某种原因,每次更新自身时,都会导致 IE、Safari 和 Chrome 接收到 mousemove 事件。

这没有意义,但至少修复很简单:关闭任务管理器。

(如果您在“应用程序”选项卡中,这一点非常明显。如果您在“性能”中,则取决于设置的值。)

【讨论】:

  • 遇到了同样的问题。对我来说,这是因为我运行了 Flux,它正在改变显示器的屏幕颜色。
  • wtf,如果你有一个开放的任务管理器,这正是发生的事情 - 谢谢,你为我节省了很多时间(并且增加了白发)!
  • @KIC 很高兴我的大量时间和白发可以为您节省一些。 :-)
  • 当服务器管理器或 Fiddler 打开时,我在 Win Server 2008 / Chrome 36 上遇到同样的问题,Chrome 但不是 Firefox。
  • 对我来说,原因是 HeidiSQL。他们有一个贝宝捐赠按钮,每 10 秒更改一次文本,并触发 2 次鼠标移动。
【解决方案2】:

对我来说,在播放 iTunes 时有时会出现此问题。我知道 iTunes(适用于 Windows)多年来一直存在焦点问题 - 它往往会从自己的弹出窗口中窃取焦点。

您在(已接受)答案中指出了问题:其他应用程序可以窃取浏览器的焦点,随意触发 mousemove 事件。但是,对于实时网站,我们不能假设用户没有运行某些程序,例如任务管理器或 iTunes。

按照问题评论部分的建议,请保存鼠标位置并继续检查是否发生变化。

使用 jQuery 的示例代码:

var old_pos = [0, 0];
$(el).on("mousemove", function(e) {
    var new_pos = [e.clientX, e.clientY];

    // Quit if the mouse position did not change.
    if(old_pos[0] == new_pos[0] && old_pos[1] == new_pos[1])
        return;

    // Your code.
});

(注意:最好将touchmove 事件与toucheschangedTouches 数组一起用于触摸手势。)

希望这对遇到类似问题的人有所帮助。

编辑:根据以下 Scott 的评论将鼠标事件与触摸事件分开的附加功能:

var old_pos = [0, 0];
$(el).on("mousemove touchmove", function(e) {
    var new_pos = [e.clientX, e.clientY];

    // Quit if the mouse position did not change.
    if(e.type == "mousemove" && old_pos[0] == new_pos[0] && old_pos[1] == new_pos[1])
        return;

    // Your code.
});

【讨论】:

  • 感谢您提供更多信息。只是为了澄清我的情况——我们只想让我们的代码的一部分处理鼠标/触摸事件,所以有一些东西可以捕获触摸事件并将它们作为鼠标事件转发。由于模拟鼠标单击会触发 move 和 mousedown 事件,因此我们必须允许移动事件为 0。
  • 有道理。我可能会尝试解决它,例如通过监听mousemovetouchmove 并通过事件监听器内的e.type 将它们分开(请参阅上面我编辑的帖子)。由于mousedownmousemove 同时触发,另一个解决方案可能是为mousedown 添加事件侦听器,在此处记录开始坐标并忽略初始mousemove。无论如何,你已经解决了这个问题,所以这些只是你下次遇到鼠标事件问题时的一些想法。
  • 感谢您的加入。肯定有解决这个问题的方法(尽管这需要在许多地方更改代码以处理极端情况),但对我们来说更重要的是找到根本原因。只要我们知道根本原因,我们就非常乐意告诉客户停止使用任务管理器 - 或 iTunes。 :-)
【解决方案3】:

我遇到了完全相同的问题。对于纯 Javascript,我将 onmousemove 替换为 onmouseover。对于 jQuery,我将 mousemove 替换为 mouseover。对我来说最快的修复。

【讨论】:

  • 如果您不需要 mousemove 事件,那就太好了。不幸的是,我需要鼠标移动,所以鼠标悬停没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2023-03-14
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多