La position de la souris est reportée sur l' eventobjet reçu par un gestionnaire pour l' mousemoveévénement, que vous pouvez attacher à la fenêtre (les bulles d'événement):
(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
}
})();
(Notez que le corps de celui- ifci ne fonctionnera que sur l'ancien IE.)
Exemple de ce qui précède en action - il dessine des points lorsque vous faites glisser votre souris sur la page. (Testé sur IE8, IE11, Firefox 30, Chrome 38.)
Si vous avez vraiment besoin d'une solution basée sur une minuterie, combinez-la avec certaines variables d'état:
(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
}
}
})();
Autant que je sache, vous ne pouvez pas obtenir la position de la souris sans avoir vu un événement, ce que cette réponse à une autre question de Stack Overflow semble confirmer.
Remarque : si vous comptez faire quelque chose toutes les 100 ms (10 fois / seconde), essayez de conserver le traitement que vous effectuez dans cette fonction très, très limitée . C'est beaucoup de travail pour le navigateur, en particulier les anciens Microsoft. Oui, sur les ordinateurs modernes, cela ne semble pas beaucoup, mais il se passe beaucoup de choses dans les navigateurs ... Ainsi, par exemple, vous pouvez garder une trace de la dernière position que vous avez traitée et libérer immédiatement le gestionnaire si la position n'a pas t changé.
eventobjet lorsque la fonction est appelée pour la deuxième fois. Vous devriez probablement écouter un événement plutôt que de l'utilisersetTimeout.