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?Riffing sur La réponse de @SuperNova Voici une approche qui utilise les classes ES6 et qui conserve le contexte pour les éléments suivants this
correct dans votre rappel :
class Mouse {
constructor() {
this.x = 0;
this.y = 0;
this.callbacks = {
mouseenter: [],
mousemove: [],
};
}
get xPos() {
return this.x;
}
get yPos() {
return this.y;
}
get position() {
return `${this.x},${this.y}`;
}
addListener(type, callback) {
document.addEventListener(type, this); // Pass `this` as the second arg to keep the context correct
this.callbacks[type].push(callback);
}
// `handleEvent` is part of the browser's `EventListener` API.
// https://developer.mozilla.org/en-US/docs/Web/API/EventListener/handleEvent
handleEvent(event) {
const isMousemove = event.type === 'mousemove';
const isMouseenter = event.type === 'mouseenter';
if (isMousemove || isMouseenter) {
this.x = event.pageX;
this.y = event.pageY;
}
this.callbacks[event.type].forEach((callback) => {
callback();
});
}
}
const mouse = new Mouse();
mouse.addListener('mouseenter', () => console.log('mouseenter', mouse.position));
mouse.addListener('mousemove', () => console.log('mousemove A', mouse.position));
mouse.addListener('mousemove', () => console.log('mousemove B', mouse.position));
Pas la position de la souris, mais, si vous recherchez position actuelle du curseur (pour des cas d'utilisation tels que l'obtention du dernier caractère tapé, etc.), l'extrait ci-dessous fonctionne bien.
Cela vous donnera l'index du curseur lié au contenu du texte.
window.getSelection().getRangeAt(0).startOffset
J'imagine que vous avez peut-être une page parent avec une minuterie et qu'après un certain temps ou une tâche accomplie, vous faites passer l'utilisateur à 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 les événements standard et transmettez 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 :
var cursorX;
var cursorY;
document.onmousemove = function(e){
cursorX = e.pageX;
cursorY = e.pageY;
}
Cela n'aidera pas les utilisateurs qui naviguent vers cette page par d'autres moyens que votre page parent.
Je pense avoir trouvé une solution raisonnable sans compter les divs et les pixels lol
Il suffit d'utiliser un cadre d'animation ou un intervalle de temps d'une fonction. Vous aurez toujours besoin d'un événement de souris une fois, juste pour l'initier, mais techniquement, vous pouvez le positionner où vous voulez.
Essentiellement, nous suivons un div factice à tout moment, sans mouvement de souris.
// create a div(#mydiv) 1px by 1px set opacity to 0 & position:absolute;
Voici la logique
var x,y;
$('body').mousemove(function( e ) {
var x = e.clientX - (window.innerWidth / 2);
var y = e.clientY - (window.innerHeight / 2);
}
function looping (){
/* track my div position 60 x 60 seconds!
with out the mouse after initiation you can still track the dummy div.x & y
mouse doesn't need to move.*/
$('#mydiv').x = x; // css transform x and y to follow
$('#mydiv)'.y = y;
console.log(#mydiv.x etc)
requestAnimationFrame( looping , frame speed here);
}
- Réponses précédentes
- Plus de réponses
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