È possibile utilizzare jQuery .on e hover?


331

Ho un <ul>popolato con javascript dopo il caricamento della pagina iniziale. Attualmente sto usando .bindcon mouseovere mouseout.

Il progetto è appena stato aggiornato a jQuery 1.7, quindi ho l'opzione da usare .on, ma non riesco a farlo funzionare hover. È possibile utilizzare .oncon hover?

EDIT : Gli elementi a cui sto vincolando vengono caricati con JavaScript dopo il caricamento del documento. Ecco perché sto usando one non solo hover.


3
Da un commento qui sotto: il supporto degli eventi hover in On () è stato deprecato in jQuery 1.8 e rimosso in jQuery 1.9 . Prova con una combinazione di mouseentere mouseleave, come suggerito da Calebthebrewer.
SexyBeast

Risposte:


677

( Guarda l'ultima modifica in questa risposta se hai bisogno di usare .on()con elementi popolati con JavaScript )

Usalo per elementi che non sono popolati usando JavaScript:

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});

.hover()ha il suo gestore: http://api.jquery.com/hover/

Se vuoi fare più cose, incatenali nel .on()gestore in questo modo:

$(".selector").on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
});

In base alle risposte fornite di seguito è possibile utilizzare hovercon .on(), ma:

Sebbene fortemente scoraggiato per il nuovo codice, potresti vedere lo pseudo-nome-evento "hover" usato come una scorciatoia per la stringa "mouseenter mouseleave". Allega un singolo gestore eventi per questi due eventi e il gestore deve esaminare event.type per determinare se l'evento è mouseenter o mouseleave. Non confondere lo pseudo-evento-nome "hover" con il metodo .hover (), che accetta una o due funzioni.

Inoltre, non ci sono vantaggi prestazionali nell'usarlo ed è più voluminoso del semplice utilizzo di mouseentero mouseleave. La risposta che ho fornito richiede meno codice ed è il modo corretto per ottenere qualcosa del genere.

MODIFICARE

È passato un po 'di tempo da quando è stata data una risposta a questa domanda e sembra aver guadagnato una certa trazione. Il codice sopra riportato rimane valido, ma volevo aggiungere qualcosa alla mia risposta originale.

Mentre preferisco usare mouseentere mouseleave(mi aiuta a capire cosa sta succedendo nel codice) con .on()esso è lo stesso di scrivere quanto segue conhover()

$(".selector").hover(function () {
    //stuff to do on mouse enter
}, 
function () {
    //stuff to do on mouse leave
});

Dal momento che la domanda iniziale ha chiesto come avrebbero potuto usare correttamente on()con hover(), ho pensato di correggere l'uso di on()e non ha trovato necessario aggiungere il hover()codice al momento.

MODIFICA 11 DICEMBRE 2012

Alcune nuove risposte fornite di seguito in dettaglio come .on()dovrebbero funzionare se la divdomanda in questione viene popolata utilizzando JavaScript. Ad esempio, supponiamo di popolare un evento divusando jQuery .load(), in questo modo:

(function ($) {
    //append div to document body
    $('<div class="selector">Test</div>').appendTo(document.body);
}(jQuery));

Il codice sopra per .on()non reggerebbe. Invece, dovresti modificare leggermente il tuo codice, in questo modo:

$(document).on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
}, ".selector"); //pass the element as an argument to .on

Questo codice funzionerà per un elemento popolato con JavaScript dopo che .load()si è verificato un evento. Basta cambiare argomento per il selettore appropriato.


1
@Scott, tieni presente che la risposta di JonMcIntosh non risponde alla mia domanda perché utilizza solo metà della funzionalità hover.
Ryre,

1
Questo non funziona per gli elementi che sono stati aggiunti al DOM. Come @ Nik Chankov sottolinea seguito, qui è l'uso corretto di .on () per il collegamento di più gestori stackoverflow.com/questions/8608145/...
soupy1976

1
@ soupy1976 Modificata la mia risposta, ora tiene conto degli elementi popolati con JavaScript.
Sethen,

1
@SethenMaleno: esattamente, e la tua .on()soluzione funziona sia rimuovendo l'evento pseudo-hover che usando quelli reali. Mi piace il primo che hai illustrato con mouseenter / mouseleave +1 per questo
Mark Schultheiss,

1
Quella modifica ha cambiato il mio voto da un voto negativo a un voto positivo, ben giocato, Sethen, ben giocato!
Sean Kendle,

86

Nessuna di queste soluzioni ha funzionato per me durante il mouse su / fuori oggetti creati dopo che il documento è stato caricato come richiesto dalla domanda. So che questa domanda è vecchia ma ho una soluzione per chi è ancora alla ricerca:

$("#container").on('mouseenter', '.selector', function() {
    //do something
});
$("#container").on('mouseleave', '.selector', function() {
    //do something
});

Ciò vincolerà le funzioni al selettore in modo che gli oggetti con questo selettore creati dopo che il documento è pronto saranno ancora in grado di chiamarlo.


5
Questo ha la soluzione adeguata: stackoverflow.com/questions/8608145/...
Nik Chankov

È così che ho funzionato anche io, ho trovato la risposta accettata mettendo il selettore prima che il .on non funzionasse a seguito di un evento .load () ma questo funziona.
MattP,

@calebthebrewer Modificata la mia risposta, ora tiene conto degli elementi popolati con JavaScript.
Sethen,

5
L'uso mouseovere gli mouseouteventi qui causeranno il lancio continuo del codice mentre l'utente sposta il mouse all'interno dell'elemento. Penso mouseentere mouseleavesono più appropriati dal momento che sparerà solo una volta all'entrata.
johntrepreneur

1
usare il documento come elemento radice non è una buona pratica, poiché le sue prestazioni sono affamate. stai monitorando il documento, mentre con load () il più delle volte manipoli solo una parte del sito web (f.ex. #content). quindi è meglio cercare di restringerlo all'elemento, questo è manipolato ..
honk31

20

Non sono sicuro di come sia il resto del tuo Javascript, quindi non sarò in grado di dire se ci sono interferenze. Ma .hover()funziona perfettamente come un evento con .on().

$("#foo").on("hover", function() {
  // disco
});

Se vuoi essere in grado di utilizzare i suoi eventi, usa l'oggetto restituito dall'evento:

$("#foo").on("hover", function(e) {
  if(e.type == "mouseenter") {
    console.log("over");
  }
  else if (e.type == "mouseleave") {
    console.log("out");
  }
});

http://jsfiddle.net/hmUPP/2/


In che modo gestisce le funzioni separate per l'accensione / lo spegnimento che passa con il mouse? Es .: $('#id').hover(function(){ //on }, function(){ //off});
Ryre,

Per me, questo non è necessario .. Non è necessario utilizzare .on()con hoverquando si può altrettanto facilmente sbarazzarsi di .on()e sostituirlo con la .hover()funzione ed ottenere gli stessi risultati. JQuery non sta scrivendo meno codice ??
Sethen,

@Toast no, vedi la mia risposta qui sotto per vedere come eseguire mouseentere mouseleavefunzioni con.on()
Sethen

Ho aggiornato la mia risposta per includere l'utilizzo di entrambi i tipi di evento. Funziona esattamente come la risposta di Sethen ma ha un sapore diverso.
Jon McIntosh,

24
hoveril supporto degli eventi in è On()stato deprecato in jQuery 1.8 e rimosso in jQuery 1.9.
Codice finito il

9

La funzione hover jQuery offre funzionalità di mouseover e mouseout.

$ (Selector) .hover (inFunction, outFunction);

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});

Fonte: http://www.w3schools.com/jquery/event_hover.asp


3
sicuramente funziona. hai un voto negativo perché alcune persone sono in discarica! Grazie amico
Kareem il

8

Sono appena arrivato dal web e ho sentito che avrei potuto contribuire. Ho notato che con il codice sopra riportato pubblicato da @calethebrewer può causare più chiamate sul selettore e comportamenti imprevisti, ad esempio: -

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});

Questo violino http://jsfiddle.net/TWskH/12/ illustra il mio punto. Durante l'animazione di elementi come nei plug-in ho scoperto che questi trigger multipli provocano comportamenti involontari che possono comportare la chiamata dell'animazione o del codice più del necessario.

Il mio suggerimento è semplicemente di sostituire con mouseenter / mouseleave: -

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});

Anche se questo ha impedito di chiamare più istanze della mia animazione, alla fine sono andato con il mouseover / mouseleave come avevo bisogno per determinare quando i figli del genitore venivano sorvolati.


Questa risposta in realtà ha fornito una soluzione funzionante per l'aggiunta di un evento hover per un selettore di documenti. +1
Rich Davis,

5

È possibile utilizzare .on()con hoverfacendo quello che dice la sezione Avanzate Note:

Sebbene fortemente scoraggiato per il nuovo codice, potresti vedere lo pseudo-nome-evento "hover" usato come una scorciatoia per la stringa "mouseenter mouseleave". Allega un singolo gestore eventi per questi due eventi e il gestore deve esaminare event.type per determinare se l'evento è mouseenter o mouseleave. Non confondere lo pseudo-evento-nome "hover" con il metodo .hover (), che accetta una o due funzioni.

Quello sarebbe quello di fare quanto segue:

$("#foo").on("hover", function(e) {

    if (e.type === "mouseenter") { console.log("enter"); }
    else if (e.type === "mouseleave") { console.log("leave"); }

});

EDIT (nota per gli utenti di jQuery 1.8+):

Obsoleto in jQuery 1.8, rimosso in 1.9: il nome "hover" usato come scorciatoia per la stringa "mouseenter mouseleave". Allega un singolo gestore eventi per questi due eventi e il gestore deve esaminare event.type per determinare se l'evento è mouseenter o mouseleave. Non confondere lo pseudo-evento-nome "hover" con il metodo .hover (), che accetta una o due funzioni.


1
Questo è solo più lavoro quando può essere fatto facilmente usando mouseentere mouseleave... Lo so, questo non risponde alla domanda originale di OP, ma comunque, usando hoverin questo modo, non è saggio.
Sethen,

Farlo in questo modo segue esattamente come il team di jQuery ti suggerisce di farlo in conformità alla domanda del PO. Tuttavia, come suggerisce il team di jQuery, è fortemente sconsigliato per il nuovo codice. Tuttavia, è ancora la risposta corretta alla domanda del PO.
Codice Maverick,

1
@Scott - eri più veloce di me :-). @Sethen: entrambi i modi funzioneranno, ma il richiedente ha richiesto la funzionalità con .hover().
Jon McIntosh,

Comprensibilmente, ma penso che OP stesse cercando una soluzione per mouseentere mouseleavepiuttosto che farla funzionare hover. Se non esiste un motivo reale da utilizzare hoverper motivi di prestazioni, perché utilizzarlo quando è fortemente sconsigliato per il nuovo codice?
Sethen,

5
hoveril supporto degli eventi in è On()stato deprecato in jQuery 1.8 e rimosso in jQuery 1.9.
Codice finito il

5
$("#MyTableData").on({

 mouseenter: function(){

    //stuff to do on mouse enter
    $(this).css({'color':'red'});

},
mouseleave: function () {
    //stuff to do on mouse leave
    $(this).css({'color':'blue'});

}},'tr');

2

È possibile fornire uno o più tipi di eventi separati da uno spazio.

Quindi hoveruguale mouseenter mouseleave.

Questo è il mio suggerimento:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});

Mi piace la decisione di jQ ​​di deprezzare questo parametro. La versione precedente 1.8, che utilizzava come hover come spazio dei nomi non coincideva con l'evento DOM, hover, nessuna relazione.
Jim22150,

1

Se ne hai bisogno per avere come condizione in un altro evento, l'ho risolto in questo modo:

$('.classname').hover(
     function(){$(this).data('hover',true);},
     function(){$(this).data('hover',false);}
);

Quindi, in un altro evento, puoi facilmente usarlo:

 if ($(this).data('hover')){
      //...
 }

(Vedo alcuni usando is(':hover')per risolvere questo. Ma questo non è (ancora) un selettore jQuery valido e non funziona in tutti i browser compatibili)


-2

Il plugin jQuery hoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.html va molto oltre gli approcci ingenui elencati qui. Sebbene funzionino sicuramente, potrebbero non comportarsi necessariamente come si aspettano gli utenti.

Il motivo più forte per utilizzare hoverIntent è la funzionalità di timeout . Ti consente di fare cose come impedire la chiusura di un menu perché un utente trascina il mouse leggermente troppo a destra o a sinistra prima di fare clic sull'elemento desiderato. Fornisce inoltre funzionalità per non attivare gli eventi di passaggio del mouse in una raffica e attende il passaggio del mouse mirato.

Esempio di utilizzo:

var config = {    
 sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
 interval: 200, // number = milliseconds for onMouseOver polling interval    
 over: makeTall, // function = onMouseOver callback (REQUIRED)    
 timeout: 500, // number = milliseconds delay before onMouseOut    
 out: makeShort // function = onMouseOut callback (REQUIRED)
};
$("#demo3 li").hoverIntent( config )

Ulteriori spiegazioni al riguardo sono disponibili su https://stackoverflow.com/a/1089381/37055

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.