Я нещодавно оновив 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);
}
}
});
}
.lve був видалений у 1.9, перегляньте посібник із оновлення: http://jquery.com/upgrade-guide/1.9/#live-removed
Дуже просте виправлення, яке не потребує зміни вашого коду, просто додайте сценарій міграції jquery, завантажте тут https://github.com/jquery/jquery-migrate/
Він постачає jquery застаріле, але потрібні функції, такі як "live", "browser" тощо
Я, як правило, не використовую синтаксис .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
Я сподіваюся, що допомогти іншим, хто стикається з подібною проблемою.
return this;
в кінці функції, щоб зберегти ланцюгові здібності