Niedawno zaktualizowałem jQuery z 1.8 do 2.1. Nagle odkryłem, że .live()
przestaje działać.
Dostaję błąd TypeError: $(...).live is not a function
.
Czy jest jakaś metoda, której mogę użyć zamiast .live()
?
Niedawno zaktualizowałem jQuery z 1.8 do 2.1. Nagle odkryłem, że .live()
przestaje działać.
Dostaję błąd TypeError: $(...).live is not a function
.
Czy jest jakaś metoda, której mogę użyć zamiast .live()
?
Odpowiedzi:
.live()
został usunięty w wersji 1.9 i nowszych.Oznacza to, że jeśli aktualizujesz z wersji 1.8 i wcześniejszych, zauważysz, że coś się psuje, jeśli nie postępujesz zgodnie z poniższym przewodnikiem migracji. Nie należy po prostu wymienić .live()
się .on()
!
Dla szybkich / gorących poprawek na witrynie, nie tylko zastąpić słowa kluczowego live
z on
,
jak parametry są różne !
.live(events, function)
powinien odwzorować na:
.on(eventType, selector, function)
Selektor (dziecko) jest bardzo ważny! Jeśli nie musisz tego używać z jakiegokolwiek powodu, ustaw go na null
.
przed:
$('#mainmenu a').live('click', function)
następnie przenieś element potomny ( a
) do .on()
selektora:
$('#mainmenu').on('click', 'a', function)
przed:
$('.myButton').live('click', function)
następnie przenieś element ( .myButton
) do .on()
selektora i znajdź najbliższy element nadrzędny (najlepiej z identyfikatorem):
$('#parentElement').on('click', '.myButton', function)
Jeśli nie wiesz, co umieścić jako rodzic, body
zawsze działa:
$('body').on('click', '.myButton', function)
Możesz uniknąć refaktoryzacji kodu, dołączając następujący kod JavaScript
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
return this;
}
});
Dokumentacja interfejsu API jQuery zawiera live()
przestarzałe od wersji 1.7 i usunięte od wersji 1.9: link .
wersja nieaktualna: 1.7, usunięta: 1.9
Ponadto stwierdza:
Od wersji jQuery 1.7 metoda .live () jest przestarzała. Użyj .on (), aby dołączyć moduły obsługi zdarzeń. Użytkownicy starszych wersji jQuery powinni używać .delegate () zamiast .live ()
Port przesyłania dalej .live()
dla jQuery> = 1,9 Unika refaktoryzacji zależności JS na .live()
Wykorzystuje zoptymalizowany kontekst selektora DOM
/**
* Forward port jQuery.live()
* Wrapper for newer jQuery.on()
* Uses optimized selector context
* Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
}
});
}
.live został usunięty w wersji 1.9, zapoznaj się z instrukcją aktualizacji: http://jquery.com/upgrade-guide/1.9/#live-removed
Bardzo prosta poprawka, która nie wymaga zmiany kodu, wystarczy dodać skrypt migracji jquery, pobierz tutaj https://github.com/jquery/jquery-migrate/
Dostarcza przestarzałe jquery, ale potrzebne funkcje, takie jak „na żywo”, „przeglądarka” itp
Zwykle nie używam składni .on (), jeśli nie jest to konieczne. Na przykład możesz migrować łatwiej:
stary:
$('.myButton').live('click', function);
Nowy:
$('.myButton').click(function)
Oto lista prawidłowych procedur obsługi zdarzeń: https://api.jquery.com/category/forms/
Jeśli akurat używasz klejnotu jQuery Ruby on Rails jquery-rails
i z jakiegoś powodu nie możesz refaktoryzować swojego starszego kodu, ostatnia obsługiwana wersja to 2.1.3
i możesz go zablokować, używając następującej składni na swoim Gemfile
:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
następnie możesz użyć następującego polecenia, aby zaktualizować:
bundle update jquery-rails
Mam nadzieję, że pomogą innym w obliczu podobnego problemu.
return this;
na końcu funkcji w celu zachowania zdolności łączenia