Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MouseMove event repeating every second

http://jsfiddle.net/MrkY9/

My computer (and so far, no other computer among my coworkers) is exhibiting an issue in Chrome, IE, and Safari (but not in Firefox). Simple mousemove code, such as the following (already running on the fiddle above) properly catches mousemove events, but then as long as the mouse is in the div, catches a mousemove event every second - even though I'm no longer moving the mouse.

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

This seems to be a browser-based problem, since it doesn't exhibit on FireFox. (Nor does it occur on Windows itself. Even when the counter is going up, if I leave my keyboard and mouse alone, my screen saver eventually kicks in.) Before concluding it's not a system issue, I tried replacing the mouse and switching the USB port it's plugged into. Not surprisingly, none of those solutions resolve the issue.

I haven't figured out how to test this in anything other than javascript in a browser.

Questions: Has anyone encountered this before? Is there anything I need to do to catch it? I have code far less trivial than this fiddle that rely on knowing when the mouse is and isn't moving.

like image 796
Scott Mermelstein Avatar asked Jul 23 '13 18:07

Scott Mermelstein


People also ask

How often does Mousemove event fire?

What is Mousemove event in Javascript? The mousemove event occurs whenever the mouse pointer moves within the selected element. The mousemove() method triggers the mousemove event, or attaches a function to run when a mousemove event occurs. Note: Each time a user moves the mouse one pixel, a mousemove event occurs.

How does Mousemove work?

MouseMove is a simple event that is executed when a pointer is moving over or around an element. Mousemove is a javascript event that inside a web page. The mousemove event can also be understood as a part of an event handler, whereupon some action or movement by a mouse pointer, an intended script is executed.

What is Mousemove event in Javascript?

The mousemove event is fired at an element when a pointing device (usually a mouse) is moved while the cursor's hotspot is inside it.


2 Answers

Ok, I found the problem, though I don't fully understand why it was an issue.

I had Task Manager running in the background. And for some reason, every time it updated itself, it was causing IE, Safari and Chrome to receive a mousemove event.

It doesn't make sense, but at least the fix is simple: close the Task Manager.

(It's very obvious if you are in the Applications tab. If you're in Performance, it depends on what the values are set to.)

like image 159
Scott Mermelstein Avatar answered Nov 15 '22 18:11

Scott Mermelstein


For me the issue happens sometimes when iTunes is playing. I know iTunes (for Windows) has had a focus issue for ages - it tends to steal focus from its own popup windows.

You pointed out the problem in your (accepted) answer: other applications can steal the browser's focus, firing the mousemove event at will. However for a live website we cannot assume a user is not running certain programs like Task Manager or iTunes.

As suggested in the question's comment section, please save the mouse position and keep checking if it changed.

Example code using 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.
});

(Note: you're better off using the touchmove event with the touches and changedTouches arrays for touch gestures.)

Hope this helps anyone bumping into similar problems.

Edit: additional functionality to separate mouse events from touch events based on Scott's comment below:

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.
});
like image 43
Robbert Avatar answered Nov 15 '22 20:11

Robbert