jQuery 1.9 .live () - не функція


242

Я нещодавно оновив jQuery з 1,8 до 2,1. Я раптом виявив, що .live()зупинки працюють.
Я отримую помилку TypeError: $(...).live is not a function.

Чи є якийсь метод, який я можу використовувати замість .live()?

Відповіді:


509

jQuery .live()видалено у версії 1.9.

Це означає, що якщо ви оновлюєте версію 1.8 та більш ранніх версій, ви помітите, що речі порушуються, якщо ви не дотримуєтесь інструкції з міграції, наведеної нижче. Ви не повинні просто замінити .live()на .on()!


Прочитайте, перш ніж почати пошук та заміну:

Для швидких / хотфиксов на живому сайті, НЕ просто замінити ключове слово liveз on,
так як параметри різні !

.live(events, function)

має зіставити карту:

.on(eventType, selector, function)

Селектор (дитина) дуже важливий! Якщо вам не потрібно використовувати це з будь-якої причини, встановіть його null.


Приклад міграції 1:

перед:

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

після цього ви переміщуєте дочірній елемент ( a) до .on()селектора:

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

Приклад міграції 2:

перед:

$('.myButton').live('click', function)

після цього ви переміщуєте елемент ( .myButton) до .on()селектора і знаходять найближчий батьківський елемент (бажано з ідентифікатором):

$('#parentElement').on('click', '.myButton', function)

Якщо ви не знаєте, що поставити як батьків, bodyзавжди працює:

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

Дивитися також:


56

Ви можете уникнути рефакторингу коду, включивши наступний код JavaScript

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});

3
Слід включити a return this;в кінці функції, щоб зберегти ланцюгові здібності
Партизана

Чи використання цього спричинить проблеми в майбутньому?
Іслам Елшобокші

15

Документація API jQuery перераховує live()як застарілу з версії 1.7, так і видалену за версією 1.9: посилання .

застаріла версія: 1.7, видалено: 1.9

Крім того, він говорить:

Станом на jQuery 1.7 метод .live () застарілий. Використовуйте .on (), щоб приєднати обробники подій. Користувачі старих версій jQuery повинні використовувати .delegate (), щоб віддати перевагу .live ()


Дякуємо, що згадали про сумісну вперед версію: .delegate ()
Edward Olamisan

13

Порт .live()переадресації для jQuery> = 1.9 Уникає рефакторингу залежностей JS від .live() контексту вибору 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);
          }
      }
  });
}

У моєму випадку це було чудово: я працював обов'язково на jQuery 1.11.2. Дякую!
vcoppolecchia

5

.live () був застарілим і тепер його видалено з jQuery 1.9. Ви повинні використовувати .on ()



5

Дуже просте виправлення, яке не потребує зміни вашого коду, просто додайте сценарій міграції jquery, завантажте тут https://github.com/jquery/jquery-migrate/

Він постачає jquery застаріле, але потрібні функції, такі як "live", "browser" тощо


2

Я, як правило, не використовую синтаксис .on (). Наприклад, ви можете мігрувати простіше так:

старий:

$('.myButton').live('click', function);

нове:

$('.myButton').click(function)

Ось перелік дійсних обробників подій: https://api.jquery.com/category/forms/


3
Я думаю, що синтаксис .on () потрібен лише для динамічно завантаженого вмісту (наприклад, елементів, доданих після завантаження сторінки).
T30

1

Якщо ви користуєтеся каменем jQuery Ruby on Rails jquery-railsі чомусь не можете переробити свій застарілий код, остання версія, яка все ще підтримується, 2.1.3і ви можете заблокувати її, використовуючи наступний синтаксис на своєму Gemfile:

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

то для оновлення можна використовувати таку команду:

bundle update jquery-rails

Я сподіваюся, що допомогти іншим, хто стикається з подібною проблемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.