JQuery: live() vs delegate()
Я использую jQuery в своем веб-приложении. Читая его документацию, я читал о live()
и delegate()
. Хотя они объяснили оба метода, я не понимаю точной разницы между ними. Также не уверен, какой метод идеален в этом сценарии.
Пожалуйста, помогите мне получить четкое представление об этих методах.
Спасибо
Ответы
Ответ 1
.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
).
Ответ 2
delegate() отображает live() в коде jQuery. Основное отличие заключается в том, что live() вызывается для элемента, для которого вы хотите делегировать события другому элементу. live() передаст эти события объекту документа.
delegate(), с другой стороны, позволяет вам установить, какие события элемента делегированы, передав селектор. События, которые пузырятся до этого элемента, обрабатываются, если исходный элемент соответствует селектору.
Как указано @NickCraver , delegate() работает лучше, чем live, потому что он не обязательно захватывает события из каждого элемента на странице, и он не запрашивает селектор сразу.
Ответ 3
Из документации jQuery:
Как и в jQuery 1.7, метод .live() устарел. Используйте .on() для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate() в предпочтении .live().
http://api.jquery.com/live/
Ответ 4
Живой метод:
$("#mymethod").live("click", function() { alert("It checks the entire DOM"); });
Live Method Checks #mymethod во всей DOM (иногда это займет время, основанное на вашем содержимом DOM)
Способ делегирования:
$('.mycontainer').delegate('#mymethod','click',function() { alert('Checks only in mycontainer portion') });
Delagate не ищет ваш DOM, который ищет его только в вашей части mycontainer. (Улучшение производительности)