jQuery 1.9 .live () nie jest funkcją

242

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()?

ngplayground
źródło

Odpowiedzi:

509

jQuery .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()!


Przeczytaj przed rozpoczęciem wyszukiwania i zamień:

Dla szybkich / gorących poprawek na witrynie, nie tylko zastąpić słowa kluczowego livez 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.


Przykład migracji 1:

przed:

$('#mainmenu a').live('click', function)

następnie przenieś element potomny ( a) do .on()selektora:

$('#mainmenu').on('click', 'a', function)

Przykład migracji 2:

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, bodyzawsze działa:

$('body').on('click', '.myButton', function)

Zobacz też:

Samuel Liew
źródło
56

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;
    }
});
Liran Barniv
źródło
3
Powinien zawierać return this;na końcu funkcji w celu zachowania zdolności łączenia
Guerilla
Czy korzystanie z tego spowoduje jakieś problemy w przyszłości?
Islam Elshobokshy
15

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 ()

Sirko
źródło
Dziękujemy za wzmiankę o kompatybilnej wersji do przodu: .delegate ()
Edward Olamisan,
13

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);
          }
      }
  });
}
David Thomas
źródło
To zadziałało bardzo dobrze w moim przypadku: muszę obowiązkowo pracować na jQuery 1.11.2. Dziękuję Ci!
vcoppolecchia
5

.live () był przestarzały i został teraz usunięty z jQuery 1.9 Należy użyć .on ()

koopajah
źródło
5

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

Tofeeq
źródło
2

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/

Gerfried
źródło
3
Myślę, że składnia .on () jest wymagana tylko dla zawartości ładowanej dynamicznie (na przykład elementy dodane po załadowaniu strony).
T30
1

Jeśli akurat używasz klejnotu jQuery Ruby on Rails jquery-railsi z jakiegoś powodu nie możesz refaktoryzować swojego starszego kodu, ostatnia obsługiwana wersja to 2.1.3i 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.

fagiani
źródło