Jquery mouseenter () vs mouseover ()

172

Donc, après avoir lu une question récemment répondue, je ne sais pas si je comprends vraiment la différence entre mouseenter()et mouseover(). Le message déclare

MouseOver ():

Se déclenche en entrant dans un élément et à chaque fois que des mouvements de souris se produisent dans l'élément.

MouseEnter ():

Se déclenchera en entrant dans un élément.

J'ai trouvé un violon qui utilise les deux et ils semblent assez similaires. Quelqu'un peut-il m'expliquer la différence entre les deux?

J'ai également essayé de lire les définitions de JQuery, les deux disent la même chose.

L'événement mouseover est envoyé à un élément lorsque le pointeur de la souris entre dans l'élément

L'événement mouseenter est envoyé à un élément lorsque le pointeur de la souris entre dans l'élément.

Quelqu'un peut-il clarifier avec un exemple?

aziz punjani
la source
1
La démo dans la documentation le montre assez bien imo.
Felix Kling le
2
Il convient de noter que mouseenter et mouseleave étaient des événements propriétaires dans IE uniquement et émulés dans d'autres navigateurs par jQuery (ils semblent maintenant être dans la spécification bien qu'ils ne soient toujours pas implémentés dans d'autres navigateurs. Voir quirksmode.org/dom/events/mouseover.html )
Russ Cam du
1
Copie
Kaspar Lee

Réponses:

274

Vous voyez le comportement lorsque votre élément cible contient des éléments enfants:

http://jsfiddle.net/ZCWvJ/7/

Chaque fois que votre souris entre ou quitte un élément enfant, mouseoverse déclenche, mais pas mouseenter.

$('#my_div').bind("mouseover mouseenter", function(e) {
  var el = $("#" + e.type);
  var n = +el.text();
  el.text(++n);
});
#my_div {
  padding: 0 20px 20px 0;
  background-color: #eee;
  margin-bottom: 10px;
  width: 90px;
  overflow: hidden;
}

#my_div>div {
  float: left;
  margin: 20px 0 0 20px;
  height: 25px;
  width: 25px;
  background-color: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<div>MouseEnter: <span id="mouseenter">0</span></div>
<div>MouseOver: <span id="mouseover">0</span></div>

<div id="my_div">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

gilly3
la source
2
@psychobrm - Non Jouer avec ces deux démos qui ont également suivi l' mouseleaveévénement: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Si sur l' endroit où la même que la touche enter + congé, le nombre de plus serait la somme de les comptes pour entrer et sortir.
gilly3
1
y a-t-il une raison spécifique d'écrire var n = + el.text();au lieu de var n = el.text();? Je demande juste de la curiosité.
Fredrick Gauss
3
@FredrickGauss - J'utilise l' +opérateur pour forcer la chaîne renvoyée el.text()à un nombre. En ai-je besoin ? Non. Dans ce cas, l'instruction suivante qui utilise nle contraindrait également à un nombre. Alors, pourquoi l' ai-je utilisé? Je ne suis pas sûr ... c'était il y a 2 ans. C'est une bonne habitude. Cela rend mon intention explicite. J'avais probablement à l'origine n + 1avant de sauvegarder, mais j'ai décidé de réduire mon code de 2 caractères et de simplement l'utiliser ++n. n + 1ne pas contraindre nà un certain nombre, mais serait plutôt contraindre 1à une chaîne résultante en sortie, par exemple 0111111.
gilly3
2
@ gilly3 - merci pour l'explication détaillée de votre voyage dans l'esprit.
Fredrick Gauss
1
@ gilly3 Bon résumé, mais une amélioration mineure: "ou laisse un élément enfant" devrait être "ou laisse un élément enfant, étant donné qu'il y a un espace entre l'enfant et le parent. votre violon a une marge / remplissage, et donc c'est vrai que chaque fois que vous quittez l'élément enfant, vous obtenez un événement de survol de la souris, mais essayez-le sans remplissage / marge, et vous n'obtiendrez pas cet événement.
Israël
30

C'est l'un des meilleurs exemples que j'ai trouvés:

  • mouseenter
  • survol
  • souris
  • souris

http://bl.ocks.org/mbostock/5247027

Christophe
la source
L'exemple est plutôt cool, mais vous devez structurer un peu plus votre réponse pour être voté. N'oubliez pas que vous essayez de répondre à une question ... si vous n'avez que le lien, peut-être qu'un commentaire serait plus approprié. Si vous ne pouvez pas encore commenter en raison de votre réputation, gagnez-en quelques-uns et faites-le plus tard.
scristalli
En fait, j'aime vraiment cette réponse. Le demandeur a déjà donné les définitions de mouseover et mouseenter. Ils demandaient un exemple, et cet exemple montre comment ils fonctionnent beaucoup mieux que les autres exemples ici.
patorjk
La réponse de gilly3 a un défaut (voir mon commentaire). Même si elle n'est pas bien structurée, cette réponse indique une meilleure ressource.
Israël
14

Bien qu'ils fonctionnent de la même manière, l' mouseenterévénement ne se déclenche que lorsque le pointeur de la souris entre dans l'élément sélectionné . L' mouseoverévénement est déclenché si un pointeur de souris entre également des éléments enfants .

ErickBest
la source
3

Voir l'exemple de code et la démo au bas de la page de documentation jquery:

http://api.jquery.com/mouseenter/

... mouseover se déclenche également lorsque le pointeur se déplace dans l'élément enfant, tandis que mouseenter se déclenche uniquement lorsque le pointeur se déplace dans l'élément lié.

Willem
la source
3

L' événement mouseenter diffère du survol de la souris dans la façon dont il gère le bullage d'événement . L' événement mouseenter ne déclenche son gestionnaire que lorsque la souris entre dans l'élément auquel il est lié, pas dans un descendant . Reportez-vous: https://api.jquery.com/mouseenter/

L' événement mouseleave diffère de mouseout par la manière dont il gère le bullage d'événement . L' événement mouseleave ne déclenche son gestionnaire que lorsque la souris quitte l'élément auquel elle est liée, pas un descendant . Reportez-vous: https://api.jquery.com/mouseleave/

utilisateur2330678
la source
2

Cet exemple montre la différence entre les événements mousemove , mouseenter et mouseover :

https://jsfiddle.net/z8g613yd/

HTML:

<div onmousemove="myMoveFunction()">
    <p>onmousemove: <br> <span id="demo">Mouse over me!</span></p>
</div>

<div onmouseenter="myEnterFunction()">
    <p>onmouseenter: <br> <span id="demo2">Mouse over me!</span></p>
</div>

<div onmouseover="myOverFunction()">
    <p>onmouseover: <br> <span id="demo3">Mouse over me!</span></p>
</div>

CSS:

div {
    width: 200px;
    height: 100px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    padding: 30px;
    text-align: center;
    background-color: lightgray;
}

p {
    background-color: white;
    height: 50px;
}

p span {
    background-color: #86fcd4;
    padding: 0 20px;
}

JS:

var x = 0;
var y = 0;
var z = 0;

function myMoveFunction() {
    document.getElementById("demo").innerHTML = z += 1;
}

function myEnterFunction() {
    document.getElementById("demo2").innerHTML = x += 1;
}

function myOverFunction() {
    document.getElementById("demo3").innerHTML = y += 1;
}
  • onmousemove : se produit chaque fois que le pointeur de la souris est déplacé sur l'élément div.
  • onmouseenter : se produit uniquement lorsque le pointeur de la souris entre dans l'élément div.
  • onmouseover : se produit lorsque le pointeur de la souris entre dans l'élément div et ses éléments enfants (p et span).
Mourad El Aomari
la source
d'une manière ou d'une autre, jsfiddle est cassé en disant que les fonctions ne sont pas définies - je viens de bifurquer et de déplacer tous les js vers <script> jsfiddle.net/orc8empd
godblessstrawberry
0

Ancienne question, mais toujours pas de bonne réponse à jour avec perspicacité imo.

De nos jours, tous les navigateurs prennent en charge mouseover/mouseoutet mouseenter/mouseleave. Néanmoins, jQuery n'enregistre pas votre gestionnaire dans mouseenter/mouseleave, mais les place silencieusement sur un wrappers mouseover/mouseoutcomme le montre le code suivant et fait sa propre interprétation légèrement différente de mouseenter/mouseleave.

Le comportement exact des événements est particulièrement pertinent sur les «gestionnaires délégués». Malheureusement, jQuery a également sa propre interprétation différente de ce que sont les gestionnaires de délégués et de ce qu'ils devraient recevoir pour les événements. Ce fait est montré dans une autre réponse pour l'événement de clic plus simple.

Alors, comment répondre correctement à une question sur jQuery, qui utilise un libellé Javascript pour les événements et les gestionnaires, mais rend les deux différents et ne le mentionne même pas dans sa documentation?

Tout d'abord les différences dans le «vrai» Javascript:

  • tous les deux
    • la souris peut «sauter» des éléments extérieurs / extérieurs aux éléments intérieurs / intérieurs lorsqu'elle est déplacée plus rapidement que le navigateur échantillonne sa position
    • any enter/overobtient un correspondant leave/out(éventuellement en retard / nerveux)
    • les événements vont à l'élément visible sous le pointeur (invisible → ne peut pas être cible)
  • mouseenter/mouseleave
    • est livré à l'élément où enregistré (cible)
    • chaque fois que l'élément ou un descendant (par exemple en sautant) est entré / laissé
    • il ne peut pas bouillonner, car conceptuellement les descendants sont considérés comme faisant partie de l'élément en question, c'est-à-dire qu'il n'y a pas d'enfants d'où un autre événement pourrait provenir (avec le sens de «entré / laissé» le parent?!)
    • les enfants peuvent également avoir des gestionnaires similaires enregistrés, qui entrent / sortent correctement, mais sans rapport avec le cycle d'entrée / sortie des parents
  • mouseover/mouseout
    • la cible est l'élément réel sous le pointeur
      • une cible ne peut pas être deux choses: c'est-à-dire pas un parent et un enfant en même temps
    • l'événement ne peut pas «s'emboîter»
      • avant qu'un enfant puisse être «dépassé», le parent doit «sortir»
    • peut bouillonner, car target / relatedTarget indique où l'événement s'est produit

Après quelques tests, cela montre que tant que vous n'utilisez pas de «gestionnaires de délégués avec enregistrement de sélecteur» jQuery, l'émulation est inutile mais raisonnable: elle filtre les mouseover/mouseoutévénements que a mouseenter/mouseleaven'obtiendrait pas. La cible est cependant foirée. Le real mouseenter/mouseleavedonnerait l'élément handler comme cible, l'émulation pourrait indiquer les enfants de cet élément, c'est-à-dire quel que soit le mouseover/mouseoutporté.

Robert Siemer
la source