Jquery mouseenter () vs mouseover ()


172

Quindi, dopo aver letto una domanda a cui è stata data una risposta recente , non sono chiaro se capisco davvero la differenza tra mouseenter()e mouseover(). La posta afferma

MouseOver ():

Sparerà entrando in un elemento e ogni volta che si verificano movimenti del mouse all'interno dell'elemento.

MouseEnter ():

Sparerà entrando in un elemento.

Ho inventato un violino che usa entrambi e sembrano essere abbastanza simili. Qualcuno può spiegarmi la differenza tra i due?

Ho anche provato a leggere le definizioni di JQuery, entrambe dicono la stessa cosa.

L'evento mouseover viene inviato a un elemento quando il puntatore del mouse entra nell'elemento

L'evento mouseenter viene inviato a un elemento quando il puntatore del mouse entra nell'elemento.

Qualcuno può chiarire con un esempio?


1
La demo nella documentazione lo mostra abbastanza bene imo.
— Felix Kling,

2
Vale la pena notare che mouseenter e mouseleave erano eventi proprietari solo in IE ed emulati in altri browser da jQuery (sembrano ora nelle specifiche sebbene non siano ancora implementati in altri browser. Vedi quirksmode.org/dom/events/mouseover.html )
— Russ Cam

Risposte:


274

Si vede il comportamento quando l'elemento target contiene elementi figlio:

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

Ogni volta che il mouse entra o esce da un elemento figlio, mouseoverviene attivato, ma non 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>


2
@psychobrm - No. Gioca con queste due demo che tracciano anche l' mouseleaveevento: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Se sopra dove lo stesso di invio + parti, il conteggio per over sarebbe la somma di i conteggi per entrare e uscire.
— gilly3,

1
c'è un motivo specifico per scrivere var n = + el.text();invece di var n = el.text();? Chiedo solo curiosità.
— Fredrick Gauss,

3
@FredrickGauss - Sto usando l' +operatore per forzare la stringa restituita da el.text()un numero. Ne avevo bisogno ? No. In questo caso, la prossima affermazione che usa nlo costringerebbe anche a un numero. Quindi, perché l' ho usato? Non sono sicuro ... questo è stato 2 anni fa. È una buona abitudine. Rende esplicita la mia intenzione. Probabilmente avevo originariamente n + 1prima di salvare, ma ho deciso di ridurre il mio codice di 2 caratteri e basta usare ++n. n + 1sarebbe non costringere na un numero, ma invece sarebbe costringere 1a una stringa risultante in uscita, ad es 0111111.
— gilly3,

2
@ gilly3 - grazie per la spiegazione dettagliata del tuo viaggio nella mente.
— Fredrick Gauss,

1
@ gilly3 Buon riassunto, ma un piccolo miglioramento: "o lascia un elemento figlio" dovrebbe essere "o lascia un elemento figlio, dato che c'è un divario tra il bambino e il genitore. Il tuo violino ha un margine / riempimento, e quindi è vero che ogni volta che lasci l'elemento figlio ottieni un evento mouseover, ma provalo senza riempimenti / margini e non otterrai questo evento.
— Israele

30

Questo è uno dei migliori esempi che ho trovato di:

  • MouseEnter
  • mouseover
  • mouseout
  • mouseLeave

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


L'esempio è piuttosto interessante, ma devi strutturare un po 'di più la tua risposta per essere votato. Ricorda che stai cercando di rispondere a una domanda ... se hai solo il link forse un commento sarebbe più appropriato. Se non puoi ancora commentare a causa della reputazione, guadagnane un po 'e fallo in seguito.
— scristalli,

In realtà, mi piace molto questa risposta. Il richiedente ha già fornito le definizioni di mouseover e mouseenter. Stavano chiedendo un esempio, e questo esempio dimostra come funzionano molto meglio degli altri esempi qui.
— patorjk,

La risposta di gilly3 ha un difetto (vedi il mio commento). Anche se non strutturata bene, questa risposta indica una risorsa migliore.
— Israele,

14

Sebbene funzionino allo stesso modo, tuttavia, l' mouseenterevento si attiva solo quando il puntatore del mouse entra nell'elemento selezionato . L' mouseoverevento viene attivato se un puntatore del mouse immette anche elementi figlio .


3

Vedi il codice di esempio e la demo in fondo alla pagina della documentazione di jquery:

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

... mouseover viene attivato anche quando il puntatore si sposta nell'elemento figlio, mentre mouseenter viene attivato solo quando il puntatore si sposta nell'elemento associato.


3

L' evento mouseenter differisce dal passaggio del mouse per il modo in cui gestisce il gorgogliamento degli eventi . L' evento mouseenter , attiva il suo gestore solo quando il mouse entra nell'elemento a cui è legato, non in un discendente . Consultare: https://api.jquery.com/mouseenter/

L' evento mouseleave differisce dal mouseout per il modo in cui gestisce il gorgogliamento degli eventi . L' evento mouseleave , attiva il suo gestore solo quando il mouse lascia l'elemento a cui è legato, non un discendente . Consultare: https://api.jquery.com/mouseleave/


2

Questo esempio dimostra la differenza tra gli eventi mousemove , mouseenter e 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 : si verifica ogni volta che si sposta il puntatore del mouse sull'elemento div.
  • onmouseenter : si verifica solo quando il puntatore del mouse entra nell'elemento div.
  • onmouseover : si verifica quando il puntatore del mouse entra nell'elemento div e nei suoi elementi figlio (p e span).

in qualche modo jsfiddle è rotto dicendo che le funzioni non sono definite - Ho appena biforcato e spostato tutte le js su <script> jsfiddle.net/orc8empd
— godblessstrawberry

0

Vecchia domanda, ma ancora nessuna buona risposta aggiornata con insight imo.

In questi giorni, tutti i browser supportano mouseover/mouseoute mouseenter/mouseleave. Tuttavia, jQuery non registra il gestore su mouseenter/mouseleave, ma li mette silenziosamente in un involucro mouseover/mouseoutcome mostra il codice seguente e ne fa una interpretazione leggermente diversa mouseenter/mouseleave.

L'esatto comportamento degli eventi è particolarmente rilevante per i "gestori delegati". Sfortunatamente, jQuery ha anche una sua diversa interpretazione di cosa sono i gestori delegati e cosa dovrebbero ricevere per gli eventi. Questo fatto è mostrato in un'altra risposta per l'evento click più semplice.

Quindi, come rispondere correttamente a una domanda su jQuery, che utilizza la formulazione Javascript per eventi e gestori, ma rende entrambi diversi e non lo menziona nemmeno nella sua documentazione?

Innanzitutto le differenze nel Javascript "reale":

  • tutti e due
    • il mouse può "saltare" dagli elementi esterni / esterni agli elementi interni / più interni quando viene spostato più velocemente rispetto a quando il browser ne campiona la posizione
    • qualsiasi enter/overottiene un corrispondente leave/out(possibilmente in ritardo / jumpy)
    • gli eventi vanno all'elemento visibile sotto il puntatore (invisibile → non può essere target)
  • mouseenter/mouseleave
    • viene consegnato all'elemento in cui è stato registrato (target)
    • ogni volta che l'elemento o qualsiasi discendente (ad esempio saltando) viene inserito / lasciato
    • non può bolle, perché concettualmente i discendenti sono considerati parte dell'elemento in questione, cioè non ci sono bambini da cui potrebbe provenire un altro evento (con il significato di "entrato / lasciato" il genitore ?!)
    • i bambini potrebbero anche avere gestori simili registrati, che entrano / escono correttamente, ma non sono collegati al ciclo di entrata / uscita dei genitori
  • mouseover/mouseout
    • l'obiettivo è l'elemento reale sotto il puntatore
      • un obiettivo non può essere due cose: vale a dire non genitore e figlio contemporaneamente
    • l'evento non può "nidificare"
      • prima che un bambino possa essere “esagerato”, il genitore deve “uscire”
    • può bolle, perché target / relatedTarget indica dove si è verificato l'evento

Dopo alcuni test, mostra che fintanto che non si utilizzano jQuery "gestori delegati con registrazione selettore", l'emulazione non è necessaria ma ragionevole: filtra gli mouseover/mouseouteventi che mouseenter/mouseleavenon si otterrebbero. Il bersaglio però è incasinato. Il reale mouseenter/mouseleavedarebbe l'elemento gestore come bersaglio, l'emulazione potrebbe indicare i figli di quell'elemento, vale a dire qualunque sia il mouseover/mouseoutportato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.