jQuery 1.9 .live () не является функцией

242

Я недавно обновил jQuery с 1.8 до 2.1. Я вдруг обнаружил, что .live()перестает работать.
Я получаю ошибку TypeError: $(...).live is not a function.

Есть ли какой-нибудь метод, который я могу использовать вместо .live()?

ngplayground
источник

Ответы:

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
Должен включать return this;в конце функции, чтобы сохранить способность цепочки
Guerilla
Вызывает ли это проблемы в будущем?
Ислам Эльшобокший
15

Документация по API jQuery live()устарела с версии 1.7 и удалена с версии 1.9: ссылка .

версия устарела: 1.7, удалена: 1.9

Кроме того, в нем говорится:

Начиная с jQuery 1.7, метод .live () устарел. Используйте .on (), чтобы присоединить обработчики событий. Пользователи старых версий jQuery должны использовать .delegate () вместо .live ()

Сирко
источник
Спасибо за упоминание версии, совместимой с форвардом: .delegate ()
Эдвард Оламисан,
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 ()

koopajah
источник
5

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

Он предоставляет устаревшие, но необходимые функции, такие как «live», «browser» и т. Д.

Tofeeq
источник
2

Я склонен не использовать синтаксис .on (), если в этом нет необходимости. Например, вы можете мигрировать проще, как это:

старый:

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

новые:

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

Вот список допустимых обработчиков событий: https://api.jquery.com/category/forms/

Gerfried
источник
3
Я думаю, что синтаксис .on () необходим только для динамически загружаемого контента (например, элементов, добавляемых после загрузки страницы).
T30
1

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

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

тогда вы можете использовать следующую команду для обновления:

bundle update jquery-rails

Я надеюсь, что помочь другим, сталкивающимся с подобной проблемой.

fagiani
источник