Est-il possible d'obtenir la position de la souris avec JavaScript après le chargement de la page sans aucun événement de mouvement de la souris (sans déplacer la souris)?
javascript
mouseevent
dom-events
Norbert Tamas
la source
la source
mousemove
événements.Réponses:
Vraie réponse: non, ce n'est pas possible.
OK, je viens de penser à un moyen. Superposez votre page avec un div qui couvre tout le document. À l'intérieur, créez (disons) 2 000 x 2 000
<a>
éléments (pour que la:hover
pseudo-classe fonctionne dans IE 6, voir), chaque taille de 1 pixel. Créez une:hover
règle CSS pour les<a>
éléments qui modifient une propriété (disonsfont-family
). Dans votre gestionnaire de charge, parcourez chacun des 4 millions d'<a>
éléments, en vérifiantcurrentStyle
/getComputedStyle()
jusqu'à ce que vous trouviez celui avec la police de survol. Extrapoler à partir de cet élément pour obtenir les coordonnées dans le document.NB NE FAITES PAS CELA .
la source
<a>
éléments couvrant des rectangles donnés (en utilisant le positionnement absolu d'<img>
éléments de taille , je suppose), rétrécissant les rectangles à chaque fois. Oui, c'est ridicule, mais il n'est pas possible d'obtenir ces informations avant le premier déplacement de la souris.Modifier 2020: Cela ne ne fonctionne plus. Il semble que les éditeurs de navigateurs aient corrigé cela. Parce que la plupart des navigateurs dépendent du chrome, il pourrait être dans son cœur.
Ancienne réponse: vous pouvez également accrocher mouseenter (cet événement est déclenché après le rechargement de la page, lorsque le curseur de la souris est à l'intérieur de la page). L'extension du code de Corrupted devrait faire l'affaire:
Vous pouvez également définir x et y à null sur mouseleave-event. Ainsi, vous pouvez vérifier si l'utilisateur est sur votre page avec son curseur.
la source
mouseleave
événement qui se déclenchex
ety
revenir ànull
ou'undefined'
Ce que vous pouvez faire est de créer des variables pour les
x
et lesy
coordonnées de votre curseur, les mettre à jour chaque fois que la souris se déplace et appeler une fonction sur un intervalle de faire ce que vous avez besoin avec la position mémorisée.L'inconvénient de cela est bien sûr qu'au moins un mouvement initial de la souris est nécessaire pour le faire fonctionner. Tant que le curseur met à jour sa position au moins une fois, nous pouvons retrouver sa position, qu'il se déplace à nouveau.
Le code précédent est mis à jour une fois par seconde avec un message indiquant où se trouve votre curseur. J'espère que ça aide.
la source
cursorX/Y
variables avant qu'un événement ne se produise.Vous pouvez essayer quelque chose de similaire à ce que Tim Down a suggéré - mais au lieu d'avoir des éléments pour chaque pixel sur l'écran, créez seulement 2 à 4 éléments (boîtes) et modifiez leur emplacement, largeur, hauteur dynamiquement pour diviser les emplacements encore possibles à l'écran par 2-4 récursivement, trouvant ainsi la position réelle de la souris rapidement.
Par exemple - les premiers éléments prennent la moitié droite et gauche de l'écran, ensuite la moitié supérieure et la moitié inférieure. A présent, nous savons déjà dans quel quart d'écran la souris se trouve, sommes capables de répéter - découvrez quel quart de cet espace ...
la source
La réponse de @Tim Down n'est pas efficace si vous effectuez un rendu de 2 000 x 2 000
<a>
éléments:Mais vous n'avez pas à rendre 4 millions d'éléments à la fois, utilisez plutôt la recherche binaire. Utilisez simplement 4
<a>
éléments à la place:<a>
éléments rectangulairesgetComputedStyle()
fonction, déterminez dans quel rectangle la souris survoleDe cette façon, vous devrez répéter ces étapes au maximum 11 fois, étant donné que votre écran n'est pas plus large que 2048 pixels.
Vous générerez donc au maximum 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 dites que la précision 10px est OK. Vous répéteriez les étapes au maximum 8 fois, vous devrez donc dessiner au maximum 8 x 4 = 32
<a>
éléments.De plus, la génération puis la destruction des
<a>
éléments ne sont pas performantes car le DOM est généralement lent. , Vous pouvez simplement réutiliser au lieu les 4 premiers<a>
éléments et d' ajuster leur justetop
,left
,width
etheight
que vous en boucle à travers les étapes.Maintenant, créer 4
<a>
est également exagéré. Au lieu de cela, vous pouvez réutiliser le même<a>
élément pour les testsgetComputedStyle()
dans chaque rectangle. Ainsi, au lieu de diviser la zone de recherche en 2 x 2<a>
éléments réutiliser un seul<a>
élément en le déplaçant avectop
etleft
propriétés de style.Donc, tout ce dont vous avez besoin est un seul
<a>
élément changer sonwidth
etheight
max 11 fois, et changer sontop
etleft
max 44 fois et vous aurez la position exacte de la souris.la source
La solution la plus simple mais pas 100% précise
Résultat:
{top: 148, left: 62.5}
Le résultat dépend de la taille de l'élément le plus proche et revient
undefined
lorsque l'utilisateur a changé l'ongletla source
undefined
quand même. Pouvez-vous nous expliquer comment l'utiliser?undefined
lorsque le curseur ne survolait aucun élément (ou lorsque le navigateur perdait le focus). Vous devrez peut-être définir un intervalle de temps si vous testez à partir de la console ..setTimeout
travaillé. J'utilisais jsfiddle et vous avez raison, il n'a jamais frappé un événement de survol car il redessine le DOM à chaque fois que vous cliquez sur jouer. Je recommanderais d'ajouter cette astuce pour les autres.J'imagine que vous avez peut-être une page parent avec un minuteur et après un certain temps ou une tâche terminée, vous transférez l'utilisateur vers une nouvelle page. Maintenant, vous voulez la position du curseur, et parce qu'ils attendent, ils ne touchent pas nécessairement la souris. Suivez donc la souris sur la page parent en utilisant des événements standard et passez la dernière valeur à la nouvelle page dans une variable get ou post.
Vous pouvez utiliser le code de JHarding sur votre page parent afin que la dernière position soit toujours disponible dans une variable globale:
Cela n'aidera pas les utilisateurs qui accèdent à cette page par d'autres moyens que votre page parent.
la source
J'ai implémenté une recherche horizontale / verticale, (faites d'abord une division pleine de liens de ligne verticale disposés horizontalement, puis faites une division pleine de liens de ligne horizontale disposés verticalement, et voyez simplement lequel a l'état de survol) comme l'idée de Tim Down ci-dessus, et ça marche assez vite. Malheureusement, ne fonctionne pas sur Chrome 32 sur KDE.
jsfiddle.net/5XzeE/4/
la source
Vous n'avez pas à déplacer la souris pour obtenir l'emplacement du curseur. L'emplacement est également signalé lors d'événements autres que le déplacement de la souris . Voici un événement de clic comme exemple:
la source
S'appuyant sur la réponse de @ SuperNova , voici une approche utilisant des classes ES6 qui garde le contexte
this
correct dans votre rappel:la source
Voici ma solution. Il exporte les propriétés window.currentMouseX et window.currentMouseY que vous pouvez utiliser n'importe où. Il utilise la position d'un élément survolé (le cas échéant) initialement et écoute ensuite les mouvements de la souris pour définir les valeurs correctes.
Composr CMS Source: https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a96748639ff41251R1202
la source
la source
Je pense que je peux avoir une solution raisonnable sans compter les divs et pixels..lol
Utilisez simplement un cadre d'animation ou un intervalle de temps d'une fonction. vous aurez toujours besoin d'un événement de souris une seule fois mais juste pour l'initier, mais techniquement vous le positionnez où bon vous semble.
Essentiellement, nous suivons un div factice à tout moment sans mouvement de souris.
Voici la logique ..
la source