$.live()
... немного более кратко, если вам не нужно использовать определенный элемент для контекста.
$.delegate()
... немного удобнее, если у вас уже выбран контекст, особенно если вы приковываете цепью для выполнения других операций в этом контексте.
... немного более эффективен при условии, что вы не выполняете никаких других операций с целевыми элементами, поскольку он не требует ненужной оценки селектора цели во время связывания.
... позволяет настроить таргетинг на несколько контекстов, чего не делает live () (хотя см. Примечание по реализации ниже).
В противном случае, это вопрос личных предпочтений. Вы можете выполнить одно и то же с обоими методами - действительно, текущая (начиная с 1.4.2) реализация delegate
просто делегатов в live
!
delegate: function( selector, types, data, fn ) {
return this.live( types, data, fn, selector );
}
Замечание по реализации
Несмотря на то, что вы могли бы эффективно использовать текущую реализацию live () в качестве замены для всех форм делегата (), вы должны избегать вызова live () так, как его называет делегат () - недокументированного четвертый параметр предназначен только для внутреннего использования. Обычно вы предоставляете контекст для live () так же, как вы предоставляете контекст для любого селектора jQuery - передавая элемент в качестве второго параметра в $ ():
$(selector, contextElem).live(...);
Если вам нужно использовать селектор для контекста (как в сценарии, в котором вы хотите связать делегированные события с несколькими отдельными элементами контекста), вам следует придерживаться использования делегата ():
$("body>div").delegate(selector, ...);
Демонстрация
// all of these are the same - pick the shortest form that fits your needs:
$(document).delegate('.myThing', 'click', function() { ... });
$('.myThing', document).live('click', function() { ... });
$('.myThing').live('click', function() { ... });
// this should only be done using delegate
$("#myTable, #myDiv, #myMarquee").delegate('.myThing', 'click', function(){...});