Есть ли основания использовать $ .live вместо $ .delegate? - PullRequest
8 голосов
/ 16 сентября 2010

Я читал в другом вопросе, который вы бы использовали в прямом эфире, если бы не было контейнера для прикрепления события к $ .delegate, которое, как вы знали, не исчезло, но почему бы просто не сделать:

$('body').delegate('.myThing', 'click', function() { ... });

Я убедился, что нет никакой причины использовать $.live() в любом новом коде и что он все еще здесь для обратной совместимости.

Конечно, я часто ошибаюсь.Поэтому я спрашиваю: когда бы я использовал $ .live вместо $ .delegate и почему?

Ответы [ 4 ]

7 голосов
/ 16 сентября 2010

$.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(){...});
6 голосов
/ 16 сентября 2010

Функция .delegate () была добавлена ​​в 1.4.2. У меня больше нет причин использовать .live (). Это просто вопрос отказа от старых привычек. Функция .delegate () делает то же самое другим и гораздо более эффективным способом.

Вот отличная статья о .delegate (): http://www.learningjquery.com/2010/03/using-delegate-and-undelegate-in-jquery-1-4-2

1 голос
/ 16 сентября 2010

$('.foo').live('click', fooClicked) гораздо более читабелен, чем $('#fooParent').delegate('#foo', 'click', fooClicked), и вы можете вызвать его вне обработчика onready, чтобы избежать ненужного поиска в дереве DOM.(Эта статья дает хорошее обсуждение техники: Не позволяйте jQuery's $ (document) .ready () замедлить вас )

0 голосов
/ 17 сентября 2010

Так же, как .live(), вы также можете вызвать .delegate() вне обработчика готовности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...