Moja aplikacja dynamicznie dodała menu rozwijane. Użytkownik może dodać tyle, ile potrzebuje.
Tradycyjnie używałem live()
metody jQuery do wykrywania, kiedy edowano jedno z tych rozwijanych menu change()
:
$('select[name^="income_type_"]').live('change', function() {
alert($(this).val());
});
Od jQuery 1.7 zaktualizowałem to do:
$('select[name^="income_type_"]').on('change', function() {
alert($(this).val());
});
Patrząc na Dokumenty, powinno to być całkowicie poprawne (prawda?) - ale moduł obsługi zdarzeń nigdy nie odpala. Oczywiście potwierdziłem, że jQuery 1.7 jest załadowany i działa itp. W dzienniku błędów nie ma błędów.
Co ja robię źle? Dzięki!
javascript
jquery
jquery-1.7
Jacek
źródło
źródło
live
tak używaon
, więc ponowne zapisanie starszego kodu może nie być jeszcze potrzebne, dopókilive
nie zostanie usunięte, co moim zdaniem wynosi 1,9. Fragment źródła 1.7.1:live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn ); return this;}
Jeśli więc nie przeprowadzasz aktualizacji do wersji, w którejlive
już nie ma aktualizacji, aktualizacja starszego kodu może nie być potrzebna od razu. W przypadku nowego kodu użycie oczywiścieon()
jest zamiast tego zalecane. Pomyślałem, że ta informacja może pomóc komuś innemu na pewnym etapie.live
sięon
.Odpowiedzi:
W
on
dokumentacji Zjednoczone (pogrubione;)):Odpowiednikiem
.live()
byłoby coś takiegoChociaż lepiej jest powiązać moduł obsługi zdarzeń jak najbliżej elementów, to znaczy elementu znajdującego się bliżej w hierarchii.
Aktualizacja: Odpowiadając na inne pytanie, dowiedziałem się, że jest to również wspomniane w
.live
dokumentacji :źródło
bind
,live
idelegate
wywołaniaon
..live
>.on
.on
składnia jest bardziej logiczna, ponieważ detektor jest faktycznie podłączony do podanego selektora. Gdy zdarzenie jest wyzwalane, jQuery przechodzi przez DOM i wykonuje procedury obsługi tam, gdzie zostało to określone (proste delegowanie zdarzeń)..live
zasugerował, że wydarzyło się coś „magicznego”, i powiedziano, że dołącza procedury obsługi zdarzeń dla „przyszłych elementów”, co nie było do końca prawdą.Oprócz wybranej odpowiedzi
Port
jQuery.live
do jQuery 1.9+ poczekaniu dla aplikacji do migracji. Dodaj to do pliku JavaScript.Uwaga: Powyższa funkcja nie będzie działać z jQuery v3, ponieważ
this.selector
została usunięta.Lub możesz użyć https://github.com/jquery/jquery-migrate
źródło
Właśnie znalazłem lepsze rozwiązanie, które nie wymaga edycji kodu innej firmy:
https://github.com/jquery/jquery-migrate/#readme
Zainstaluj pakiet jQuery Migrate NuGet w programie Visual Studio, aby wszystkie problemy z wersjonowaniem zniknęły. Następnym razem Microsoft zaktualizuje swoje dyskretne moduły AJAX i moduły sprawdzania poprawności, być może wypróbuje je ponownie bez skryptu migracji, aby sprawdzić, czy problem został rozwiązany.
Ponieważ jQuery Migrate jest utrzymywane przez jQuery Foundation, myślę, że jest to nie tylko najlepsze podejście do bibliotek stron trzecich, ale także do otrzymywania komunikatów ostrzegawczych dla twoich bibliotek, szczegółowo opisujących ich aktualizację.
źródło
Oprócz wybranych odpowiedzi
Jeśli korzystasz z Visual Studio , możesz użyć Regex Replace .
W Edycji> Znajdź i zamień> Zamień w plikach
lub Ctrl + Shift + H
W wyskakującym okienku Znajdź i zamień ustaw te pola
Znajdź:
\$\((.*)\)\.live\((.*),
Zamień na:
$(document.body).on($2,$1,
W opcjach wyszukiwania zaznacz „Użyj wyrażeń regularnych”
źródło
jquery wersja xxxjs otwórz edytor, znajdź
jQuery.fn.extend
dodaj kod
Przykład: jquery-2.1.1.js -> wiersz 7469 (jQuery.fn.extend)
Przykładowy widok zdjęć
źródło