La posizione del mouse è riportata sul event sull'oggetto ricevuto da un gestore per l' mousemoveevento, che è possibile collegare alla finestra (bolle dell'evento):
(function() {
document.onmousemove = handleMouseMove;
function handleMouseMove(event) {
var eventDoc, doc, body;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
// Use event.pageX / event.pageY here
}
})();
(Si noti che il corpo di questo ifverrà eseguito solo su IE precedente.)
Esempio di quanto sopra in azione : disegna punti mentre trascini il mouse sulla pagina. (Testato su IE8, IE11, Firefox 30, Chrome 38.)
Se hai davvero bisogno di una soluzione basata sul timer, combinala con alcune variabili di stato:
(function() {
var mousePos;
document.onmousemove = handleMouseMove;
setInterval(getMousePosition, 100); // setInterval repeats every X ms
function handleMouseMove(event) {
var dot, eventDoc, doc, body, pageX, pageY;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
mousePos = {
x: event.pageX,
y: event.pageY
};
}
function getMousePosition() {
var pos = mousePos;
if (!pos) {
// We haven't seen any movement yet
}
else {
// Use pos.x and pos.y
}
}
})();
Per quanto ne so, non puoi ottenere la posizione del mouse senza aver visto un evento, qualcosa a cui questa risposta ad un'altra domanda Stack Overflow sembra confermare.
Nota a margine : se hai intenzione di fare qualcosa ogni 100 ms (10 volte / secondo), prova a mantenere l'elaborazione effettiva che svolgi in quella funzione molto, molto limitata . Questo è molto lavoro per il browser, in particolare quelli più vecchi di Microsoft. Sì, sui computer moderni non sembra molto, ma c'è molto da fare nei browser ... Quindi, ad esempio, potresti tenere traccia dell'ultima posizione che hai elaborato e salvarti immediatamente dal gestore se la posizione non ha ' è cambiato.
eventoggetti quando la funzione viene chiamata per la seconda volta. Probabilmente dovresti ascoltare qualche evento che usaresetTimeout.