Я недавно обновил 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;
в конце функции, чтобы сохранить способность цепочки