2013-01-23 14 views
8

Il mio framework web ha aggiornato automaticamente il mio script jQuery con l'ultima versione corrente, la 1.9.Come sostituire "live" da jQuery 1.8.3 a jQuery 1.9?

Ora tutta la mia:

$(".myclass").live("click", function() {... 

non funzionano più. L'ho usato principalmente con qualche ajax chiamato quale compilato html nella mia pagina.

Vorrei sapere come sostituire questa funzione nell'ultima versione. Un amico mi ha detto di usare "on", ma il "on" rimane fisso sullo stesso elemento.

Spiegazione, in questo esempio (no ajax), utilizzo un'icona "+" per visualizzare un "elenco ul li".

$(".closed").live('click', function(){ 
    $("#ul_list_"+$(this).attr('id')).addClass("displayed").removeClass("hidden").show(); 
    $(this).addClass("openned").removeClass('closed'); 
    $(this).html('<i class="icon-minus"></i>'); 
}); 

$(".openned").live('click', function(){ 
    $("#ul_list_"+$(this).attr('id')).addClass("hidden").removeClass("displayed").hide(); 
    $(this).addClass("closed").removeClass('openned'); 
    $(this).html('<i class="icon-plus"></i>'); 
}); 

(lo so che lo script non è il più ottimizzato mai, ma ha funzionato. Ho usato le classi per aprire o chiudere le mie liste. E se il visitatore non ha JS abilitato, nulla è nascosto, tutto le liste sono aperte piegate)

Note:

+0

Hai provato a "legare"? –

+0

Infatti, ho cercato da 1.8 a 1.9, o semplicemente "jquery 1.9 live" senza accorgercene che era da 1.7! Grazie! – Polopollo

+0

Vedere [Esempi di migrazione] (http://stackoverflow.com/a/14354091/584192) –

risposta

25

Il docs già fornire un esempio:

riscrittura metodo .Live() in termini di successori è semplice; questi sono i modelli per le chiamate equivalenti per tutti i i metodi di attacco a tre eventi:

$(selector).live(events, data, handler); // jQuery 1.3+ 
$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+ 
$(document).on(events, selector, data, handler); // jQuery 1.7+ 

Quindi: $(document).on("click", ".closed", function() { ... }).

+0

I documenti hanno anche una descrizione molto buona di come funziona il selector: "Quando viene fornito un selettore, il gestore eventi viene definito come delegato. Il gestore non viene chiamato quando l'evento si verifica direttamente sull'elemento associato, ma solo per discendenti (elementi interni) che corrispondono al selettore. jQuery fa bollire l'evento dalla destinazione dell'evento fino all'elemento in cui è collegato il gestore (ovvero, più interno all'elemento più esterno) e esegue il gestore per qualsiasi elemento lungo quel percorso che corrisponde al selettore." –

+0

In effetti stavo leggendo gli esempi della nuova documentazione" on "... Non ho pensato alla documentazione" live "... Grazie! – Polopollo

+0

. Non funziona come .live, penso che Jquery pensi .live era molto conveniente – sam360

1

è necessario utilizzare on anziché live. perché vivo è deprecato dalla versione 1.7

+1

Questo non è giusto. $ (". closed") includerà solo gli elementi che corrispondono quando viene eseguito questo codice, non gli elementi che verranno contrassegnati come chiusi. Il punto di vita era che la query era "live". –

7

è necessario utilizzare on con un gestore delegato:

$('#parent').on('click', '.closed', function() { 
    // your code... 
}); 

Si noti che è necessario sostituire #parent con l'elemento genitore più vicino al .closed che è disponibile sul caricamento della pagina - di solito l'elemento che .closed è stato allegato alla.