В чем разница между jQuery .live() и .on()

Я вижу, что в jQuery 1.7 есть новый метод .on(), который заменяет .live() в более ранних версиях.

Мне интересно узнать разницу между ними и преимущества использования этого нового метода.


person ajbeaven    schedule 07.11.2011    source источник


Ответы (8)


В документах довольно ясно, почему вы не хотите использовать live. Также, как упоминал Феликс, .on — это более простой способ присоединения событий.

Использование метода .live() больше не рекомендуется, поскольку более поздние версии jQuery предлагают лучшие методы, не имеющие недостатков. В частности, при использовании .live() возникают следующие проблемы:

  • jQuery пытается получить элементы, указанные селектором, перед вызовом метода .live(), что может занять много времени в больших документах.
  • Методы цепочки не поддерживаются. Например, $("a").find(".offsite, .external").live( ... ); неверно допустимо и не работает должным образом.
  • Поскольку все события .live() присоединяются к элементу document, события проходят самый длинный и самый медленный путь, прежде чем они будут обработаны.
  • Вызов event.stopPropagation() в обработчике событий неэффективен для остановки обработчиков событий, прикрепленных ниже в документе; событие уже распространилось на document.
  • Метод .live() взаимодействует с другими методами событий неожиданным образом, например, $(document).unbind("click") удаляет все обработчики кликов, прикрепленные любым вызовом .live()!
person aziz punjani    schedule 07.11.2011
comment
Просто интересно, если это то, почему они не улучшили метод live вместо того, чтобы создавать новый метод on. Разве есть что-то живое, но не включенное? - person neobie; 06.10.2012
comment
@neobie, это для того, чтобы сделать ваш код более осмысленным и иметь единообразие. - person Om Shankar; 26.02.2013
comment
@neobie: я думаю, это для обеспечения обратной совместимости. Различия, указанные в этом ответе, показывают, как их поведение немного отличается. Если бы live() было изменено, чтобы иметь поведение on(), это могло бы нарушить существующий код. Разработчики jQuery показали, что они не обязательно боятся сломать устаревший код, но я полагаю, что в данном случае они решили, что имеет смысл не рисковать внедрением регрессий. - person rinogo; 01.06.2017
comment
Похоже, это так. live() устарел в 1.7 и удален в 1.9. api.jquery.com/live - person rinogo; 01.06.2017

Одно отличие, на которое люди натыкаются при переходе от .live() к .on(), заключается в том, что параметры для .on() немного отличаются при привязке событий к элементам, динамически добавляемым в DOM.

Вот пример синтаксиса, который мы использовали для метода .live():

$('button').live('click', doSomething);

function doSomething() {
    // do something
}

Теперь, когда .live() объявлен устаревшим в версии jQuery 1.7 и удален в версии 1.9, вы должны использовать метод .on(). Вот эквивалентный пример с использованием метода .on():

$(document).on('click', 'button', doSomething);

function doSomething() {
    // do something
}

Обратите внимание, что мы вызываем .on() для документа, а не для самой кнопки. Мы указываем селектор для элемента, чьи события мы слушаем во втором параметре.

В приведенном выше примере я вызываю .on() для документа, однако вы получите лучшую производительность, если будете использовать элемент ближе к вашему селектору. Любой элемент-предок будет работать до тех пор, пока он существует на странице до того, как вы вызовете .on().

Это объясняется здесь, в документации, но его довольно легко пропустить.

person ajbeaven    schedule 17.09.2013

См. официальный блог.

[..]Новые API-интерфейсы .on() и .off() объединяют все способы присоединения событий к документу в jQuery — и они короче для ввода![...]

person FloydThreepwood    schedule 07.11.2011

.live()

Этот метод используется для присоединения обработчика событий ко всем элементам, которые соответствуют текущему селектору, сейчас и в будущем.

$( "#someid" ).live( "click", function() {
  console.log("live event.");
});

а также

.on()

Этот метод используется для присоединения функции обработчика событий для одного или нескольких событий к выбранным элементам, приведенным ниже в качестве примера.

$( "#someid" ).on( "click", function() {
  console.log("on event.");
});
person Mohammed Abrar Ahmed    schedule 14.06.2016

Хорошее руководство по разнице между онлайн и живым

Цитата из ссылки выше

Что не так с .live()

Использование метода .live() больше не рекомендуется, поскольку более поздние версии jQuery предлагают лучшие методы, не имеющие недостатков. В частности, при использовании .live() возникают следующие проблемы:

  1. jQuery пытается получить элементы, указанные селектором, перед вызовом метода .live(), что может занять много времени при работе с большими документами.
  2. Методы цепочки не поддерживаются. Например, $("a").find(".offsite, .external").live(...); недействителен и не работает должным образом.
  3. Поскольку все события .live() прикрепляются к элементу документа, события проходят самый длинный и самый медленный путь, прежде чем они будут обработаны.
  4. Вызов event.stopPropagation() в обработчике событий неэффективен для остановки обработчиков событий, прикрепленных ниже в документе; событие уже распространилось на document.
  5. Метод .live() взаимодействует с другими методами событий неожиданным образом, например, $(document).unbind("click") удаляет все обработчики кликов, прикрепленные любым вызовом .live()!
person venkat    schedule 05.09.2012

для получения дополнительной информации проверьте это.. .live() и .on()

Метод .live() используется, когда вы имеете дело с динамической генерацией содержимого... например, я создал программу, которая добавляет вкладку, когда я изменяю значение ползунка Jquery, и я хочу прикрепить функциональность кнопки закрытия к каждой вкладке который будет сгенерирован... код, который я пробовал...

var tabs = $('#tabs').tabs();
                                        // live() methos attaches an event handler for all
                                        //elements which matches the curren selector
        $( "#tabs span.ui-icon-close" ).live( "click", function() {


            // fetches the panelId attribute aria-control which is like tab1 or vice versa
            var panelId = $( this  ).closest( "li" ).remove().attr( "aria-controls" );
            $( "#" + panelId ).remove();
            tabs.tabs( "refresh" );
        });

и работает очень круто...

person Hiren    schedule 27.06.2014
comment
Добро пожаловать в СО. Пожалуйста, постарайтесь уточнить свои ответы, а не просто предоставлять ссылки, ответы только со ссылками считаются здесь плохой практикой. - person mata; 27.06.2014
comment
Спасибо .. Я буду помнить об этом для будущего ответа .. :) - person Hiren; 27.06.2014

Я являюсь автором расширения Chrome "Сохранение комментариев", которое использует jQuery. , и тот, который использовал .live(). Расширение работает таким образом, что прикрепляет прослушиватель ко всем текстовым областям с помощью .live() — это работает хорошо, поскольку всякий раз, когда документ изменяется, он по-прежнему прикрепляет прослушиватель ко всем новым текстовым областям.

Я перешел на .on(), но он тоже не работает. Он не прикрепляет прослушиватель при изменении документа, поэтому я вернулся к использованию .live(). Я думаю, это ошибка в .on(). Просто будьте осторожны с этим, я думаю.

person PixelPerfect3    schedule 01.01.2013
comment
Вы, должно быть, используете его неправильно - у него немного другой синтаксис, чем у метода .live(). Эквивалентом .on() для $('p').live('click', function () { alert('clicked'); }); является $(document).on('click', 'p', function () { alert('clicked'); });. Обратите внимание, что вы используете метод .on() для document, а затем указываете элемент, который вы хотите присоединить к обработчику событий для прослушивания, во втором параметре. - person ajbeaven; 04.01.2013
comment
Подробнее об этом можно прочитать здесь: api.jquery.com/on. См. раздел Прямые и делегированные события. - person ajbeaven; 04.01.2013
comment
Вы правы - я действительно понял, что пишу неправильно, сразу после того, как написал ответ. Он работает только частично, если вы используете его так же, как live(). Если вы напишите это правильно, on() работает, но, по моему опыту, все же не так хорошо, как live(). Я собираюсь протестировать его больше, так как производительность кажется намного лучше. - person PixelPerfect3; 07.01.2013
comment
Я бы посоветовал также прочитать эту статью: elijahmanor.com/2012/02/ - person ajbeaven; 07.01.2013
comment
@ajbeaven ты прав. Мы не можем использовать .on() как $('selector').on('event',function) для получения эффекта .live(). Для этого мы должны использовать $(document).on('event','selector',function). - person Ramsharan; 05.05.2013
comment
Мы также можем сделать $(selector1).on(event,selector2,function), где selector1 является родительским, а selector2 является дочерним для selector1. Это сводит к минимуму область поиска, поскольку вам не нужно искать весь документ. - person Ramsharan; 05.05.2013
comment
И согласно elijahmanor.com/2012/02 /, мы можем использовать .on() тремя разными способами. Его можно использовать как .bind(), .live() и .delegate(), и он ведет себя по-разному в зависимости от того, как мы его используем. - person Ramsharan; 05.05.2013
comment
@ajbeaven, вы должны превратить свой первый комментарий здесь в ответ (это то, что я искал, когда пришел сюда). - person atwright147; 17.09.2013
comment
@ atwright147 Спасибо, это хорошая идея. Я добавил новый ответ. - person ajbeaven; 18.09.2013

У меня есть требование идентифицировать событие закрытия браузера. После проведения исследований я делаю следующее, используя jQuery 1.8.3.

  1. Включите флаг, используя следующий jQuery при нажатии гиперссылки

    $('a').live('щелчок', function() {cleanSession = false;});

  2. Включите флаг, используя следующий jQuery, когда каждый раз нажимается кнопка ввода типа отправки

$("input[type=submit]").live('click',function(){alert('нажата кнопка ввода');cleanSession=false;});

  1. Включите флаг, используя следующий jQuery, когда происходит отправка формы в любое время.

$('form').live('submit', function() {cleanSession = false;});

Теперь важная вещь... мое решение работает, только если я использую .live вместо .on. Если я использую .on, то событие запускается после отправки формы, а это уже слишком поздно. Много раз мои формы отправляются с использованием вызова javascript (document.form.submit)

Таким образом, между .live и .on есть ключевое различие. Если вы используете .live, ваши события запускаются немедленно, но если вы переключаетесь на .on, они не запускаются вовремя

person N.S.    schedule 25.03.2014
comment
Это неправда, вы должны неправильно использовать .on или что-то еще в вашем коде вызывает это. Возможно, вставьте свой код для вашего метода .on. - person ajbeaven; 25.03.2014
comment
Да. Это неправда. .on() — улучшенная версия .live(). Итак, вставьте свой код сюда. Так что у нас будет некоторая ясность - person RecklessSergio; 30.01.2015