Является ли bind () быстрее, чем live () и делегат ()? - PullRequest
5 голосов
/ 11 августа 2011

Моя команда создает мобильный веб-сайт с использованием jQuery Mobile, и по мере приближения даты релиза производительность становится все более серьезной. Одно наблюдение, которое я сделал, состоит в том, что у нас есть много вызовов live() и delegate() во всем нашем коде; но на самом деле, насколько мне известно, мы только когда-либо используем эти методы для присоединения обработчиков событий к уже существующим узлам DOM (и будет всегда существовать в контексте нашего приложения) .

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

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

Ответы [ 4 ]

4 голосов
/ 11 августа 2011

Это зависит от того, как вы его используете, но делегат предлагает лучшую производительность (не обязательно только с точки зрения скорости, но в целом) в большинстве случаев:

http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/

3 голосов
/ 11 августа 2011

Я ничего не измерял, но live, вероятно, будет быстрее, чем bind для большего числа элементов, так как bind должен влиять на каждый элемент.

Если у вас bind событие с 200 элементами, jQuery должен пройти через все эти элементы и вызвать addEventListener для каждого из них.
Если вы live событие для 200 элементов, jQuery просто добавляет один обработчик события в <body>.
Тем не менее, это означает, что каждое событие, которое всплывает до тела, должно быть проверено на каждом выбранном вами селекторе live d.

Следовательно, самый быстрый вариант должен быть delegate для элемента, который содержит как можно меньше (чтобы он получал меньше других событий, которые должны быть проверены с вашим селектором)

2 голосов
/ 13 октября 2011

Я сделал простой тест против трех. Вообще говоря, Делегат является наиболее эффективным. Исключением является случай, когда элемент, к которому привязан элемент, является статическим и известным. Даже с несколькими статическими элементами, связывание неизменно превосходило делегат. У Bind действительно больше начальных служебных данных, но у Delegate больше служебных данных во время события.

Смотрите мои результаты на .live () vs .bind ()

0 голосов
/ 11 августа 2011

bind используется для привязки события непосредственно к элементу. Таким образом, событие будет прикреплено, только если элемент существует, где live и delegate используются также для динамических элементов. Это зависит от вашего использования, но в реальном времени и делегат обеспечивают лучшую производительность, чем bind

...