2010-02-14 10 views
162

Sto usando il seguente codice jquery per mostrare un pulsante di eliminazione contestuale solo per le righe di tabella che stiamo passando con il mouse. Funziona ma non per le righe che sono state aggiunte con js/ajax al volo ...jquery live hover

C'è un modo per farlo funzionare con eventi dal vivo?

$("table tr").hover(
    function() {}, 
    function() {} 
); 
+0

superba domanda! – emaillenin

risposta

244

jQuery 1.4.1 supporta ora "hover" per gli eventi live(), ma solo con un evento funzione del gestore:

$("table tr").live("hover", 

function() { 

}); 

In alternativa, è possibile fornire due funzioni, una per MouseEnter e uno per mouseLeave:

$("table tr").live({ 
    mouseenter: function() { 

    }, 
    mouseleave: function() { 

    } 
}); 
+0

Tuttavia, non funziona ancora per me. Ho provato a fare questo: dove sto andando storto? > $ ('table tr'). live ('hover', function() { \t \t $ (this) .find ('. deletebutton'). toggle(); \t}); –

+1

questo non è corretto e non funziona. vedere l'intestazione "Più eventi" sotto la documentazione di 'live': http://api.jquery.com/live/ – Jason

+34

A partire da jQuery 1.4.2, .live (" hover ") è equivalente a .live (" mouseover mouseout "), NOT .live (" mouseenter mouseleave ") - vedi http://bugs.jquery.com/ticket/6077 Quindi, do .live (" mouseenter mouseleave ", function() {...}), o .live ("mouseenter", function() {...}). live ("mouseleave", function() {...}) – aem

5

Come di jQuery 1.4.1, l'evento hover lavora con live(). E 'fondamentalmente solo lega ai MouseEnter e MouseLeave eventi, che si può fare con le versioni precedenti alla 1.4.1 altrettanto bene:

$("table tr") 
    .mouseenter(function() { 
     // Hover starts 
    }) 
    .mouseleave(function() { 
     // Hover ends 
    }); 

Ciò richiede due si lega, ma funziona altrettanto bene.

5

Questo codice funziona:

$(".ui-button-text").live(
     'hover', 
     function (ev) { 
      if (ev.type == 'mouseover') { 
       $(this).addClass("ui-state-hover"); 
      } 

      if (ev.type == 'mouseout') { 
       $(this).removeClass("ui-state-hover"); 
      } 
     }); 
+2

Che cos'è "hI-state-hover"? Come si applica alla domanda originale dell'utente? –

+1

usa solo le classi predefinite dell'interfaccia utente di Jquery quando l'evento è in corso. –

110
$('.hoverme').live('mouseover mouseout', function(event) { 
    if (event.type == 'mouseover') { 
    // do something on mouseover 
    } else { 
    // do something on mouseout 
    } 
}); 

http://api.jquery.com/live/

+0

Ha funzionato anche per me. +1 Ho provato a fare la versione di Philippe, sia con mouseover che con mouseenter - nessuno dei due ha funzionato. Ma questo ha fatto. Grazie! – eduncan911

+0

'.live' è deprecato ora, vedere la risposta di Andre per il metodo di sostituzione ora. – johntrepreneur

+1

L'uso degli eventi 'mouseover' e' mouseout' farà sì che il codice continui a sparare mentre l'utente muove il mouse all'interno dell'elemento. Penso che 'mouseenter' e' mouseleave' siano più appropriati dato che spareranno solo una volta all'entrata. – johntrepreneur

2

AVVISO: C'è una penalità significativa nelle prestazioni con la versione live di hover. È particolarmente evidente in una pagina di grandi dimensioni su IE8.

Sto lavorando a un progetto in cui vengono caricati menu multi-livello con AJAX (abbiamo i nostri motivi :). Ad ogni modo, ho usato il metodo live per l'hover che ha funzionato benissimo su Chrome (IE9 ha funzionato, ma non eccezionale). Tuttavia, in IE8 non solo ha rallentato i menu (è stato necessario librarsi per un paio di secondi prima che scendesse), ma tutto nella pagina era dolorosamente lento, incluso lo scorrimento e persino il controllo di caselle di controllo semplici.

Il binding degli eventi direttamente dopo il caricamento ha comportato prestazioni adeguate.

+2

utile, ma più un commento che una risposta. – mikemaccana

59

.live() è stata deprecata come di jQuery 1.7

Usa .on() invece e specificare un selettore discendente

http://api.jquery.com/on/

$("table").on({ 
    mouseenter: function(){ 
    $(this).addClass("inside"); 
    }, 
    mouseleave: function(){ 
    $(this).removeClass("inside"); 
    } 
}, "tr"); // descendant selector 
+6

funziona perfettamente a partire da jQuery 1.9. tutte le soluzioni live e delegate sono DEPRECATED! Sarebbe fantastico se qualcuno potesse annullare la risposta accettata e accettare invece questa. – jascha