La posición del mouse se informa sobre el event
objeto recibido por un controlador para el mousemove
evento, que puede adjuntar a la ventana (el evento burbujea):
(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
}
})();
(Tenga en cuenta que el cuerpo de eso if
solo se ejecutará en IE antiguo).
Ejemplo de lo anterior en acción : dibuja puntos mientras arrastra el mouse sobre la página. (Probado en IE8, IE11, Firefox 30, Chrome 38.)
Si realmente necesita una solución basada en temporizador, combine esto con algunas variables de estado:
(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
}
}
})();
Hasta donde sé, no puede obtener la posición del mouse sin haber visto un evento, algo que esta respuesta a otra pregunta de Stack Overflow parece confirmar.
Nota al margen : si va a hacer algo cada 100 ms (10 veces / segundo), intente mantener el procesamiento real que realiza en esa función muy, muy limitado . Eso es mucho trabajo para el navegador, particularmente los más antiguos de Microsoft. Sí, en las computadoras modernas no parece mucho, pero están sucediendo muchas cosas en los navegadores ... Entonces, por ejemplo, puede realizar un seguimiento de la última posición que procesó y abandonar el controlador inmediatamente si la posición no ha cambiado. t cambiado.
event
objeto cuando se llame a la función por segunda vez. Probablemente deberías escuchar algún evento que usarsetTimeout
.