Jquery mouseenter () vs mouseover ()

172

Nachdem ich eine kürzlich beantwortete Frage gelesen habe, ist mir unklar, ob ich den Unterschied zwischen mouseenter()und wirklich verstehe mouseover(). Die Post sagt

MouseOver ():

Wird beim Betreten eines Elements und immer dann ausgelöst, wenn Mausbewegungen innerhalb des Elements auftreten.

MouseEnter ():

Wird beim Betreten eines Elements ausgelöst.

Ich habe mir eine Geige ausgedacht , die beide verwendet, und sie scheinen ziemlich ähnlich zu sein. Kann mir bitte jemand den Unterschied zwischen den beiden erklären?

Ich habe auch versucht, die JQuery-Definitionen zu lesen, beide sagen dasselbe.

Das Mouseover-Ereignis wird an ein Element gesendet, wenn der Mauszeiger das Element betritt

Das Mouseenter-Ereignis wird an ein Element gesendet, wenn der Mauszeiger das Element betritt.

Kann jemand bitte mit einem Beispiel klären?

Aziz Punjani
quelle
1
Die Demo in der Dokumentation zeigt es ganz gut imo.
Felix Kling
2
Es ist erwähnenswert, dass mouseenter und mouseleave nur im IE proprietäre Ereignisse waren und von jQuery in anderen Browsern emuliert wurden (sie scheinen jetzt in der Spezifikation zu sein, obwohl sie in anderen Browsern noch nicht implementiert sind. Siehe quirksmode.org/dom/events/mouseover.html ).
Russ Cam

Antworten:

274

Sie sehen das Verhalten, wenn Ihr Zielelement untergeordnete Elemente enthält:

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

Jedes Mal, wenn Ihre Maus ein untergeordnetes Element betritt oder verlässt, mouseoverwird dies ausgelöst, jedoch nicht 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
quelle
2
@psychobrm - Nein Spielen Sie mit diesen beiden Demos , die auch die Spur mouseleaveEreignis: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 mehr als wäre die Summe Wenn darüber , wo die gleichen wie eingeben + Urlaubs, dann die Zählung die Zählungen für betreten und verlassen.
Gilly3
1
Gibt es einen bestimmten Grund, var n = + el.text();statt zu schreiben var n = el.text();? Ich bitte nur um Neugier.
Fredrick Gauss
3
@FredrickGauss - Ich verwende den +Operator, um die zurückgegebene Zeichenfolge el.text()in eine Zahl zu zwingen . Habe ich brauche zu? Nein. In diesem Fall würde die nächste verwendete Anweisung nsie auch zu einer Zahl zwingen. Also, warum habe ich es benutzt? Ich bin mir nicht sicher ... das war vor 2 Jahren. Es ist eine gute Angewohnheit. Es macht meine Absicht explizit. Wahrscheinlich hatte ich ursprünglich n + 1vor dem Speichern, aber beschlossen, meinen Code um 2 Zeichen zu verkleinern und nur zu verwenden ++n. n + 1würde nichtn zu einer Zahl zwingen , sondern 1zu einer Zeichenfolge, die zur Ausgabe von z 0111111.
Gilly3
2
@ gilly3 - danke für die ausführliche Erklärung deiner Reise im Kopf.
Fredrick Gauss
1
@ gilly3 Gute Zusammenfassung, aber eine kleine Verbesserung: "oder hinterlässt ein untergeordnetes Element" sollte sein "oder hinterlässt ein untergeordnetes Element, da zwischen dem Kind und dem Elternteil eine Lücke besteht. Ihre Geige hat einen Rand / eine Polsterung, und daher ist es wahr Wenn Sie das untergeordnete Element verlassen, erhalten Sie ein Mouseover-Ereignis, aber versuchen Sie es ohne Auffüllen / Ränder, und Sie erhalten dieses Ereignis nicht.
Israel
30

Dies ist eines der besten Beispiele, die ich gefunden habe:

  • mouseenter
  • Mouseover
  • Mouseout
  • Mausblatt

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

Christopher
quelle
Das Beispiel ist ziemlich cool, aber Sie müssen Ihre Antwort ein bisschen mehr strukturieren, um positiv bewertet zu werden. Denken Sie daran, dass Sie versuchen, eine Frage zu beantworten. Wenn Sie nur den Link haben, ist möglicherweise ein Kommentar angemessener. Wenn Sie aufgrund Ihres Rufs noch keinen Kommentar abgeben können, gewinnen Sie einen und tun Sie es später.
Scristalli
Eigentlich mag ich diese Antwort wirklich. Der Fragesteller gab bereits die Definitionen von mouseover und mouseenter an. Sie fragten nach einem Beispiel, und dieses Beispiel zeigt, wie sie viel besser funktionieren als die anderen Beispiele hier.
Patorjk
Die Antwort von gilly3 hat einen Fehler (siehe meinen Kommentar). Obwohl nicht gut strukturiert, weist diese Antwort auf eine bessere Ressource hin.
Israel
14

Obwohl sie auf die gleiche Weise funktionieren, wird das mouseenterEreignis nur ausgelöst, wenn der Mauszeiger in das ausgewählte Element eintritt . Das mouseoverEreignis wird ausgelöst, wenn ein Mauszeiger auch untergeordnete Elemente eingibt .

ErickBest
quelle
3

Siehe den Beispielcode und die Demo am Ende der jquery-Dokumentationsseite:

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

... Mouseover wird ausgelöst, wenn sich der Zeiger ebenfalls in das untergeordnete Element bewegt, während Mouseenter nur ausgelöst wird, wenn sich der Zeiger in das gebundene Element bewegt.

Willem
quelle
3

Das Mouseenter- Ereignis unterscheidet sich vom Mouseover in der Art und Weise, wie es mit Ereignisblasen umgeht . Das mouseenter- Ereignis löst seinen Handler nur aus, wenn die Maus das Element betritt, an das sie gebunden ist, und keinen Nachkommen . Siehe: https://api.jquery.com/mouseenter/

Das Mouseleave- Ereignis unterscheidet sich vom Mouseout in der Art und Weise, wie es mit dem Sprudeln von Ereignissen umgeht . Das Mouseleave- Ereignis löst seinen Handler nur aus, wenn die Maus das Element verlässt, an das sie gebunden ist, und keinen Nachkommen . Siehe: https://api.jquery.com/mouseleave/

user2330678
quelle
2

Dieses Beispiel zeigt den Unterschied zwischen den Ereignissen mousemove , mouseenter und 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 : tritt jedes Mal auf, wenn der Mauszeiger über das div-Element bewegt wird.
  • onmouseenter : tritt nur auf, wenn der Mauszeiger das div-Element betritt.
  • onmouseover : tritt auf, wenn der Mauszeiger in das div-Element und seine untergeordneten Elemente (p und span) eingeht.
Mourad El Aomari
quelle
irgendwie ist jsfiddle kaputt und sagt, funcitons sind undefiniert - ich habe gerade alle js gegabelt und auf jsfiddle.net/orc8empd <script> verschoben
godblessstrawberry
0

Alte Frage, aber immer noch keine gute aktuelle Antwort mit Insight Imo.

Heutzutage unterstützen alle Browser mouseover/mouseoutund mouseenter/mouseleave. Trotzdem registriert jQuery Ihren Handler nicht bei mouseenter/mouseleave, sondern legt ihn stillschweigend auf einen Wrapper, mouseover/mouseoutwie der folgende Code zeigt, und interpretiert ihn leicht anders mouseenter/mouseleave.

Das genaue Verhalten von Ereignissen ist besonders für „Delegate-Handler“ relevant. Leider hat jQuery auch eine andere Interpretation dessen, was Delegiertenhandler sind und was sie für Ereignisse erhalten sollten. Diese Tatsache wird in einer anderen Antwort für das einfachere Klickereignis gezeigt.

Wie kann man also eine Frage zu jQuery richtig beantworten, das Javascript-Formulierungen für Ereignisse und Handler verwendet, aber beide unterscheidet und dies in seiner Dokumentation nicht einmal erwähnt?

Zuerst die Unterschiede in "echtem" Javascript:

  • beide
    • Die Maus kann von äußeren / äußeren Elementen zu inneren / innersten Elementen „springen“, wenn sie schneller bewegt wird, als der Browser seine Position abtastet
    • Jeder enter/overbekommt eine entsprechende leave/out(möglicherweise spät / nervös)
    • Ereignisse gehen zum sichtbaren Element unter dem Zeiger (unsichtbar → kann kein Ziel sein)
  • mouseenter/mouseleave
    • wird an das Element geliefert, an dem es registriert ist (Ziel)
    • wann immer das Element oder ein Nachkomme (z. B. durch Springen) eingegeben / verlassen wird
    • es kann nicht sprudeln, weil die Nachkommen konzeptionell als Teil des fraglichen Elements betrachtet werden, dh es gibt keine Kinder, von denen ein anderes Ereignis kommen könnte (mit der Bedeutung von "eingegeben / verlassen" der Elternteil?!)
    • Bei Kindern sind möglicherweise auch ähnliche Handler registriert, die korrekt ein- / ausgehen, jedoch nicht mit dem Ein- / Ausstiegszyklus der Eltern zusammenhängen
  • mouseover/mouseout
    • Das Ziel ist das eigentliche Element unter dem Zeiger
      • Ein Ziel kann nicht zwei Dinge sein: dh nicht Eltern und Kind gleichzeitig
    • Das Ereignis kann nicht „nisten“.
      • Bevor ein Kind „überfordert“ werden kann, muss der Elternteil „raus“.
    • kann sprudeln, da target / relatedTarget angibt, wo das Ereignis aufgetreten ist

Nach einigen Tests zeigt sich, dass die Emulation unnötig, aber vernünftig ist, solange Sie jQuery nicht verwenden, um Handler mit Selektorregistrierung zu delegieren: Sie filtert mouseover/mouseoutEreignisse heraus, die a mouseenter/mouseleavenicht erhalten würde. Das Ziel ist jedoch durcheinander. Der Real mouseenter/mouseleavewürde das Handler-Element als Ziel angeben, die Emulation könnte Kinder dieses Elements anzeigen, dh was auch immer das mouseover/mouseoutgetragen wird.

Robert Siemer
quelle