JQuery mouseenter () a mouseover ()

172

Po przeczytaniu niedawno udzielonego pytania nie jestem pewien, czy naprawdę rozumiem różnicę między mouseenter()i mouseover(). Stan wiadomości

MouseOver ():

Będzie uruchamiany po wejściu do elementu i za każdym razem, gdy w elemencie wystąpią jakiekolwiek ruchy myszy.

MouseEnter ():

Zapali się po wejściu do elementu.

Wymyśliłem skrzypce, które używają obu i wydają się być dość podobne. Czy ktoś może mi wyjaśnić różnicę między tymi dwoma?

Próbowałem też przeczytać definicje JQuery, obie mówią to samo.

Zdarzenie mouseover jest wysyłane do elementu, gdy wskaźnik myszy wchodzi do elementu

Zdarzenie mouseenter jest wysyłane do elementu, gdy wskaźnik myszy wchodzi do elementu.

Czy ktoś mógłby wyjaśnić na przykładzie?

aziz punjani
źródło
1
Demo w dokumentacji pokazuje to całkiem dobrze imo.
Felix Kling
2
Warto zauważyć, że mouseenter i mouseleave były zastrzeżonymi zdarzeniami tylko w IE i emulowane w innych przeglądarkach przez jQuery (wydaje się, że są teraz w specyfikacji, chociaż nadal nie są zaimplementowane w innych przeglądarkach. Zobacz quirksmode.org/dom/events/mouseover.html )
Russ Cam

Odpowiedzi:

274

Widzisz zachowanie, gdy element docelowy zawiera elementy potomne:

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

Za każdym razem, gdy mysz wchodzi lub opuszcza element podrzędny, mouseoverjest wyzwalana, ale nie 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
źródło
2
@psychobrm - Nie. Zagraj w te dwa dema, które również śledzą mouseleavezdarzenie: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Jeśli ponad to samo, co enter + leave, wtedy licznik do końca będzie sumą liczy się wejście i wyjście.
gilly3
1
czy jest jakiś konkretny powód, żeby var n = + el.text();zamiast pisać var n = el.text();? Proszę tylko o ciekawość.
Fredrick Gauss
3
@FredrickGauss - używam +operatora do przekształcenia ciągu zwróconego z el.text()na liczbę. Czy ja potrzebuję do? Nie. W tym przypadku następne stwierdzenie, które używa n, również zmusiłoby ją do podania liczby. Więc dlaczego go użyłem? Nie jestem pewien ... to było 2 lata temu. To dobry nawyk. Wyraźnie wyraża mój zamiar. Prawdopodobnie pierwotnie miałem, n + 1zanim zapisałem, ale zdecydowałem się zmniejszyć mój kod o 2 znaki i po prostu użyć ++n. n + 1by nie zmuszać ndo wielu, ale zamiast tego przymusić 1do łańcucha w wyniku produkcji, np 0111111.
gilly3
2
@ gilly3 - dzięki za szczegółowe wyjaśnienie Twojej podróży w umyśle.
Fredrick Gauss
1
@ gilly3 Dobre podsumowanie, ale niewielka poprawa: „lub pozostawia element podrzędny„ powinien być ”lub pozostawia element podrzędny, biorąc pod uwagę, że istnieje luka między dzieckiem a rodzicem. Twoje skrzypce mają margines / dopełnienie, a zatem to prawda że za każdym razem, gdy opuścisz element podrzędny, otrzymasz zdarzenie najechania myszą, ale spróbuj bez dopełnienia / marginesów, a nie otrzymasz tego zdarzenia.
Izrael
30

To jeden z najlepszych przykładów, jakie znalazłem:

  • mouseenter
  • najechanie myszą
  • wycięcie myszy
  • mouseleave

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

Krzysztof
źródło
Przykład jest całkiem fajny, ale musisz nieco bardziej ustrukturyzować swoją odpowiedź, aby uzyskać uznanie. Pamiętaj, że próbujesz odpowiedzieć na pytanie… jeśli masz tylko link, może komentarz byłby bardziej odpowiedni. Jeśli nie możesz jeszcze komentować z powodu reputacji, zdobądź trochę i zrób to później.
scristalli
Właściwie podoba mi się ta odpowiedź. Pytający podał już definicje mouseover i mouseenter. Pytali o przykład, a ten przykład pokazuje, jak działają one znacznie lepiej niż inne przykłady tutaj.
patorjk
Odpowiedź gilly3 ma wadę (zobacz mój komentarz). Chociaż nie jest dobrze zorganizowana, ta odpowiedź wskazuje na lepszy zasób.
Izrael
14

Choć działają w ten sam sposób, mouseenterzdarzenie jest wyzwalane tylko wtedy, gdy wskaźnik myszy znajdzie się w wybranym elemencie . mouseoverZdarzenie jest wywoływane , gdy wskaźnik myszy wejdzie żadnych elementów potomnych, jak również .

ErickBest
źródło
3

Zobacz przykładowy kod i demo na dole strony dokumentacji jquery:

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

... mouseover - uruchamia się, gdy wskaźnik przesuwa się do elementu podrzędnego, natomiast mouseenter - uruchamia się tylko wtedy, gdy wskaźnik przesuwa się do elementu związanego.

Willem
źródło
3

W mouseenter zdarzeń różni się od najechaniu myszą w sposób obsługuje pęcherzyków zdarzeń . Mouseenter wydarzenie, tylko wyzwala jego obsługi, gdy mysz wchodzi element jest związany, nie potomka . Zobacz: https://api.jquery.com/mouseenter/

W mouseLeave zdarzeń różni się od odsunięciu myszy w sposób obsługuje pęcherzyków zdarzeń . MouseLeave wydarzenie, tylko wyzwala jego obsługi, gdy opuszcza mysz element jest związany, nie potomka . Zobacz: https://api.jquery.com/mouseleave/

user2330678
źródło
2

Ten przykład demonstruje różnicę między zdarzeniami mousemove , mouseenter i 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 : występuje za każdym razem, gdy wskaźnik myszy zostanie przesunięty nad element div.
  • onmouseenter : występuje tylko wtedy, gdy wskaźnik myszy znajdzie się w elemencie div.
  • onmouseover : występuje, gdy wskaźnik myszy wchodzi do elementu div i jego elementów potomnych (p i span).
Mourad El Aomari
źródło
jakoś jsfiddle jest zepsuty, mówiąc, że funcitons są niezdefiniowane - właśnie rozwidliłem i przeniosłem wszystkie js do <script> jsfiddle.net/orc8empd
godblessstrawberry
0

Stare pytanie, ale nadal nie ma dobrej, aktualnej odpowiedzi z wglądem imo.

Obecnie wszystkie przeglądarki obsługują mouseover/mouseouti mouseenter/mouseleave. Niemniej jednak jQuery nie rejestruje programu obsługi mouseenter/mouseleave, ale po cichu umieszcza je w opakowaniach, mouseover/mouseoutjak pokazuje poniższy kod, i tworzy własną, nieco inną interpretację mouseenter/mouseleave.

Dokładne zachowanie zdarzeń jest szczególnie istotne w przypadku „obsługi delegatów”. Niestety, jQuery ma również inną interpretację tego, czym są programy obsługi delegatów i co powinny otrzymywać dla zdarzeń. Fakt ten pokazuje inna odpowiedź dotycząca prostszego zdarzenia kliknięcia.

Jak więc właściwie odpowiedzieć na pytanie o jQuery, które używa sformułowań Javascript dla zdarzeń i handlerów, ale różni je i nawet nie wspomina o tym w swojej dokumentacji?

Najpierw różnice w „prawdziwym” JavaScript:

  • obie
    • mysz może „przeskakiwać” z elementów zewnętrznych / zewnętrznych do elementów wewnętrznych / najbardziej wewnętrznych, gdy jest poruszana szybciej niż przeglądarka sprawdza jej położenie
    • każdy enter/overdostaje odpowiedni leave/out(prawdopodobnie późny / niespokojny)
    • zdarzenia przechodzą do widocznego elementu poniżej wskaźnika (niewidoczne → nie mogą być celem)
  • mouseenter/mouseleave
    • jest dostarczany do elementu, w którym został zarejestrowany (docelowy)
    • ilekroć element lub dowolny element podrzędny (np. przeskakując) jest wprowadzany / opuszczany
    • nie może bąbelkować, ponieważ koncepcyjnie potomkowie są uważani za część rozpatrywanego elementu, tj. nie ma dzieci, z których mogłoby pochodzić inne zdarzenie (w znaczeniu „wszedł / opuścił” rodzica ?!)
    • dzieci mogą również mieć zarejestrowanych podobnych opiekunów, którzy wchodzą / wychodzą poprawnie, ale nie są związani z cyklem wejścia / wyjścia rodziców
  • mouseover/mouseout
    • celem jest rzeczywisty element poniżej wskaźnika
      • celem nie mogą być dwie rzeczy: tj. nie rodzic i dziecko w tym samym czasie
    • wydarzenie nie może „zagnieździć”
      • zanim dziecko będzie mogło się „ogarnąć”, rodzic musi „wyjść”
    • can bubble, ponieważ target / relatedTarget wskazują, gdzie wystąpiło zdarzenie

Po kilku testach okazuje się, że dopóki nie używasz „obsługi delegatów z rejestracją selektora” jQuery, emulacja jest niepotrzebna, ale rozsądna: odfiltrowuje mouseover/mouseoutzdarzenia, mouseenter/mouseleavektórych nie uzyska. Jednak cel jest pomieszany. Rzeczywiste mouseenter/mouseleavewskazywałyby element obsługujący jako cel, emulacja mogłaby wskazywać dzieci tego elementu, tj. Cokolwiek jest mouseover/mouseoutprzenoszone.

Robert Siemer
źródło