JQuery live() vs delegate()

Я прочитал несколько сообщений здесь и в других местах в Интернете о различиях между live() и delegate(). Однако я не нашел ответ, который я ищу (если это обман, скажите мне).

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

Мой вопрос: есть ли ситуация, когда вы должны использовать live вместо delegate?

UPDATE

Я установил простой тест, чтобы увидеть разницу в производительности.

Я также добавил новый .on(), который доступен в jQuery 1.7 +

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

  • Не используйте .live(), если ваша версия jQuery не поддерживает .delegate().
  • Не используйте .delegate(), если ваша версия jQuery не поддерживает .on().

Разница между .live() и .delegate() равна A LOT больше, чем между delegate() и .on().

Ответ 1

Я никогда не использую live; Я считаю, что преимущества использования delegate настолько значительны, чтобы быть подавляющим.

Единственное преимущество live заключается в том, что его синтаксис очень близок к синтаксису bind:

$('a.myClass').live('click', function() { ... });

delegate, однако, использует несколько более подробный синтаксис:

$('#containerElement').delegate('a.myClass', 'click', function() { ... });

Это, однако, мне кажется гораздо более ясным о том, что на самом деле происходит. Вы не понимаете из примера live, что события фактически фиксируются на document; с delegate, ясно, что захват события происходит на #containerElement. Вы можете сделать то же самое с live, но синтаксис становится все более ужасным.

Задание контекста для захваченных событий также повышает производительность. С примером live каждый отдельный клик по всему документу должен быть сопоставлен с селектором a.myClass, чтобы увидеть, совпадает ли он. С delegate, это только элементы внутри #containerElement. Это, очевидно, улучшит производительность.

Наконец, live требует, чтобы ваш браузер искал a.myClass , существует ли он в настоящее время. delegate ищет элементы только при срабатывании событий, что дает дополнительное преимущество в производительности.


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

Обратите внимание также, что ни live, ни delegate - лучший способ делегирования событий в современном jQuery. Новый синтаксис (как и jQuery 1.7) с функцией on. Синтаксис выглядит следующим образом:

$('#containerElement').on('click', 'a.myClass', function() { ... });

Ответ 2

Они точно такие же, кроме:

  • .delegate() позволяет сузить локальный раздел страницы, а .live() - обрабатывать события на всей странице.
  • .live() начинается с отложенного выбора DOM

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

https://github.com/jquery/jquery/blob/master/src/event.js#L948-950

Как таковой, я всегда буду использовать .delegate(). Если вам действительно нужно обработать все события на странице, просто укажите body как контекст.

$(document.body).delegate('.someClass', 'click', function() {
    // run handler
});

Более старые версии jQuery действительно имеют функциональность delegate. Вам просто нужно передать селектор или элемент в качестве свойства контекста при вызове .live(). Конечно, его нужно загружать на страницу.

$('.someClass', '#someContainer').live('click',function() {
    // run handler
});

И у вас такое же поведение, как .delegate().

Ответ 3

Приходят в голову две ситуации:

  • Вы использовали бы delegate в элементе body, так что вместо этого вы можете просто использовать live, как это проще.

  • Вам нужно использовать более старую версию библиотеки jQuery, где событие delegate еще не реализовано.

Ответ 4

Рассмотрим этот пример

<ul id="items">  
   <li> Click Me </li>  
</ul>

$('#items').delegate('li', 'click', function() {  
    $(this).parent().append('<li>New Element</li>');  
});

Передавая элемент DOM в качестве контекста нашего селектора, мы можем заставить Live() вести себя (почти) так же, как это делает делегат(). Он прикрепляет обработчик к контексту, а не к документу, который является контекстом по умолчанию. Следующий код эквивалентен приведенной выше версии delegate().

$("li", $("#items")[0]).live("click", function() {  
    $(this).parent().append("<li>New Element</li>");  
}); 

Ресурс

Но вам лучше использовать делегат для лучшей производительности см. здесь