2011-11-03 18 views
15

Ogni volta che uso ajax per creare dinamicamente nuovi contenuti, .clone(), aggiungere(), ecc, il nuovo elemento perde qualsiasi trigger e gli eventi programmati I = (jQuery: clonare elementi e gli eventi

Dopo aver effettuato la copia, semplice cose che FUNZIONANO su altri elementi come aggiungere una classe, sugli elementi copiati non funzionano più Qualsiasi nuovo contenuto Ajax non funziona.I pulsanti di comando non funzionano più.Cosa posso fare?

Sto clonando questo HTML, e i pulsanti di comando non funzionano più. Lo stile degli elementi span non funziona più sugli elementi CLONED:

<div name="shows" id="x"><br/> <!-- The ID depends on the database--> 
    <div name="shows" id="x"> 
     ID: <input disabled="disabled" size="7" value="x" name="id" /> 
     Status: 
     <select name="status" > 
      <option selected="selected" >Display</option> 
      <option >Hide</option> 
     </select> 
     <br/><br/> 
     <span class="required" id="date_txt">*Date: </span><input type="text" value="" name="date" /> 
     &nbsp;&nbsp; 
     <span class="required" id="title_txt">*Title: </span><input type="text" size="65" value="" name="title" /> 
     <br/> 
     <span class="required" id="venue_txt">*Venue: </span><input type="text" size="45" value="" name="venue" /> 
     Telephone: <input type="text" value="" name="tel" /> 
     <br/> 
     URL: <input type="text" size="100" value="" name="url" /> 
     <br/><br/> 
     Address: <input type="text" size="45" value="" name="address" /> 
     &nbsp;&nbsp; 
     <span class="required" id="city_txt">*City: </span><input type="text" value="" name="city" /> 
     <br/> 
     State: <input type="text" value="" name="state" /> 
     ZIP: <input type="text" value="" name="zip" /> 
     <span id="country_txt">*Country: </span><input type="text" value="United States" name="country" /> 
     <br/> 
     <br/>Comments: <br/> 
     <textarea cols="80" rows="8" name="comments" ></textarea> 
    </div> 
    <!-- START OF:commands --> 
    <div id="commands" > 
     <button name="edit" id="edit" >Edit</button> 
     <button name="delete" id="delete" >Delete</button> 
    <br /> 
    <hr /> 
    <br /> 
    </div> 
    <!-- END OF:commands --> 
</div> 
<!-- END OF:new --> 

nuovi commenti aggiunti, 11/03/2011:

OK, ho capito il problema e ho avuto un errore sul mio jQuery. Ora, quando aggiungo .clone (true) QUASI tutto funziona.


Il mio nuovo problema è il DatePicker dell'interfaccia utente. Dopo la clonazione dell'HTML, quando faccio clic sul campo della data appena clonata, lo stato attivo passa al (vecchio) datafield da cui i dati sono stati clonati. Più oltre, se seleziono una data, il valore va al vecchio campo di date -Non è il campo di data appena clonato.

Ecco il mio codice ajax (dopo una sottomissione di successo):

UI codice datepicker:

$("input[name='date']").datepicker({ dateFormat: 'yy-mm-dd', changeMonth: true, changeYear: true, numberOfMonths: 3, showButtonPanel: true}); 

Ajax:

...ajax code... 
function(data) 
{ 
var $msg = eval(data); 
if($msg[0] == 1) 
    { 
    //#var.new 
     $id = '#'+$msg[1]; 
     $data = $("#new"); 
    $new = $data.clone(true); 
    $new.find('input.datefield').datepicker(); 


     $new.attr("id", $id); 
     $new.children('[name="id"]').val($id); 
     $new.children('[name="id"]').attr("value", $id); 
     $new.children(":input").each(function() { var $value = $(this).val(); $(this).attr("value", $value); }); 
     $new.prepend("<br/>"); 

     $commands = $("#blank").children("#commands").clone(true); 
     $commands.children("#add").text("Update"); 
     $commands.children("#add").attr("pk", $id); 
     $commands.children("#add").attr("name", "update"); 
     $commands.children("#add").attr("id", "update"); 

     $commands.children("#reset").text("Delete"); 
     $commands.children("#reset").attr("pk", $id); 
     $commands.children("#reset").attr("name", "delete"); 
     $commands.children("#reset").attr("id", "delete"); 

     $new.append($commands); 

     //#animation 
     //blank.slideUp 
     $("#blank").slideUp(2500, function(){ 
     $("#ADDNEW").html("&#9658; New:"); 
     //$("#blank").clone().prependTo($("#active")); 
     //$("#blank").prependTo("#active"); 

     //active.slideUp 
     $("#active").slideUp("slow", function(){ 
     $("#ON").html("&#9658; Active:"); 
     $("#active").prepend($new); 
     $('#reset').trigger('click'); 

     //active.slideDown 
     $("#active").slideDown(8500, function(){ 
     $("#ON").html("&#9660; Active:"); 

     //blank.slideDown 
     $("#blank").slideDown(3500, function(){ 
     $("#ADDNEW").html("&#9660; New:"); 
     load_bar(0); 

     }); //end: anumation.#blank.slideDown 
     }); //end: anumation.#active.slideDown 
     }); //end: anumation.#blank.slideUp 
     }); //end: anumation.#active.slideUp 

     //$("#new").fadeOut(2000, function(){ 
     //START: blank 
     //alert($("#blank").html()); 
     //$dad = $("#new"); 
     //$dad.children('input[name!="id"][name!="country"], textarea').val(''); 
     //$dad.children('[name="country"]').val("United States"); 
     //$dad.children('[name="date"]').focus(); 
     //END: blank 
     //$("#new").fadeIn(2000, function(){ 
     //alert($msg); 
     //}); //end: anumation.fadeIn 
     //}); //end: anumation.fadeOut 
     } //end: if 
    else 
     { 
     //var varMSG = data; 
     //alert("Hello"); 
     alert($msg); 

     //$("#add").attr("disabled", false); 
     //$("#reset").attr("disabled", false); 
     load_bar(0); 
     } //end: if.else 
    }//end: $.post.function 
); //END:$.post 
}); 
//END:ajax 
+1

potete inserire alcuni javascript campione? – rossipedia

+0

L'HTML sopra _replace_ contenuto che era già nella pagina o _add_ in esso? Poiché qualsiasi JS che utilizza gli ID elemento non funzionerà correttamente se si aggiungono copie aggiuntive con gli stessi ID (ad esempio, 'id =" modifica "' sul pulsante). Per favore mostra il tuo JS. – nnnnnn

+0

Che cosa significa "non funziona più"? – RobG

risposta

35

.clone(true) fa il trucco.

Documentazione: http://api.jquery.com/clone/

+0

Ho usato .clone (true) ma ancora non funziona. si suppone che gli elementi di span cambino colore (toggle class .required) a seconda della modifica dell'input. Eppure, ma non lo fanno. – Omar

+0

Dovremo vedere il tuo codice jQuery – rossipedia

+0

@ Omar Potresti pubblicare il codice JavaScript che clona e aggiunge questi elementi? –

0

Se i gestori vengono impostazione usando qualcosa come $ ('. Classe ') fare clic su (...)

provare qualcosa di simile, invece:.. $ (' class ') .live (' click ', ...)

Live si applica agli elementi con la classe che potrebbe non esistere ancora.

+0

Ho finalmente ottenuto il datapicker dell'interfaccia utente per funzionare dopo la clonazione. – Omar

0

Ho finalmente ottenuto il DataPicker dell'interfaccia utente per funzionare correttamente. Ho dovuto rimuovere completamente datepicker PRIMA della clonazione e aggiungerlo DOPO gli elementi di clonazione. I ragazzi dell'UI dovrebbero renderlo più facile per noi. Vai a capire!

Poco prima clonazione:

//#datepicker 
$("input[name='date']").datepicker("destroy"); 
$("input[name='date']").removeClass("hasDatepicker").removeAttr('id'); 

Dopo la clonazione:

$("input[name='date']").datepicker({ dateFormat: 'yy-mm-dd', changeMonth: true, changeYear: true, numberOfMonths: 3, showButtonPanel: true}); 
+0

Oh, sto usando .clone (true); FUNZIONA!!! Grazie @ Šime Vidas – Omar

1

Ciao Sto avendo un caso po 'uso simile, ho un po' di contenuti generati dinamicamente che contiene un pulsante , l'evento click sta rispondendo al pulsante originale ma non a quello generato, che ho già fatto:

$('.someclass').on('click', function() { 

ma ho risolto il mio problema sostituendo il il da vivere in questo modo:

$('.someclass').live('click', function() { 
+0

Brillante! Il metodo '.live' ha funzionato per me. Stavo cercando '.clone (true)' ma non riuscivo a capire come o dove. Grazie! – FrankDraws

+0

Heads up, '.live()' è stato deprecato da jQuery versione 1.7. Rif: https://api.jquery.com/live/ – UncaughtTypeError

Problemi correlati