2012-04-24 9 views
30

Come descritto a http://api.jquery.com/live/:jQuery sul metodo() non si lega gli eventi come Live() ha fatto

Come di jQuery 1.7, il metodo .Live() è deprecato. Usa .on() per allegare gestori di eventi.

Diritto. Così, invece di

$('.dynamicallyCreatedElement').live('click', function(){ 
    console.log('click'); 
}); 

dovrei usare:

$('.dynamicallyCreatedElement').on('click', function(){ 
    console.log('click'); 
}); 

Tuttavia non si lega evento da elementi creati dopo on() chiamata. Quindi è davvero meglio il metodo live()?

Mi manca qualcosa?

+1

possibile duplicato del [jQuery 1.7 - Accensione diretta() in data()] (http://stackoverflow.com/questions/8021436/jquery-1-7-turning-live-into-on) –

+1

Se leggi un po 'più nella documentazione che hai collegato a (terzo paragrafo): * "Riscrivi il metodo' .live() 'in termini dei suoi successori è semplice, questi sono modelli per chiamate equivalenti per tutti e tre i metodi di collegamento degli eventi: '$ (document) .on (eventi, selettore, dati, gestore); // jQuery 1.7 +' "*. –

+0

@FelixKling Grazie, non ho trovato prima. – hsz

risposta

63

Per utilizzare on nello stesso modo in cui live usato per lavorare è necessario utilizzarlo come:

$(document).on("click", ".dynamicallyCreatedElement", function() { 
    console.log('click'); 
}); 

Così si associa il gestore on al document stessa (o, in realtà, l'elemento contenitore in cui il nuovi elementi saranno "visualizzati" - Grazie a @ devnull69 per i chiarimenti), quindi passargli un tipo di evento e il selettore.

Troverete un paio di esempi a metà della pagina di documentazione live.

+7

Non deve necessariamente essere '$ (documento)'. Il primo selettore può essere un elemento padre/contenitore già esistente dell'elemento creato dinamicamente – devnull69

+0

Ok, true, a condizione che i nuovi elementi vengano visualizzati in quel genitore/contenitore. - Ho aggiornato la mia risposta; grazie. –

+0

In effetti, dovresti cercare di evitare l'uso di '$ (document) .on (...)' in questi casi, poiché questo ha creato problemi con i browser Safari in passato, dove gli eventi di tipo 'click' non hanno fatto il pieno di bolle fino a 'document': http: // stackoverflow.it/questions/10165141/jquery-on-and-delegate-doesnt-work-on-ipad – EleventyOne

13
$('#closestStaticParent').on('click', '.dynamicallyCreatedElement' function(){ 
    console.log('click'); 
}); 
4

Usa come delegato()

$('body').on('click', '.dynamicallyCreatedElement', function() { 
}); 

EDIT: Proprio così tutti ottiene, quando si utilizza delegato() il selettore è il primo argomento e su() è la seconda.

+0

'.delegate()' si aspetta che il selettore sia il primo argomento e il il secondo è l'evento, quindi l'ordine degli argomenti è diverso. –

+0

Sì, ma il concetto è lo stesso. – tbleckert

2

ho trovato la necessità di utilizzare questo approccio con il:

$('#container').on('click','.dynamicallyCreatedElement',function(){ 
    console.log('click'); 
}); 
Problemi correlati