Mam problem z .on()
. Mam wiele elementów formularza (z formularzami class="remember"
), a także dodaję inny form.remember
za pomocą AJAX. Tak więc chcę, aby obsługiwał takie zdarzenie, jak:
$('form.remember').on('submit',function(){...})
ale formularz dodany za pomocą AJAX nie działa z nim.
Gdzie jest problem? Czy to błąd?
$(document).on('submit','form.remember',function(){...})
document
najbliższym statycznym rodzicem.Odpowiedzi:
Musisz delegować zdarzenie na poziom dokumentu
$('form.remember').on('submit'
działa tak samo, jak,$('form.remember').submit(
ale kiedy używasz$(document).on('submit','form.remember'
, będzie działać również dla DOM dodanego później.źródło
$(document).on
ma znacznie niższą wydajność niż$('form.remember').on('submit'
. Teraz musi nasłuchiwać wszystkich zdarzeń przesyłania w dokumencie. O wiele lepiej jest trochę ograniczyć zakres niż słuchaćon
document
, jeśli to możliweMiałem problem z tymi samymi objawami. W moim przypadku okazało się, że w funkcji przesyłania brakuje instrukcji „return”.
Na przykład:
źródło
return false;
nie spowoduje to przesłania formularza. Do przesłania formularza użyjreturn true;
.Problem polega na tym, że „włączone” jest stosowane do wszystkich elementów, które istnieją W CZASIE. Gdy tworzysz element dynamicznie, musisz ponownie uruchomić on:
Ponieważ formularze zwykle mają nazwy lub identyfikatory, możesz również dołączyć je do nowego formularza. Jeśli tworzę dużo dynamicznych rzeczy, dołączę funkcję setup lub bind:
Więc za każdym razem, gdy coś tworzysz (zwykle przyciski w moim przypadku), po prostu wywołuję bindItems, aby zaktualizować wszystko na stronie.
Nie lubię używać elementów „body” lub document, ponieważ w przypadku zakładek i modali zwykle kręcą się i robią rzeczy, których się nie spodziewasz. Zawsze staram się być jak najbardziej konkretny, chyba że jest to prosty 1-stronicowy projekt.
źródło