Недавно я обновил 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);
}
}
});
В документации 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
.live() устарел и теперь удален из jQuery 1.9 Вы должны использовать . On()
Очень простое исправление, которое не требует изменения кода, просто добавьте jquery migration script, загрузите здесь https://github.com/jquery/jquery-migrate/
Он поставляет jquery устаревшие, но необходимые функции, такие как "live", "browser" и т.д.
Я не хочу использовать синтаксис .on(), если это не необходимо. Например, вы можете легко выполнить миграцию следующим образом:
старый:
$('.myButton').live('click', function);
новый
$('.myButton').click(function)
Ниже приведен список допустимых обработчиков событий: https://api.jquery.com/category/forms/
Если вы используете JQuery gem Ruby on Rails, и по какой-то причине вы не можете реорганизовать свой устаревший код, последняя версия, которая все еще поддерживает, - 2.1.3
, и вы можете заблокировать ее, используя следующий синтаксис вашего Gemfile
:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
то вы можете использовать следующую команду для обновления:
bundle update jquery-rails
Я надеюсь, что это поможет другим, столкнувшимся с подобной проблемой.
Сверху только
Если вы не знаете, что поставить в качестве родителя, тело всегда работает:
$('body').on('click', '.myButton', function)
$('.jcrop-tracker').live('dblclick', function () {
$('#btnCrop').trigger("click");
});
становится
$('body').on('dblclick', '.jcrop-tracker', function () {
$('#btnCrop').trigger("click");
});