Я недавно обновил jQuery с 1.8 до 2.1. Я вдруг обнаружил, что .live()перестает работать.
Я получаю ошибку TypeError: $(...).live is not a function.
Есть ли какой-нибудь метод, который я могу использовать вместо .live()?
Я недавно обновил jQuery с 1.8 до 2.1. Я вдруг обнаружил, что .live()перестает работать.
Я получаю ошибку TypeError: $(...).live is not a function.
Есть ли какой-нибудь метод, который я могу использовать вместо .live()?
Ответы:
.live()был удален в версии 1.9 и далее.Это означает, что при обновлении с версии 1.8 и более ранних версий вы заметите, что что-то сломалось, если вы не будете следовать приведенному ниже руководству по миграции. Вы не должны просто заменить .live()на .on()!
Для быстрого / оперативного исправления на реальном сайте не просто заменяйте ключевое слово liveна on, так
как параметры разные !
.live(events, function)
следует сопоставить с:
.on(eventType, selector, function)
(Дочерний) селектор очень важен! Если вам не нужно использовать это по какой-либо причине, установите для него значение null.
перед:
$('#mainmenu a').live('click', function)
после, вы перемещаете дочерний элемент ( a) в .on()селектор:
$('#mainmenu').on('click', 'a', function)
перед:
$('.myButton').live('click', function)
после, вы перемещаете элемент ( .myButton) в .on()селектор и находите ближайший родительский элемент (желательно с идентификатором):
$('#parentElement').on('click', '.myButton', function)
Если вы не знаете, что поставить в качестве родителя, bodyвсегда работает:
$('body').on('click', '.myButton', function)
Вы можете избежать рефакторинга своего кода, включив следующий код JavaScript
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
return this;
}
});
Документация по API jQuery live()устарела с версии 1.7 и удалена с версии 1.9: ссылка .
версия устарела: 1.7, удалена: 1.9
Кроме того, в нем говорится:
Начиная с jQuery 1.7, метод .live () устарел. Используйте .on (), чтобы присоединить обработчики событий. Пользователи старых версий jQuery должны использовать .delegate () вместо .live ()
Прямой порт .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);
}
}
});
}
.live был удален в 1.9, см. руководство по обновлению: http://jquery.com/upgrade-guide/1.9/#live-removed
Очень простое исправление, которое не требует изменения вашего кода, просто добавьте скрипт миграции jquery, скачайте здесь https://github.com/jquery/jquery-migrate/
Он предоставляет устаревшие, но необходимые функции, такие как «live», «browser» и т. Д.
Я склонен не использовать синтаксис .on (), если в этом нет необходимости. Например, вы можете мигрировать проще, как это:
старый:
$('.myButton').live('click', function);
новые:
$('.myButton').click(function)
Вот список допустимых обработчиков событий: https://api.jquery.com/category/forms/
Если вы используете гем jQuery jquery-railsдля Ruby on Rails и по какой-то причине вы не можете реорганизовать свой унаследованный код, последняя поддерживаемая версия - 2.1.3и вы можете заблокировать ее, используя следующий синтаксис Gemfile:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
тогда вы можете использовать следующую команду для обновления:
bundle update jquery-rails
Я надеюсь, что помочь другим, сталкивающимся с подобной проблемой.
return this;в конце функции, чтобы сохранить способность цепочки