MouseMove事件每秒重复一次

时间:2013-07-23 18:44:36

标签: javascript mousemove

http://jsfiddle.net/MrkY9/

我的电脑(到目前为止,我的同事中没有其他电脑)在Chrome,IE和Safari(但不是Firefox)中出现问题。简单的mousemove代码,例如以下代码(已在上面的小提琴上运行)正确捕获mousemove个事件,但只要鼠标位于div中,就会每次捕获mousemove个事件第二 - 即使我不再移动鼠标。

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

这似乎是一个基于浏览器的问题,因为它没有在FireFox上展示。 (它也不会出现在Windows本身。即使计数器正在上升,如果我单独留下键盘和鼠标,我的屏幕保护程序最终会启动。)在结束之前,这不是系统问题,我尝试更换鼠标并切换插入的USB端口。毫不奇怪,这些解决方案都没有解决问题。

我还没想出如何在浏览器中使用javascript以外的任何方式测试它。

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

3 个答案:

答案 0 :(得分:17)

好的,我发现了这个问题,但我并不完全理解为什么这是一个问题。

我在后台运行任务管理器。出于某种原因,每次更新时,都会导致IE,Safari和Chrome收到鼠标移动事件。

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

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

答案 1 :(得分:4)

对我来说,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.
});

(注意:最好使用带有touchmovetouches数组的changedTouches事件进行触摸手势。)

希望这可以帮助任何人遇到类似的问题。

修改:根据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.
});

答案 2 :(得分:0)

我遇到了同样的问题。对于纯Javascript,我用onmouseover替换了onmousemove。对于jQuery,我用mouseover替换了mousemove。最快的解决方法。