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.
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.
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.
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.
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.)
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.
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With