Недостатки всегда использовать live() вместо bind() для уникальных элементов dom?

При записи событий привязки jQuery я обычно использую псевдонимы bind() (click(), submit() и т.д.).

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

В пределах параметров ID-селекторов (например, < #foo ', а не .classes или элементов ('input')):

Существуют ли какие-либо недостатки, которые всегда используются live() вместо bind() для этих типов привязок, помимо отсутствия удобных псевдонимов, поскольку может быть только один элемент DOM, привязанный к определенному идентификатору?

===========

EDIT: я не спрашиваю, что такое разница между bind() и live(); которые были охвачены. Я спрашиваю, каковы недостатки использования live() по умолчанию, так как соблазн должен делать это в тех случаях, когда вы не можете ошибочно игнорировать (т.е. Когда используете #uniqueDomElement) и избегать мышления о том, когда bind() не подходит.

Ответ 1

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

  • Есть ли у меня .live() события для этого типа событий?
  • Если это так, делает ли элемент событие из соответствующих селекторов для тех .live() обработчиков?

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

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

Ответ 2

Проблема, связанная с привязкой, заключается в том, что вы должны сделать вызов для привязки после того, как элементы появятся на странице. В общем, люди вызывают привязку к документу, чтобы они могли прикреплять поведение к элементам на странице. Если элемент добавляется на страницу через javascript, после этого вам нужно будет применить тот же вызов вызова для новых добавленных элементов, что часто бывает громоздким, и поэтому вы можете использовать вместо него .live.

.live использует делегирование делегаций, что означает, что вместо того, чтобы иметь обработчик функций, привязанный к определенным элементам на странице, jquery управляет всеми различными живыми вызовами, так что когда вы делаете какое-то действие, для которого существует живой обработчик, он будет проверьте, соответствует ли элемент, который вы выполнили это действие, данному селектору (я считаю, что так оно и работает). Я предполагаю, что он добавит событие в тело документа (для кликов/действий мыши). Я не уверен в специфике, но я знаю, что, без сомнения, вы можете получить какое-то странное поведение с живым, если используете его для всего. Обычно его лучше всего использовать, если у вас есть тонны элементов, к которым вы примете какое-либо поведение, или если вы будет добавлять эти элементы динамически через javascript.

Прочтите документы для получения дополнительной информации: http://api.jquery.com/live/

Ответ 3

Это балансирующий акт. Live() связывает события с документом и ищет целевую аудиторию. Преимущество для жизни (например, делегирование событий в целом) заключается в том, что вы связываете только один обработчик событий для бесконечного числа аргументов. Bind() привязывает обработчик события непосредственно к самому элементу, поэтому, если у вас есть 1000 строк в таблице, и вы запустите $('tr').bind(...), вы будете привязывать 1000 обработчиков событий. Если вы сделали $('tr').live(...), тогда вы просто привязывали бы один обработчик событий.

Вы можете встречаться посередине, используя .delegate(), отличающийся от того, как жить, потому что вы указываете контекст события. Таким образом, он не всегда срабатывает, таким образом, более эффективен. Используя пример таблицы, вы должны использовать $('table').delegate('tr', 'click', function() { .... });. Вы получаете преимущества как bind, так и live w/минимальные недостатки: вы связываете 1 обработчик событий, его будущее доказательство (w/i контекст только этой таблицы), вы не пересекаете весь dom, ища "tr" элементы.

Привязать, жить и делегировать все имеют свое место.

Кроме того, на стороне примечание делегат - это просто еще один способ сделать $('tr', $('table') [0]). live(), но это выглядит уродливо, поэтому существует делегат.