jQuery 1.9 .live() не является функцией
Я недавно обновил jQuery с 1.8 до 2.1. Я вдруг обнаружил, что .live()
перестает работать
Я получаю ошибку TypeError: $(...).live is not a function
,
Есть ли способ, который я могу использовать вместо .live()
?
9 ответов
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)
Смотрите также:
Вы можете избежать рефакторинга своего кода, включив следующий код JavaScript
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
return this;
}
});
Форвард порт .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);
}
}
});
}
Списки документации по API jQuery live()
устарела с версии 1.7 и удалена с версии 1.9: ссылка.
версия устарела: 1.7, удалена: 1.9
Кроме того, в нем говорится:
Начиная с jQuery 1.7, метод.live () устарел. Используйте .on (), чтобы присоединить обработчики событий. Пользователи старых версий jQuery должны использовать .delegate() вместо.live ()
Очень простое исправление, которое не требует изменения вашего кода, просто добавьте скрипт миграции jquery, скачайте здесь https://github.com/jquery/jquery-migrate/
Он предоставляет устаревшие, но необходимые функции, такие как "live", "browser" и т. Д.
.live() устарела и теперь удалена из jQuery 1.9. Вы должны использовать .on()
.live был удален в 1.9, см. руководство по обновлению: http://jquery.com/upgrade-guide/1.9/
Когда я получу эту ошибку на своем сайте. Она остановит некоторые функции на моем сайте, после исследования я найду решение этой проблемы,
$colorpicker_inputs.live('focus', function(e) {
jQuery(this).next('.farb-popup').show();
jQuery(this).parents('li').css( {
position : 'relative',
zIndex : '9999'
})
jQuery('#tabber').css( {
overflow : 'visible'
});
});
$colorpicker_inputs.live('blur', function(e) {
jQuery(this).next('.farb-popup').hide();
jQuery(this).parents('li').css( {
zIndex : '0'
})
});
Следует заменить "live" на "on", проверьте ниже
$colorpicker_inputs.on('focus', function(e) {
jQuery(this).next('.farb-popup').show();
jQuery(this).parents('li').css( {
position : 'relative',
zIndex : '9999'
})
jQuery('#tabber').css( {
overflow : 'visible'
});
});
$colorpicker_inputs.on('blur', function(e) {
jQuery(this).next('.farb-popup').hide();
jQuery(this).parents('li').css( {
zIndex : '0'
})
});
Еще один базовый пример ниже:
.live(event, selector, function)
Измените его на:
.on(event, selector, function)
Я склонен не использовать синтаксис.on(), если в этом нет необходимости. Например, вы можете мигрировать проще, как это:
старый:
$('.myButton').live('click', function);
новые:
$('.myButton').click(function)
Вот список допустимых обработчиков событий: https://api.jquery.com/category/forms/
Если вы используете гем jQuery для Ruby on Rails jquery-rails
и по какой-то причине вы не можете реорганизовать свой прежний код, последняя версия, которая все еще поддерживает 2.1.3
и вы можете заблокировать его, используя следующий синтаксис Gemfile
:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
Затем вы можете использовать следующую команду для обновления:
bundle update jquery-rails
Я надеюсь, что помочь другим, сталкивающимся с подобной проблемой.