Вы будете создавать меньшую нагрузку на ЦП при привязке событий, используя $(<root-element>).on(<event>, <selector>)
, так как вы будете привязываться к одному «корневому» элементу вместо потенциально большего количества отдельных элементов-потомков (каждое связывание занимает время ...).
При этом вы будете нести больше ресурсов ЦП, когда происходят реальные события, так как они должны поднять DOM до "корневого" элемента.
Краткий рассказ: делегат сохраняет ЦП при привязке обработчики событий ; bind сохраняет процессор, когда события вызывают (например, пользователь что-то щелкает).
Так что вам решать, какая точка важнее для производительности. Есть ли у вас доступный процессор при добавлении новых элементов? Если это так, то привязка непосредственно к новым элементам была бы наилучшей для общей производительности, однако, если добавление элементов является ресурсоемкой операцией, вы, вероятно, захотите делегировать привязку события и позволить инициирующему событию создать дополнительную нагрузку на ЦП из всех пузырьков.
Обратите внимание, что:
$(<root-element>).on(<event>, <selector>, <event-handler>)
совпадает с:
$(<root-element>).delegate(<selector>, <event>, <event-handler>)
и это:
$(<selector>).on(<event>, <event-handler>)
совпадает с:
$(<selector>).bind(<event>, <event-handler>)
.on()
является новым в jQuery 1.7, и если вы используете 1.7+, то .delegate(<selector>, <event>, <event-handler>)
- это просто сокращение для .on(<event>, <selector>, <event-handler>)
.
UPDATE
Вот тест производительности, показывающий, что быстрее делегировать привязку события, чем отдельную привязку к каждому элементу: http://jsperf.com/bind-vs-click/29. К сожалению, этот тест производительности был удален.
UPDATE
Вот тест производительности, показывающий, что запуск события происходит быстрее, когда вы привязываете напрямую к элементам, а не делегируете привязку: http://jsperf.com/jquery-delegate-vs-bind-triggering (Обратите внимание, что это не идеальный тест производительности, поскольку методы привязки включены в тест, но поскольку delegate
работает быстрее при связывании, это просто означает, что bind
еще быстрее относительно разговора)