Подтвердить что ты не робот

Что не так с живым методом jQuery?

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

Используйте .on() для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate() вместо .live().

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

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

4b9b3361

Ответ 1

См. некоторые объяснения здесь:

http://www.ultimatewebtips.com/why-jquery-live-is-a-bad-option-to-use/ (Сайт, кажется, не работает)

Цитата:

  • Вы не можете использовать .live() для многократных виджетов.

  • .stopPropagation() не работает с live.

  • .live() работает медленнее.

  • .live() не является цепным.

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

Знаете ли вы о ссылке api и смотрите, как работает .on():)

Цитата:

Метод .on() присоединяет обработчики событий к выбранному в данный момент набору элементов в объекте jQuery. Начиная с jQuery 1.7, метод .on() предоставляет все функции, необходимые для присоединения обработчиков событий. Для помощь в преобразовании из более старых методов события jQuery, см..bind(),.delegate() и .live(). Чтобы удалить события, связанные с .on(), см..off(). Чтобы прикрепить событие, которое выполняется только один раз, а затем удаляет сам, см..one()

Ответ 2

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

  • В конструкции $('selector').live() jQuery сначала должен выбрать все элементы. Однако при вызове live() ему нужен только селектор объекта jQuery (хранится в .selector) и фактически не использует какой-либо из выбранных элементов. Поэтому несколько расточительно сначала выбирать все совпадающие элементы, а затем не использовать их. on() и delegate() принимают целевой селектор в качестве параметра, что означает, что заранее не выбираются никакие целевые элементы, и тестирование происходит только при срабатывании события.
  • live() по умолчанию привязан к уровню document, поэтому все события должны пузыриться через всю DOM. Вы можете сузить его, указав контекст с помощью $(selector, context).live(), но лучше использовать on() или delegate() для этого.

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

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}

Ответ 3

В методе live есть две основные проблемы:

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

  • Использование метода не является типичным для того, как селектор используется с другими методами в библиотеке. Вы можете использовать его только на объектах jQuery, которые создаются с помощью селектора. Методы delegate и on делают это естественным, когда вы предоставляете селектор методу.

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

Вот подробный статья Paul Irish о производительности и ограничениях live().

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

Ответ 7

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

совпадает с

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

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

  • Прикрепление обработчиков к корню DOM увеличивает путь, по которому событие должно проходить в процессе бурения. Это плохо повлияло бы на производительность.
  • Повышенный риск того, что какой-либо другой обработчик с return false в конце будет препятствовать обработчику live.