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

85

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

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

Ajbeaven
источник

Ответы:

99

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

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

  • jQuery пытается получить элементы, указанные селектором, перед вызовом .live()метода, что может занять много времени для больших документов.
  • Методы связывания не поддерживаются. Например, $("a").find(".offsite, .external").live( ... ); это не действует и не работает , как ожидалось.
  • Поскольку все .live()события присоединяются к documentэлементу, события проходят самый длинный и самый медленный путь, прежде чем они будут обработаны.
  • Вызов event.stopPropagation() обработчика событий неэффективен для остановки обработчиков событий, прикрепленных ниже в документе; событие уже распространено на document.
  • Этот .live()метод взаимодействует с другими методами событий неожиданным образом, например, $(document).unbind("click")удаляет все обработчики кликов, прикрепленные к любому вызову .live()!
Азиз Пунджани
источник
8
Просто интересно, если дело в том, почему они не улучшили live-метод вместо того, чтобы создать новый on-метод. Разве что-то живое можно сделать, но не дальше?
neobie 06
1
@neobie, Это для того, чтобы сделать ваш код более значимым и единообразным
Ом Шанкар,
@neobie: Я полагаю, это для поддержания обратной совместимости. Различия, указанные в этом ответе, показывают, насколько их поведение немного отличается. Если live()были изменены, чтобы иметь поведение on(), это могло бы нарушить существующий код. Ребята из jQuery показали, что они не обязательно боятся «сломать» устаревший код, но я полагаю, что в этом случае они решили, что имеет смысл не рисковать регрессией.
rinogo 01
Похоже, это так. live()устарела в версии 1.7 и была удалена в версии 1.9. api.jquery.com/live
rinogo 01
11

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

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

Ajbeaven
источник
4

Смотрите официальный блог

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

ФлойдТрипвуд
источник
2
.live()

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

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

а также

.on()

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

$( "#someid" ).on( "click", function() {
  console.log("on event.");
});
Мохаммед Абрар Ахмед
источник
1

Хороший учебник по разнице между on и live

Цитата из приведенной выше ссылки

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

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

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

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

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

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" );
        });

и работает довольно круто ...

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

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

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

PixelPerfect3
источник
10
Вы, должно быть, используете его неправильно - у него немного другой синтаксис, чем у .live()метода. Эквивалент .on()для $('p').live('click', function () { alert('clicked'); });is $(document).on('click', 'p', function () { alert('clicked'); });. Обратите внимание, что вы используете .on()метод для, documentа затем указываете элемент, к которому вы хотите присоединить обработчик событий, чтобы прослушивать его во втором параметре.
ajbeaven
1
Вы можете прочитать об этом здесь: api.jquery.com/on . Посмотрите под заголовком Прямые и делегированные мероприятия
ajbeaven
1
Я бы посоветовал прочитать и эту статью: elijahmanor.com/2012/02/…
ajbeaven
1
Мы также можем сделать $ (selector1) .on (event, selector2, function), где selector1 - родительский, а selector2 - дочерний для selector1. Это минимизирует область поиска, так как вам не нужно искать весь документ.
Рамшаран
1
@ajbeaven, вы должны превратить свой первый комментарий здесь в ответ (это то, что я искал, когда приехал сюда).
atwright147
-1

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

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

    $ ('a'). live ('щелчок', функция () {cleanSession = false;});

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

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

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

$ ('форма'). live ('отправить', функция () {cleanSession = false;});

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

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

NS
источник
1
Это неправда, вы должны использовать .onнеправильно, или что-то еще в вашем коде вызывает это. Возможно, вставьте свой код для своего .onметода.
ajbeaven
Да уж. Это неправда. .on () - это улучшенная версия .live (). Итак, вставьте сюда свой код. Так что у нас будет некоторая ясность
RecklessSergio