2012-01-10 13 views
5

Sto cercando di associare funzioni agli elementi appena aggiunti utilizzando jquery ... Ho provato numerosi esempi online, ma in qualche modo non funziona per me. Ho creato un modulo con id e un pulsante, su submit ajax carica elementi da un'altra pagina e inserisce l'html sul sito web corrente. Tutto sembra funzionare correttamente, ma gli elementi appena caricati non hanno nessun evento associato. Ecco il codice html:Associare eventi a elementi aggiunti dinamicamente

<form id="tclick" method="post" action="${tg.url('/entryCmd')}"> 
    <input type="hidden" name="id" value="${entries[0].id}" /> 
    <input type="submit" value="submit"/> 
</form> 

e jQuery:

$("#tclick").on("submit", function(data){ 
    var h = $(this).serialize(); 
    var d; 

    $.get($(this).attr("action"), h, 
     function(returnData) { 
      d = returnData; 
     } 
    ); 

    $(this).ajaxStop(function(){ 
     $(this).after($(d).find(".edit-content").html()); 
    }); 

    return false; 
}); 

Il div edit-contenuto viene caricato subito dopo l'elemento del modulo. Ha alcuni elementi, che potrebbero essere associati alle funzioni jQuery.

+1

provare .Live() al posto di .on() –

+1

@ jack-tutti i mestieri 'live' è deprecato in favore di' on', vedere http://api.jquery.com/live/ – Yoshi

+1

@ jack-all-trades. E lui non sta usando .live() in ogni caso –

risposta

1

Per aggiungere eventi agli elementi aggiunti al DOM dopo il caricamento della pagina, è necessario utilizzare delegate() o se si utilizza jQuery 1.7+ on().

$(".edit-content").delegate("#myDiv", "click", function() { 
    // do stuff when #myDiv gets clicked. 
}); 

API:
Delegate
On

+0

Sto usando, ma in qualche modo non funziona per me ... cosa sto sbagliando? :/ – Alko

4

Got fondamentalmente due opzioni per fare questo:

  1. Bind gli eventi dopo aggiungendo il nuovo HTML:

    $(this).ajaxStop(function(){ 
        $(this).after($(d).find(".edit-content").html()); 
        // do you binding here 
    }); 
    
  2. Utilizzare la delega degli eventi (con .on() o .delegate()).

    $('.some-container').on('click', '.edit-button', function(e) {...}); 
    

    Questa delegherà l'evento click a un .some-contenitore elemento per tutti i bambini con classe di .edit-tasto, non importa quest'ultimo era già nel DOM o caricato in seguito.

+0

Ho provato questo, ma se inserisco il parametro '.edit-button' nella funzione on, il sito viene aggiornato, se lo elimini, gli elementi vengono caricati senza aggiornamento. – Alko

+0

Onestamente non sono sicuro di capire. Non vedo come la pagina possa essere aggiornata a causa di .on(), non ha senso. Puoi modificare la tua domanda con il tuo codice modificato per avere un'immagine più grande su di te? –

+0

OK, ho capito, stavo usando solo per #tclick, ho cambiato tutti gli eventi su on (click, function() {...}) e li ho riavviati, funziona ora ... Ancora non capisco esattamente come funziona jquery, solo imparando attraverso tutorial ... Dovrei leggere un libro su jquery un giorno: P – Alko

Problemi correlati