В чем разница между jQuery .live () и .on () - PullRequest
84 голосов
/ 08 ноября 2011

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

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

Ответы [ 8 ]

98 голосов
/ 08 ноября 2011

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

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

  • jQuery пытается получить элементы, указанные селектором, перед вызовом метода .live(), который может занять много времени набольшие документы.
  • Методы объединения не поддерживаются.Например, $("a").find(".offsite, .external").live( ... ); - это , а не , действительный и не работает должным образом.
  • Поскольку все .live() события присоединены к элементу document, события принимают самый длинный и самый медленный из возможныхпуть до их обработки.
  • Вызов event.stopPropagation() в обработчике событий неэффективен при остановке обработчиков событий, прикрепленных ниже в документе;событие уже распространилось на document.
  • Метод .live() взаимодействует с другими методами событий удивительными способами, например, $(document).unbind("click") удаляет все обработчики щелчков, связанные с любым вызовом .live()!
11 голосов
/ 18 сентября 2013

Единственное отличие, на которое люди натыкаются при переходе от .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().

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

4 голосов
/ 08 ноября 2011

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

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

2 голосов
/ 14 июня 2016
.live()

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

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

и

.on()

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

$( "#someid" ).on( "click", function() {
  console.log("on event.");
});
1 голос
/ 05 сентября 2012

Хороший учебник по разнице между в прямом эфире

Цитата по ссылке выше

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

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

  1. jQuery пытается получить элементы, указанные селектором перед вызовом метода .live (), который может занять много времени на большие документы.
  2. Методы цепочки не поддерживаются. Например, $ («A»). Find («. Offsite, .external»). Live (…); не действует и делает не работает, как ожидалось.
  3. Поскольку все события .live () прикрепляются к элемент документа, события выбирают самый длинный и самый медленный путь прежде чем они обрабатываются.
  4. Вызов event.stopPropagation () в событии обработчик неэффективен при остановке обработчиков событий, прикрепленных ниже документ; событие уже распространено на документ.
  5. The Метод .live () взаимодействует с другими методами событий способами, которые могут быть неожиданно, например, $ (document) .unbind («click») удаляет все клики обработчики, прикрепленные любым вызовом к .live ()!
0 голосов
/ 27 июня 2014

для получения дополнительной информации проверьте .. .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" );
        });

и все работает очень здорово ...

0 голосов
/ 25 марта 2014

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

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

    $ ('a').live ('click', function () {cleanSession = false;});

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

$ ("input [type = submit]"). Live ('click', function () {alert ('input button clicked'); cleanSession = false;});

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

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

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

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

0 голосов
/ 01 января 2013

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

...