2010-11-17 1 views
50

Я использую jQuery в своем веб-приложении. Читая его документацию, я прочитал около live() и delegate(). Хотя они объяснили оба метода, я не понимаю точной разницы между ними. Также не уверен, какой метод идеален в этом сценарии.jQuery: live() vs delegate()

Пожалуйста, помогите мне получить четкое представление об этих методах.

Благодаря

+1

В дополнение к ответу ниже читатели могут захотеть взглянуть на это * невероятно хорошо * [статья] (http: /www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/), объясняя разницу между 'bind',' live' и 'delegate'. – Jon

+0

Краткое описание: [JQuery - live vs delegate] (http://www.timacheson.com/Blog/2011/oct/jquery_live_vs_delegate). – Tim

ответ

56

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

$(".myClass").live("click", function() { alert("Hi"); }); 

Обратите внимание, что оператор $(".myClass") побежал, что селектор, чтобы найти все элементы с этим классом , даже если мы не заботимся о них, все мы хотели была строка ".myClass", чтобы соответствовать позже при click события пузырь до document.


.delegate() фактически использует .live() внутренне, но с контекстом. Селектор не запускается сразу, поэтому он более эффективен уже, и он не прикрепляется к document (хотя он может) он намного локальнее ... и все эти другие событий из других деревьев элементов вы не забота о которых никогда даже не проверялась при барботировании ... снова более эффективно. Вот пример использования:

$("#myTable").delegate("td", "click", function() { alert("Hi"); }); 

Что здесь произошло? Мы побежали $("#myTable"), чтобы получить элемент для присоединения к (правда дороже document, но мы с помощью результата. Затем мы придаём обработчик событий, который (или в других случаях) элементов. Только clicks из в что элемент сверяется селектором "td", когда они происходят, а не от везде как .live() делает (так как всех находятся внутри document).

+0

Отличное объяснение, живые всегда пахнули мне смешно. Гораздо лучше ограничивать ваши обработчики только той частью, о которой вы заботитесь. –

+0

См. Некоторые контрольные показатели производительности http://stackoverflow.com/questions/2690370/live-vs-bind/7692651#7692651 –

6

делегата() карт для живой() в Код jQuery. Основное различие заключается в том, что live() вызывается для элемента, для которого вы хотите делегировать события другому элементу. live() делегирует эти события документ объект.

Делегат(), с другой стороны, позволяет установить, какие события элемента делегированы, передав селектор. События, которые пузырятся до этого элемента, обрабатываются, если исходный элемент соответствует селектору.

Как @NickCraver mentioned, делегат() работает лучше, чем жить, потому что это не обязательно захватывать события из каждого элемента на странице, и он не запрашивает селектор сразу.

3

От JQuery документации:

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

http://api.jquery.com/live/

0

Живая Метод:

$("#mymethod").live("click", function() { alert("It checks the entire DOM"); }); 

Текущие проверки Метод #mymethod в Весь DOM (Иногда это потребуется время на основе ваших DOM Содержание)

Делегат Метод:

$('.mycontainer').delegate('#mymethod','click',function() { alert('Checks only in mycontainer portion') }); 

Delagate не ищет всю вашу DOM, которую он ищет только в вашей части mycontainer. (Улучшение производительности)