Was ist der Unterschied zwischen Mouseover- und Mouseenter-Ereignissen?

152

Ich habe das mouseoverEreignis immer verwendet , aber beim Lesen der jQuery-Dokumentation habe ich gefunden mouseenter. Sie scheinen genau gleich zu funktionieren.

Gibt es einen Unterschied zwischen den beiden und wenn ja, wann sollte ich sie verwenden?
(Gilt auch für mouseoutvs mouseleave).

informatik01
quelle

Antworten:

117

Sie können das folgende Beispiel auf der jQuery-Dokumentseite ausprobieren . Es ist eine nette kleine, interaktive Demo, die es sehr deutlich macht und Sie selbst sehen können.

Kurz gesagt, Sie werden feststellen, dass ein Mouse-Over-Ereignis für ein Element auftritt, wenn Sie sich darüber befinden - entweder von seinem untergeordneten oder seinem übergeordneten Element. Ein Mauseingabeereignis tritt jedoch nur auf, wenn sich die Maus von außerhalb dieses Elements zu diesem Element bewegt.

Oder wie die mouseover()Dokumente es ausdrücken:

[ .mouseover()] kann aufgrund von Ereignisblasen viele Kopfschmerzen verursachen. Wenn sich der Mauszeiger in diesem Beispiel beispielsweise über das innere Element bewegt, wird ein Mouseover-Ereignis an dieses Element gesendet, das dann auf Outer übertragen wird. Dies kann unseren gebundenen Mouseover-Handler zu ungünstigen Zeiten auslösen. In der Diskussion finden Sie .mouseenter()eine nützliche Alternative.

Keith Bentrup
quelle
39
Es ist nicht wahr, dass mouseenter"nur auftritt, wenn sich die Maus vom übergeordneten Element zum Element bewegt". Das Ereignis tritt auf, wenn die Maus von außerhalb des Elements zu innerhalb des Elements wechselt. Es spielt keine Rolle, von welchem ​​Element die Maus stammt. Es ist wahr, dass die Maus oft vom Elternteil kommt, aber nicht immer. Wenn der Elternteil beispielsweise keine Polsterung oder Umrandung hat, kann die Maus direkt vom Großelternteil eintreten und mouseenterwird trotzdem feuern. Tatsächlich kann das Element sogar von außerhalb des Ansichtsfensters eingegeben werden (wenn sich das Element direkt am Rand befindet), und das Ereignis wird weiterhin ausgelöst.
Callum
2
DEMO ist die beste Erklärung;)
Luckylooke
Spielen Sie einfach mit der Demo herum.
Kevin Wheeler
43

Mouseenter und Mouseleave reagieren nicht auf Ereignisblasen, während Mouseover und Mouseout dies tun .

Hier ist ein Artikel , der das Verhalten beschreibt.

Joseph
quelle
6
Dies erklärt es perfekt: bl.ocks.org/mbostock/5247027 mouseover wird jedes Mal ausgelöst, wenn es aus dem Container heraus ausgelöst wird, da Ereignisse sprudeln.
Rafael Emshoff
4

Wie so oft bei Fragen wie diesen hat Quirksmode die beste Antwort .

Ich würde mir vorstellen, dass die Verwendung eines der beiden Ereignisnamen dasselbe Verhalten auslöst, da eines der Ziele von jQuery darin besteht, die Browserunabhängigkeit zu erhöhen. Edit: dank anderer Beiträge sehe ich jetzt, dass dies nicht der Fall ist

Peter Bailey
quelle
0
$(document).ready(function() {
$("#outer_mouseover").bind
("Mouse Over Mouse Out",function(event){
console.log(event.type," :: ",this.id);})
$("#outer_mouseenter").bind
("Mouse enter Mouse leave",function(event){
console.log(event.type," :: ",this.id);})
 });

Langhaus
quelle
Wenn Ihr Element keine untergeordneten Elemente enthält, das Element jedoch untergeordnete Elemente, verhalten sich die Paare ganz anders. Kurz gesagt, wenn Sie Ihre Maus an ein Element und dann an dessen untergeordnetes Element übergeben, wird sowohl Mouseover / Mouseout ausgelöst, während nur Mouseenter ausgelöst wird, da sich Ihre Maus technisch noch im Element befindet.
Langhaus