Вопрос по jquery – Что не так с методом jQuery live?

29

live() метод был объявлен устаревшим в jQuery 1.7. Документы jQuery теперь рекомендуют

Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().

Я понимаю какon а такжеdelegate работать, но я не понимаю, почему они лучше.live() это проще и проще в использовании.

Есть ли причина, почемуlive был объявлен устаревшим? Как другие методы лучше? Произойдет ли что-нибудь плохое, если я продолжу использоватьlive?

Кроме вашего взлома кода, когда они перестают его поддерживать? Не много ... особенно если вы используете локальную копию jQuery ... Lix
Приведенные ниже ответы являются хорошими, но есть один практический аспект устаревания: разработчикам инструментария больше не нужно поддерживатьlive, Так как они добавленыon и думаю, что это хорошее решение, они больше не хотят поддерживать и поддерживатьliveтаким образом, они осудили это, независимо от того, плохо это или хорошо. В этом случае есть несколько причин, чтобы избежатьlive, но в общем случае, если метод добавлен в инструментарий дляany По этой причине разработчики могут отказаться от методов, которые выполняют аналогичные действия для упрощения обслуживания. Dancrumb

Ваш Ответ

7   ответов
1

статья Пола Айриша о производительности live () и ограничениях.

Если вы продолжаете использоватьliveрано или поздно ваш код больше не сможет работать, если вы обновите библиотеку jQuery в своих проектах.

1

live() прикрепляет обработчики к документу, что в основном приводит к перехватуall события данного вида, связанные с поиском элементов, соответствующих селектору. сdelegate() а такжеon()Рекомендуется прикрепить ближе к ожидаемым целям (в их непосредственном родителе, если это возможно), тем самым сужая количество обрабатываемых событий, и соответственно ища подходящие цели.

33

http://www.ultimatewebtips.com/why-jquery-live-is-a-bad-option-to-use/ (Site appears to be down)

Quote:

You can’t use .live() for reusable widgets.

.stopPropagation() doesn’t work with live.

.live() is slower.

.live() is not chainable.

Further красота.on() в том, что он довольно хорошо оптимизирует все события:http://api.jquery.com/on/

Вы знаете о ссылке API и посмотрите, как.on() работает :)

Quote:

The .on() method attaches event handlers to the currently selected set of elements in the jQuery object. As of jQuery 1.7, the .on() method provides all functionality required for attaching event handlers. For help in converting from older jQuery event methods, see .bind(), .delegate(), and .live(). To remove events bound with .on(), see .off(). To attach an event that runs only once and then removes itself, see .one()

Несмотря на то, что.live() был удален в jQuery 1.9, пункты 1, 2 и 3 должны быть очень точными, а пункт 4 просто ошибочным.
1

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

Вместо того, чтобы по умолчанию искать во всех документах определенное событие, более эффективны данные для поиска в конкретном контейнере.

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

Но во многих случаях мы должны адаптироваться и быть более понятными нашему коду в отношении того, что должно быть выполнено.

Это все равно, что спросить себя, почему нужно импортировать материал, и почему не все импортируется при инициации.

Я думал, что вы можете ограничить поиск строкой выбора, т.е."#mydiv .edit" скорее, чем".edit&q,uot;. Peter Olson
На самом деле, нет. live () всегда проверяет, есть ли.edit внутри#mydiv во всем документе по каждому выполнению события. Не найти существующий#mydiv и проверь своих детей.
0

$('some selector').live(' ... ', handler)

такой же как

$(document).on(' ... ', 'some selector', handler)

Поэтому, когда вы используетеlive вы фактически назначаете все свои обработчики в корень дерева DOM. Для этого есть два недостатка:

Attaching handlers to DOM root increases the path the event has to traverse while buubling up. That would impact performance in a bad way. There's an increased risk that some other handler with return false at the end will prevent live handler from firing.
4

live метод:

It attaches all event handlers at the document level, so any event that bubbles up to the document has to be matched against the event types and selectors for all live events. If you have a lot of events, the page will be sluggish. You should use delegate or on to limit the scope of where you check the events.

The usage of the method is not typical for how selectors is used with other methods in the library. You can only use it on jQuery objects that are created using a selector. The delegate and on methods makes this natural as you supply the selector to the method.

10

live() неэффективно по двум причинам:

In the construct $('selector').live(), jQuery first has to select all elements. However, when calling live(), it only needs the selector of the jQuery object (stored in .selector) and doesn't actually use any of the selected elements. Therefore, it is somewhat wasteful to first select all matching elements and then not using them. on() and delegate() take the target selector as a parameter which means that no target elements are selected beforehand and the testing occurs only when the event is triggered. live() by default is bound at the document level, thus all events need to bubble up through the whole DOM. You can narrow it down by specifying a context with $(selector, context).live(), but it's better to use on() or delegate() for this.

При написании нового кода настоятельно рекомендуется использовать самые последние и лучшиеon() вместоdelegate() и устарелlive(), Однако я не думаю, что поддержкаlive() будет удален в ближайшее время (если вообще когда-либо), так как многие сценарии полагаются на него. Кроме того, нет реального недостатка использованияlive() надon(), как и в самом источнике jQuerylive() определяется как:

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}
$(selector, context) не меняется.contextтак что все равно будетdocument, Вы должны передать элемент DOM, как$($("body")[0]).find("span") изменить.context к чему-то еще

Похожие вопросы