Comment obtenir la position de la souris sans événements (sans déplacement de la souris)?
Est-il possible d'obtenir la position de la souris avec JavaScript après le chargement de la page, sans aucun mouvement de la souris de l'événement (sans déplacement de la souris)?
- Nope! Pourquoi? Quel est le problème avec l'accrochage de la
mousemove
événement? - Rien de mal avec l'événement mousemove. Seulement dans certains cas, les utilisateurs ne bougez pas la souris. Merci pour votre réponse.
- Norbert Tamas, @SuperNova de réponse (qui n'a pas été ajoutés jusqu'à cette année) montre que mouseenter fonctionne très bien pour cette raison qu'il tire sur le chargement de la page (si la souris est dans la fenêtre d'affichage). N'est-ce pas ainsi que fonctionnent en 2010, ou est-il juste que personne n'ait pensé à l'essayer?
- Dans certains cas (comme les userscripts) vous ne voulez pas ralentir le navigateur en ajoutant de nombreux
mousemove
événements. - Possible dans FF avec la souris, mais ce n'est pas dans IE et Chrome.
- Ou, dans un jeu, votre caméra se déplace autour de l'univers du jeu et le personnage est à la recherche à la souris (type top-down shooter style), mais si l'utilisateur n'a pas de déplacer une souris, il s'articule autour d'un mauvais point de vous déplacer si vous comptez uniquement sur mousemove. Cependant, ce n'est pas une grosse affaire, nous venons de le stocker dans le "monde" coordonnées du pointeur de la souris et de laisser les gens requête.
- Pour améliorer les performances de cette solution * Créer un élément avec 1px de hauteur et de largeur 100% et d'ajouter :hover pseudo-classe * Numérisation à partir du haut du document, un pixel à la fois pour trouver la position Y * Après coordonnée Y faire de l'analyse sur l'axe des X (cette fois, l'élément peut être seulement 1px 1px x)
Vous devez vous connecter pour publier un commentaire.
Vraie réponse: Non, il n'est pas possible.
OK, j'ai juste pensé à un moyen. La superposition de votre page avec un div qui couvre l'ensemble du document. À l'intérieur, créer (dire) de 2 000 x 2 000
<a>
éléments (de sorte que le:hover
pseudo-classe travail dans IE 6, voir), chaque 1 pixel de taille. Créer un CSS:hover
règle pour ceux qui<a>
éléments qui modifie une propriété (disonsfont-family
). Dans votre gestionnaire de chargement, cycle de par chacune des 4 millions de<a>
éléments, la vérification decurrentStyle
/getComputedStyle()
jusqu'à ce que vous trouver celui avec le hover de la police. Extrapoler de retour de cet élément pour obtenir les coordonnées dans le document.N. B. NE PAS faire CETTE.
<a>
éléments couvrant donné des rectangles (en utilisant le positionnement absolu de taille<img>
éléments, je suppose), le rétrécissement des rectangles à chaque fois. Oui, c'est ridicule, mais le fait de ne pas être en mesure d'obtenir cette info avant de la première mousemove.Vous pouvez également brancher mouseenter (cet événement est déclenché après rechargement de la page, lorsque le mousecursor est à l'intérieur de la page). L'extension Corrompu du code devrait faire l'affaire:
JS:
Vous pouvez également définir x et y à null dans mouseleave-événement. Ainsi, vous pouvez vérifier si l'utilisateur est sur votre page c'est avec le curseur.
mouseleave
événement qui définitx
ety
retour ànull
ou'undefined'
mouseenter
nimousemove
le feu sur la page de chargement, même si le curseur est à l'intérieur de la page. Voir ma réponse pour une meilleure solution: stackoverflow.com/a/52141050/362006Ce que vous pouvez faire est de créer des variables pour le
x
ety
coordonnées de votre curseur, les mettre à jour à chaque fois que la souris bouge et appeler une fonction sur un intervalle de temps pour faire ce dont vous avez besoin avec la position enregistrée.L'inconvénient de cette approche est qu'au moins un premier mouvement de la souris est nécessaire pour qu'il fonctionne. Tant que le curseur se met à jour sa position au moins une fois, nous sommes en mesure de trouver sa position, indépendamment de savoir si il se déplace à nouveau.
Le code précédent mises à jour une fois par seconde avec un message de l'endroit où votre curseur est. J'espère que cette aide.
cursorX/Y
variable avant de tout événement se produit.Vous pouvez essayer quelque chose de semblable à ce que Tim Bas a suggéré, mais au lieu d'avoir des éléments pour chaque pixel sur l'écran, créer 2 à 4 éléments (les boîtes), et de changer leur emplacement, la largeur, la hauteur dynamiquement pour diviser encore possible endroits sur l'écran de 2 à 4 de manière récursive, donc trouver la souris à l'emplacement réel rapidement.
Par exemple - premiers éléments, prendre à droite et la moitié gauche de l'écran, ensuite la partie supérieure et la moitié inférieure. Maintenant, nous savons déjà où trimestre de l'écran, la souris est situé, sont en mesure de répéter - découvrir trimestre de cet espace...
@Tim vers le Bas la réponse n'est pas performant si vous effectuez le rendu de 2 000 x 2 000
<a>
éléments:Mais vous n'avez pas à rendre de 4 millions d'éléments à la fois, au lieu d'utiliser la recherche binaire. Suffit d'utiliser 4
<a>
éléments à la place:<a>
élémentsgetComputedStyle()
fonction de déterminer dans quel rectangle souris survoleDe cette façon, vous devez répéter ces étapes max 11 fois, compte tenu de votre écran n'est pas plus large que 2048px.
De sorte que vous allez générer max 11 x 4 = 44
<a>
éléments.Si vous n'avez pas besoin de déterminer la position de la souris exactement à un pixel, mais dire 10px précision est OK. Vous devez répéter les étapes à plus de 8 fois, de sorte que vous devez dessiner max 8 x 4 = 32
<a>
éléments.Également de générer puis de détruire la
<a>
éléments n'est pas performat que DOM est généralement lente. Au lieu de cela, vous pouvez réutiliser les 4 premiers<a>
éléments et il suffit de régler leurstop
,left
,width
etheight
en boucle à travers les étapes.Maintenant, la création de 4
<a>
est un overkill ainsi. Au lieu de cela, vous pouvez réutiliser le même<a>
élément lors des tests pourgetComputedStyle()
dans chaque rectangle. Donc, au lieu de la division de la zone de recherche en 2 x 2<a>
éléments de réutiliser une seule<a>
élément en le déplaçant avectop
etleft
propriétés de style.Donc, vous n'avez besoin que d'un seul
<a>
élément de changer sonwidth
etheight
max 11 fois, et de modifier sontop
etleft
max 44 fois et vous aurez l'exacte position de la souris.J'imagine que vous avez peut-être un parent de la page avec une minuterie et d'après un certain laps de temps ou une tâche est terminée, vous rediriger l'utilisateur vers une nouvelle page. Maintenant, vous voulez la position du curseur, et parce qu'ils sont en attente, ils ne sont pas nécessairement toucher à la souris. Donc la piste de la souris sur la page parent, en utilisant la norme d'événements et de passer à la dernière valeur de la nouvelle page dans un get ou un post variable.
Vous pouvez utiliser JHarding code sur votre page parent, de sorte que la dernière position est toujours disponible dans une variable globale:
Cela ne va pas aider les utilisateurs à naviguer vers cette page par d'autres moyens que votre page parent.
La solution la plus simple mais pas précis à 100%
Résultat:
{top: 148, left: 62.5}
Le résultat dépend de l'élément le plus proche de la taille et de retour
undefined
lorsque l'utilisateur a basculé l'ongletundefined
indépendamment. Pouvez-vous expliquer comment l'utiliser?undefined
lorsque le curseur n'était pas en vol stationnaire tout élément (ou lorsque le navigateur perdu le focus). Vous devrez peut-être définir un intervalle de temps si vous faites des tests à partir de la console..setTimeout
travaillé. J'ai été en utilisant jsfiddle et vous avez raison, il ne faut pas frapper un hover car elle redessine les DOM chaque fois que vous cliquez sur jouer. Je recommande l'ajout de cet indicateur pour les autres.J'ai mis en place une horizontale/verticale de recherche, (d'abord faire un div complète de la ligne verticale liens disposés horizontalement, puis faire un div complète de la ligne horizontale des liens disposées verticalement, et il suffit de voir que l'on a l'état de pointage), comme Tim Bas de l'idée ci-dessus, et il fonctionne assez rapidement. Malheureusement, ne fonctionne pas sur Chrome 32 sur KDE.
jsfiddle.net/5XzeE/4/
Vous n'avez pas à déplacer de la souris pour obtenir l'emplacement du curseur. L'emplacement est également signalé sur d'autres événements que mousemove. Voici un cliquez sur l'événement comme un exemple:
Voici ma solution. Il exportations fenêtre.currentMouseX et fenêtre.currentMouseY propriétés que vous pouvez utiliser n'importe où. Il utilise la position d'un plané élément (le cas échéant) dans un premier temps et par la suite l'écoute des mouvements de la souris pour définir les valeurs correctes.
Composr CMS Source: https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a96748639ff41251R1202
Riffs sur @SuperNova réponse, voici une approche à l'aide ES6 classes qui maintient le contexte pour
this
correct dans votre rappel:JS:
Je pense que j'ai peut-être une solution raisonnable avec le comptage des divs et les pixels..lol
Simplement utiliser l'animation image ou un intervalle de temps d'une fonction. vous aurez toujours besoin d'un événement de souris une seule fois mais juste pour lancer, mais techniquement, vous de la position de cette où vous le souhaitez.
Essentiellement, nous sommes sur les traces d'un mannequin div en tout temps avec le mouvement de la souris.
Ci-dessous est la logique..