Jquery live () против делегата ()

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

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

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

ОБНОВЛЕНИЕ

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

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

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

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

Разница между .live() и .delegate() НАМНОГО больше, чем между delegate() и .on().


person PeeHaa    schedule 02.01.2011    source источник
comment
Я взял на себя смелость обобщить этот замечательный пост и другие полезные комментарии в одном месте, для себя и на случай, если кто-то еще сочтет это полезным. JQuery live, делегат и привязка   -  person Tim    schedule 02.11.2011
comment
Начиная с версии 1.7, .live() больше нет. Вместо этого вы найдете новый метод .on().   -  person Qun Wang    schedule 07.08.2012


Ответы (4)


Я никогда не использую 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() { ... });
person lonesomeday    schedule 02.01.2011
comment
+1. Повторное использование предыдущего селектора в live() сбивает с толку и приводит к неправильному пониманию пользователем того, что он на самом деле делает. delegate() понятнее. Кроме того, хотя delegate() (в настоящее время) реализован с использованием live(), он использует версию live() с четырьмя аргументами, которая не задокументирована, поэтому, предположительно, только для внутреннего использования. Лично я всегда избегал live(), если только мне не нужно было работать на jQuery 1.3 по какой-то причине (надеюсь, что нет). - person bobince; 02.01.2011
comment
@all: Из документов jQuery: As of jQuery 1.4, live events can be bound to a DOM element "context" rather than to the default document root. Не лучше ли live() использовать сейчас, поскольку мы можем добавить контекст события. Так как delegate() звонит live() внутренне. Так что думаю на 1 звонок меньше. Или я ошибаюсь? - person PeeHaa; 16.05.2011
comment
Отличный ответ. Действительно здорово. Тем не менее, я все же предпочитаю жить. если мое приложение не является одним огромным чудовищным js-приложением, простота live больше, чем прирост производительности. Более того, поскольку я обычно буду использовать привязку (или одну из ее более коротких версий), близость великолепна. Все еще действительно отличный ответ. Заставил меня на самом деле понять разницу. +1. - person frostymarvelous; 04.10.2011
comment
@PeeHaa Я думаю, вы правы в этом, но, как упоминалось ранее, использование делегата упрощает чтение. - person trusktr; 17.12.2011
comment
@trusktr на самом деле я не мог ошибаться больше. Смотрите мой обновленный вопрос для теста производительности. - person PeeHaa; 17.12.2011
comment
это новый вид войны, священная война с распространением событий? - person Luka Ramishvili; 15.03.2012
comment
Шикарное объяснение.... - person Vicky; 15.12.2014

Они точно такие же, за исключением:

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

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

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().

person user113716    schedule 02.01.2011
comment
Я не знаю, почему этот ответ не набрал больше голосов. .delegate() использует .live(). С точки зрения производительности .delegate() явно превосходит .live(): 2690370/live-vs-bind/ - person Watermark Studios; 13.10.2011
comment
согласен .live намного медленнее. - person Simon Hayter; 18.01.2013

На ум приходят две ситуации:

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

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

person Guffa    schedule 02.01.2011

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

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

Ресурс

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

person Misagh Aghakhani    schedule 19.11.2012