Pourquoi je ne peux pas capturer un événement mouseout?

J'ai besoin de savoir quand le curseur de la souris quitte un div. J'ai donc brancher le mouseout événement. Cependant, si je bouge la souris très rapidement la div, le mouseout événement ne pas le feu. C'est vrai: le curseur de la souris était rester assis à l'intérieur de la div, c'est maintenant à l'extérieur la div, et pourtant la mouseout de rappel n'a pas été appelée. (Il fonctionne très bien si je ne bouge pas la souris assez rapide.)

Cela est vrai dans le dernières versions de Google Chrome par le moyen – donc pas seulement un "vieux navigateurs" problème.

Une solution de contournement:

Une question à propos de ce problème a été posée avant. Apparemment c'est juste un fait de la vie, et la seule solution que j'ai trouvé est de surveiller manuellement mousemove événements, à chaque fois vérifier le curseur x/y de l'coordonne et de voir si elles entrent dans le div’s de la boîte englobante, de sorte que vous avez plus de chances de "préavis" si le curseur n'est plus à l'intérieur.

Au lieu de laisser le navigateur de faire tout cela en natif, effectuer des calculs sur chaque pixel se déplacer est un peu de performances. C'est aussi fastidieux de code.

À ma question...

Pourquoi ne peut pas le navigateur ne peut pas capturer l' mouseout événement? Si je peux dire de manière fiable lorsque la souris a gauche de la div à l'aide de la solution de contournement ci-dessus, pourquoi ne peut pas le navigateur le faire?

Je comprends (à partir de la réponse ci-dessus) que JavaScript n'essayez pas d'interpoler les "frames". Dire que si vous mettez un mousemove gestionnaire sur le document, et de déplacer rapidement la souris 200 pixels vers la droite dans une parfaite ligne horizontale, vous pourriez pas obtenir 200 mousemove événements. Quelques-être manqué. Je n'ai pas de problème avec ça.

Mais si certains pixels sont des mouvements de manquer tout comme la souris traverse la limite de la div, pourquoi est-ce que le mouseout événement devrait également être ignorés? Lorsque le navigateur commence enfin l'enregistrement de la position du curseur souris à nouveau (après un soudain mouvement rapide), même si la souris est maintenant miles en dehors de la boîte, le point est qu'il utilisé pour être dans la zone et n'est plus. Ainsi, pourquoi n'est-il pas alors le feu de l'événement mouseout alors?

Je ne vois pas pourquoi ce serait un problème difficile pour les fournisseurs de navigateur à résoudre. (Mais j'ai confiance il pourrait y avoir une bonne raison, que je suis trop stupide pour penser.)

Je poste cette question, surtout par curiosité, mais j'espère que la réponse pourrait donner quelques informations qui pourraient m'aider à contourner le problème plus efficacement. Aussi, les autres solutions de contournement (qui sont plus rapides que celui présenté ci-dessus) serait la bienvenue.

  • C'est d'absolument aucune aide pour vous (d'où un commentaire, plutôt qu'une réponse), mais que le comportement de la plupart semble certainement comme un bug. C'est aussi sans doute évident, mais pour répondre à votre question "pourquoi est-ce que l'événement mouseout devrait également être ignorés?", la réponse serait-il qu'elle ne l'est pas, car il est non-intentionnel du comportement.
  • Intéressant. C'est beaucoup de l'aide pour m'en fait – si vous avez raison, c'est un bug. Me semble étrange que ce genre de bug existe en Chrome 15 si! Je vais faire une page de test et de l'essayer dans d'autres navigateurs et de voir comment il est répandu. Et je pourrais soumettre un rapport de bogue crbug.com et voir ce qu'ils en font. Merci.
  • FYI: Chrome 15 n'est pas dans l'étable canal encore
  • vrai, mauvais exemple. Mais c'est aussi le cas avec google Chrome 11-14 (et probablement les versions antérieures) . Je vais voir si c'est le cas dans d'autres navigateurs (je vais devoir faire une nouvelle page de test tout d'abord, comme mon exemple est dans une extension Chrome).
  • Une solution de contournement qui le sera toujours (mais qui n'est pas le meilleur) est à l'aide de setInterval. Peu importe ce que les événements de me faire virer ou quoi bizarreries sur le navigateur, vous pouvez simplement cocher tout autant des millisecondes.
  • J'utilise jQuery fortement et écrire du code qui fait ce que vous décrivez assez souvent à l'aide .mouseleave api.jquery.com/mouseleave Vous pourriez essayer.
  • Parce que vous avez besoin mouseleave, mais ce n'est pas mis en œuvre dans Gecko et Webkit quirksmode.org/dom/events/#t017
  • Pourriez-vous poster un minimum de page qui illustre ce problème?
  • P. S. La question est lié à porte de ne jamais obtenir un mouseover ou un mouseout lorsque la souris passe sur un élément très rapidement (c'est à dire que le navigateur n'a jamais envisagé le curseur à être “plus” c'). Dans vos tests, le curseur de commencer à l'intérieur de l'élément?

InformationsquelleAutor callum | 2011-09-16