2012-01-10 30 views
5

Próbuję powiązać funkcje z nowo dodanymi elementami za pomocą jquery ... Próbowałem już wielu przykładów w Internecie, ale jakoś nic nie działa dla mnie. Stworzyłem formularz z identyfikatorem i przyciskiem, po przesłaniu ajax ładuje elementy z innej strony i wstawia html na aktualną stronę. Wydaje się, że wszystko działa dobrze, ale nowo załadowane elementy nie zawierają żadnych zdarzeń. Oto html:Powiązanie zdarzeń z dynamicznie dodanymi elementami

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

i 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; 
}); 

Div edit-content jest ładowany bezpośrednio po elementu formularza. Ma pewne elementy, które powinny być związane z funkcjami jQuery.

+1

spróbować .live() zamiast .Na() –

+1

@ jack-all-handlu 'live' jest zastąpiona' on' patrz http://api.jquery.com/live/ – Yoshi

+1

@ jack-all-trades. I nie używa on .live() tak czy inaczej –

Odpowiedz

1

Aby dodać zdarzenia do elementów, które są dodawane do DOM po załadowaniu strony, należy użyć albo delegate(), albo jeśli używasz jQuery 1.7+ on().

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

API:
Delegate
On

+0

Używam, ale jakoś to nie działa dla mnie ... co robię źle? :/ – Alko

4

Got zasadzie dwie opcje, aby to zrobić:

  1. Bind wydarzeń po dodanie nowego HTML:

    $(this).ajaxStop(function(){ 
        $(this).after($(d).find(".edit-content").html()); 
        // do you binding here 
    }); 
    
  2. Użyj delegacji zdarzeń (z .on() lub .delegate()).

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

    To będzie przekazywać zdarzenie click do elementu .some-kontenera za ewentualne dzieci z klasy .edit przycisku, nie ma znaczenia to ona była już w DOM załadowane lub później.

+0

Próbowałem tego, ale jeśli wstawię parametr ".edit-button" w funkcji on, witryna zostanie odświeżona, jeśli ją usunę, elementy zostaną załadowane bez odświeżania. – Alko

+0

Szczerze mówiąc, nie jestem pewien, aby zrozumieć. Nie widzę, jak strona może zostać odświeżona z powodu .on(), nie ma sensu. Czy możesz edytować swoje pytanie za pomocą zmienionego kodu, aby mieć większy obraz, gdy to zrobisz? –

+0

OK, dostałem go teraz, używałem tylko dla #tclick, zmieniłem wszystkie zdarzenia na włączone (kliknięcie, funkcja() {...}) i ponownie je powiązano, działa teraz ... Nadal nie rozumiem dokładnie jak działa jquery, tylko uczenie się przez samouczki ... Powinienem kiedyś przeczytać książkę o jquery: P – Alko

Powiązane problemy