2011-11-03 10 views
15

Ilekroć używam ajax do dynamicznego tworzenia nowych treści, .clone(), dołączania() etc, nowy element traci żadnych wyzwalaczy i zdarzeń I zaprogramowane = (jQuery: Elementy Clone i wydarzenia

Po wykonaniu kopii, prosty rzeczy, które WORK na innych elementach, takich jak dodanie klasy, na skopiowanych elementach już nie działają Żadne nowe treści ajaxowe nie działają Przyciski poleceń już nie działają Co mogę zrobić?

Klonowałem ten HTML, i Przyciski poleceń przestały działać Stylizacja elementów zakresu nie działa już w elementach 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 --> 

Nowe komentarze dodał 11/03/2011:

OK, zorientowali się problem i miałem błąd na moim jQuery. Teraz, kiedy dodaję .clone (true) ALMOST wszystko działa.


Mój nowy problem to datownik danych interfejsu użytkownika. Po sklonowaniu kodu HTML, po kliknięciu nowo sklonowanego pola daty fokus przechodzi do (starej) daty, z której dane zostały sklonowane. Co więcej, jeśli wybiorę datę, wartość zostanie przeniesiona do starego pola daty - Nie jest to nowo sklonowane pole daty.

Oto mój kod ajax (Po udanym submition):

kod UI 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

można zakładać jakiś przykładowy skrypt? – rossipedia

+0

Czy HTML powyżej _replace_ zawartości, która była już na stronie, lub _add_ do niego? Ponieważ dowolny JS, który używa identyfikatorów elementów, nie będzie działał poprawnie, jeśli dodajesz dodatkowe kopie z tymi samymi identyfikatorami (np. 'Id =" edytuj "' na swoim przycisku). Proszę pokazać swój JS. – nnnnnn

+0

Co oznacza "już nie działa"? – RobG

Odpowiedz

35

.clone(true) załatwia sprawę.

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

+0

Użyłem .clone (true), ale nadal nie działa. elementy span mają zmienić kolor (zmiana klasy) wymagane w zależności od zmiany wejścia. Ale tak nie jest. – Omar

+0

Będziemy musieli zobaczyć Twój kod jQuery – rossipedia

+0

@Omar Czy możesz umieścić kod JavaScript, który klonuje i dołącza te elementy? –

0

Jeśli teleskopowe są ustawione za pomocą czegoś podobnego $ (”. Klasa ') kliknij (...)

Spróbuj coś takiego zamiast:. $ (' class. ") .live (" kliknij ", ...)

Live dotyczy elementów z klasą, które mogą jeszcze nie istnieć.

+0

W końcu dostałem datepicker UI do pracy po klonowaniu. – Omar

0

W końcu otrzymałem datezestaw interfejsu użytkownika do prawidłowego działania. Musiałem całkowicie usunąć datepicker PRZED klonowaniem i dodać go po klonowaniu elementów. Faceci w interfejsie użytkownika powinni ułatwić nam pracę. Domyśl!

Tuż przed klonowaniem:

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

po klonowaniu:

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

Och, używam .clone (true); TO DZIAŁA!!! Dziękujemy @ Šime Vidas – Omar

1

Cześć Mam sprawę nieco podobnym przeznaczeniu, mam dynamicznie generowane treści, które zawiera przycisk Zdarzenie click odpowiada na oryginalny przycisk, ale nie wygenerowany, Wykonałem wcześniej:

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

ale mój problem rozwiązany przez zastąpienie przez żyć tak:

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

Genialny! Pomogła mi metoda '.live'. Próbowałem '.clone (true)', ale nie mogłem dowiedzieć się, jak i gdzie. Dzięki! – FrankDraws

+0

W górę, '.live()' jest przestarzałe od jQuery ver 1.7. Ref: https://api.jquery.com/live/ – UncaughtTypeError