248 votes

Javascript - Suivre la position de la souris

Je suis l'espoir de suivre la position du curseur de la souris, périodiquement toutes les t mseconds. Donc, essentiellement, lorsqu'un chargement de la page - ce tracker doit commencer et pour (dire) toutes les 100 ms, je devrais obtenir la nouvelle valeur de posX et posY et imprimer le formulaire.

J'ai essayé le code suivant - mais les valeurs ne se rafraîchir uniquement les valeurs initiales de posX et posY présentent sous la forme de boîtes. Des idées sur comment je peux obtenir cette place et en cours d'exécution ?

<html>
<head>
<title> Track Mouse </title>
<script type="text/javascript">
function mouse_position()
{
    var e = window.event;

    var posX = e.clientX;
    var posY = e.clientY;

    document.Form1.posx.value = posX;
    document.Form1.posy.value = posY;

    var t = setTimeout("mouse_position()",100);

}
</script>

</head>

<body onload="mouse_position()">
<form name="Form1">
POSX: <input type="text" name="posx"><br>
POSY: <input type="text" name="posy"><br>
</form>
</body>
</html>

247voto

T.J. Crowder Points 285826

La position du curseur souris est signalé sur l' event objet reçu par un gestionnaire pour l' mousemove événement, que vous pouvez attacher à la fenêtre (l'événement bulles):

(function() {
    document.onmousemove = handleMouseMove;
    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 );
        }

        // Use event.pageX / event.pageY here
    }
})();

(À noter que le corps de l' if ne fonctionnera que sur les vieux IE.)

Exemple de la ci-dessus en action - il attire les points que vous faites glisser votre souris sur la page. (Testé sur IE8, IE11, Firefox 30, Chrome 38.)

Si vous avez vraiment besoin d'une minuterie à base de solution, vous combinez cela 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, quelque chose qui cette réponse à un autre Débordement de Pile question semble le confirmer.

Remarque: Si vous allez faire quelque chose tous les 100 ms (10 fois/seconde), essayez de garder le traitement réel-vous dans cette fonction très, très limité. C'est beaucoup de travail pour le navigateur, en particulier les plus âgés de Microsoft. Oui, sur les ordinateurs modernes, il ne semble pas comme beaucoup, mais il se passe beaucoup de choses dans les navigateurs... Si par exemple, vous pouvez garder une trace de la dernière position de traitement et de caution à partir du gestionnaire immédiatement si la position n'a pas changé.

74voto

solendil Points 5098

Voici une solution, basée sur jQuery et un événement de souris à l'écoute (ce qui est beaucoup mieux qu'une interrogation régulière) sur le corps:

$("body").mousemove(function(e) {
    document.Form1.posx.value = e.pageX;
    document.Form1.posx.value = e.pageY;
})

0voto

Matt Tew Points 1347

Vous êtes presque sur la bonne voie, mais au lieu de mettre à jour l'emplacement chaque fois que la souris bouge, plutôt que sur une minuterie.

0voto

Mark Points 1
<html >
<head>
<title></title>
</head>
<body onLoad="Init()">
<script type="text/javascript">
function Init() {
 document.body.onmousemove = getMouseLoc;
}
function getMouseLoc(){CurLoc.innerHTML = "Y:"+window.event.clientY+"&nbsp;"+"X:"+window.event.clientX}
</script>
<div align="center"><span id="CurLoc"></span></div>
</body>
</html>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X