Est-il possible d'obtenir la position de la souris avec JavaScript après le chargement de la page sans événement de mouvement de la souris (sans déplacer la souris) ?
Réponses
Trop de publicités?Vous pourriez essayer quelque chose de similaire à ce que Tim Down a suggéré - mais au lieu d'avoir des éléments pour chaque pixel de l'écran, créez seulement 2-4 éléments (boîtes), et changez leur emplacement, largeur, hauteur dynamiquement pour diviser les emplacements encore possibles sur l'écran par 2-4 récursivement, trouvant ainsi l'emplacement réel de la souris rapidement.
Par exemple, les premiers éléments occupent les moitiés droite et gauche de l'écran, puis les moitiés supérieure et inférieure. A présent, nous savons déjà dans quel quart de l'écran se trouve la souris, nous pouvons répéter - découvrir quel quart de cet espace...
Voici ma solution. Elle exporte window.currentMouseX y window.currentMouseY des propriétés que vous pouvez utiliser partout. Il utilise initialement la position d'un élément survolé (le cas échéant) et écoute ensuite les mouvements de la souris pour définir les valeurs correctes.
(function () {
window.currentMouseX = 0;
window.currentMouseY = 0;
// Guess the initial mouse position approximately if possible:
var hoveredElement = document.querySelectorAll(':hover');
hoveredElement = hoveredElement[hoveredElement.length - 1]; // Get the most specific hovered element
if (hoveredElement != null) {
var rect = hoveredElement.getBoundingClientRect();
// Set the values from hovered element's position
window.currentMouseX = window.scrollX + rect.x;
window.currentMouseY = window.scrollY + rect.y;
}
// Listen for mouse movements to set the correct values
window.addEventListener('mousemove', function (e) {
window.currentMouseX = e.pageX;
window.currentMouseY = e.pageY;
}, /*useCapture=*/true);
}())
Composr CMS Source : https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a96748639ff41251R1202
J'ai implémenté une recherche horizontale/verticale, (d'abord faire une div pleine de liens de ligne verticale disposés horizontalement, puis faire une div pleine de liens de ligne horizontale disposés verticalement, et simplement voir lequel a l'état de survol) comme l'idée de Tim Down ci-dessus, et cela fonctionne assez rapidement. Malheureusement, cela ne fonctionne pas sur Chrome 32 sous KDE.
jsfiddle.net/5XzeE/4/
Vous ne devez pas déplacer la souris pour obtenir l'emplacement du curseur. L'emplacement est également signalé sur les événements autres que mousemove . Voici un clic-événement à titre d'exemple :
document.body.addEventListener('click',function(e)
{
console.log("cursor-location: " + e.clientX + ',' + e.clientY);
});
66 votes
Rien d'anormal avec l'événement de déplacement de la souris. Seulement, dans certains cas, les utilisateurs ne déplacent pas la souris. Merci pour votre réponse.
2 votes
Norbert Tamas, la réponse de @SuperNova (qui n'a été ajoutée que cette année) montre que le mouseenter fonctionne bien dans ce cas, car il se déclenche au chargement de la page (si la souris est dans la fenêtre d'affichage). Cela ne fonctionnait pas de cette façon en 2010, ou est-ce simplement que personne n'a pensé à l'essayer ?
1 votes
@CrescentFresh Dans certains cas (comme les userscripts), vous ne voulez pas ralentir le navigateur en ajoutant de nombreux
mousemove
événements.0 votes
Possible dans FF avec le mouseover, mais pas dans IE et Chrome.
0 votes
Ou, dans un jeu, votre caméra se déplace dans l'univers du jeu et le personnage regarde la souris (style typique des jeux de tir de haut en bas) mais si l'utilisateur ne bouge pas la souris, il se centre autour du mauvais point lorsque vous vous déplacez si vous ne comptez que sur le déplacement de la souris. Cependant, ce n'est pas un problème, nous stockons simplement les coordonnées "mondiales" du pointeur et laissons les gens les interroger.
0 votes
Pour améliorer les performances de cette solution * Créez un élément avec une hauteur de 1px et une largeur de 100% et ajoutez la pseudo-classe :hover * Effectuez un balayage à partir du haut du document, un pixel à la fois, pour trouver la position Y * Après avoir obtenu la coordonnée Y, effectuez le même balayage sur l'axe X (cette fois, l'élément peut être seulement de 1px x 1px).
0 votes
@Pawel Êtes-vous en train de dire que, lorsque vous déplacez l'élément, dès qu'il se trouve sous la souris, il peut déclencher un événement ? Dans la jsfiddle suivante, laissez la souris sous la barre noire et attendez que la barre noire passe en dessous sans bouger, et voyez que les événements mouseover et mouseenter ne se déclenchent pas. jsfiddle.net/bowp569a .
0 votes
@Pawel Voici le même effort en utilisant la fonction
:hover
pseudo-sélecteur, mais il ne fonctionne pas sans déplacement réel de la souris : jsfiddle.net/z9w20f53