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
Должен включать 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

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

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


2

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

старый:

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

новые:

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

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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.