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

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ż:


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;
    }
});

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


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);
          }
      }
  });
}

To zadziałało bardzo dobrze w moim przypadku: muszę obowiązkowo pracować na jQuery 1.11.2. Dziękuję Ci!
vcoppolecchia




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/


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.