2012-10-10 7 views
48

mam <div> z id="modal" generowane dynamicznie metodą jQuery load():zdarzeniach wyzwalanych przez dynamicznie generowanych elementu nie są ujęte przez obsługi zdarzeń

$('#modal').load('handlers/word.edit.php'); 

word.edit.php zawiera kilka elementów napędowych, które są ładowane do modalnej <div> .

Korzystanie keyup metody jQuery mogę uchwycić wartości wejściowe po pożarach zdarzeń, ale gdy elementy są dodawane dynamicznie do div modalnej, tym wydarzeniu żadnych pożarów llonger gdy użytkownik wprowadzi swój tekst.

Która metoda jQuery obsługuje obsługę zdarzeń wyzwalanych przez dynamicznie tworzone elementy?

Kod do tworzenia nowych elementów wejściowych wynosi:

$('#add').click(function() { 
    $('<input id="'+i+'" type="text" name="translations' + i + '" />') 
     .appendTo('#modal'); 

Kod do przechwytywania wartości użytkownika jest:

$('input').keyup(function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 

Ten drugi blok kodu wydaje się działać dla oryginalnych elementów, ale nie jest on uruchamiany przez nowe dynamicznie generowane elementy.

+0

Zainstalowałem również dwie wersje jQuery na moim ** index.php ** ' ' ale nie działa funkcja ** na ** działa tylko funkcja ** na żywo ** ** edycja: #modal na wejście ** . \t \t '$ ('wejście') mieszka ('keyUp', 'wprowadzanie', funkcja() { \t \t \t obsługi = $ (tym) .val(); \t \t \t nazwa = $ (this) .attr ('name'); \t \t alert (program obsługi + "" + nazwa); \t \t}); " kiedy używam kodu, więc działa dobrze, jeszcze raz dziękuję za pomoc :) – redbull330

+0

Tylko uwaga. Nie ładujesz dwóch wersji JQuery. Załadujesz wersję 1.6.2 JQuery i 1.8.18 interfejsu JQuery. Interfejs JQuery jest używany dla komponentów interfejsu użytkownika i nie jest tym samym co JQuery. Aby uzyskać najlepszą wersję próbną, spróbuj użyć JQuery z zasobu online, takiego jak Google zamiast pliku lokalnego. –

+0

@Carlos Eduardo Bruno Pereira Dzięki za dobre rozliczenie, Zawsze uważałem, że oba mają ten sam pakiet już istnieje tylko -ui z dodatkowymi funkcjami dodanymi, ale tak nie było :) – redbull330

Odpowiedz

38

Trzeba delegate the event do najbliższego statycznego elementu przodka w obrębie strony (patrz także "Understanding Event Delegation"). Oznacza to po prostu, że element, w którym wiąże się program obsługi zdarzeń, musi już istnieć w momencie, gdy program obsługi jest powiązany, więc w przypadku dynamicznie generowanych elementów należy zezwolić, aby zdarzenie wywołało bańki w górę i obsłużyło je dalej.

Metoda jQuery .on jest sposobem na zrobienie tego (lub .delegate dla starszych wersji jQuery.)

// If version 1.7 or above 

$('#modal').on('keyup', 'input', function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 

Albo w starszych wersjach

// If version 1.6 or below 

// note the selector and event are in a different order than above 
$('#modal').delegate('input', 'keyup', function() 
{ 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 
+2

Twoja odpowiedź, artykuł, z którym się łączyłeś, i @ernie wspominające o '' bardzo pomogły mi zrozumieć jak działa '.on()'. Dziękuję Ci! –

+0

Naprawdę pomocna odpowiedź, bardzo dziękuję za informacje – alxrb

6

Dzieje się tak, ponieważ dodajesz element wejściowy po podłączyłeś wydarzenie. Spróbuj .on:

$('body').on('keyup', 'input', function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 

Korzystanie .on zadba zdarzenie keyup jest podłączony do wejść, które są na stronie pierwotnie, jak również te, które są dodawane później dynamicznie.

+0

Przepraszam, wcześniej pracowałem wejścia, które załadowane przed appendTo() w ** modalny ** div ale teraz oba nie działają i nie rozumiem co to jest ** na ** używając i myślę, że elementy wejściowe znajdują się w ** modalnym ** div nie w ** body ** ale każdy div musi znajdować się w ** ciele ** nie wiem, ale to nie działa – redbull330

+0

Możesz c hange '' body'' do dowolnego selektora, na który masz ochotę. Ten selektor powinien jednak działać. Twój modalny HTML nadal będzie w ciele, ponieważ nie może znajdować się poza nim. – Gromer

3

Gdy dynamicznie zmieniasz DOM, jQuery nie dołącza do nich programów obsługi zdarzeń. Trzeba użyć on() and delegated events

za przedmioty wejściowych, trzeba coś takiego:

$("<parentSelector>").on("keyup", "input", function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}) 

Jeżeli parentSelector jest czymś wyższym niż w DOM elementu wejściowego, a element, który istnieje na stronie obciążenia , może identyfikator formularza lub coś takiego.

+0

Twoje ostatnie zdanie naprawdę pomogło mi zrozumieć tę koncepcję. Dziękuję Ci! –

1

Powiązania funkcji są wykonywane podczas ładowania strony. Do pracy nad elementami tworzonymi dynamicznie za pomocą funkcji live(). Przykład:

$ ("p"). live ("click", function() { 
    // Your function 
}); 
+4

Podobnie jak uwaga, [.live()] (http://api.jquery.com/live/) jest przestarzałe od wersji jQuery 1.7, więc dobrze jest przejść na [.on()] (http: //api.jquery.com/on/) – ernie

+0

Ups, dzięki za informację, byłem naprawdę nieaktualny! Przepraszam. –

0

Jeśli trzeba uchwycić zmiany dla wszystkich elementów formy, zwłaszcza wybranych polach, wiem, że nie są tutaj wymienione, ale warto wiedzieć , należy użyć następującego kodu:

$(document).on('change', ':input', function() { 
    alert('value of ' + $(this).attr('name') + ' changed') 
}); 

ta powinna obejmować wszystkie input, textarea, select, checkbox, radio, itp.

Powiązane problemy