Я хочу знать основное различие между
.live() vs. .bind()
в jQuery.
Я хочу знать основное различие между
.live() vs. .bind()
в jQuery.
Основное отличие состоит в том, что live будет работать и для элементов, которые будут созданы после загрузки страницы (т.е. с помощью кода javascript), тогда как bind свяжет привязки событий только для существующих элементов.
// BIND example
$('div').bind('mouseover', doSomething);
// this new div WILL NOT HAVE mouseover event handler registered
$('<div/>').appendTo('div:last');
// LIVE example
$('div').live('mouseover', doSomething);
// this new appended div WILL HAVE mouseover event handler registered
$('<div/>').appendTo('div:last');
Update:
jQuery 1.7 устарел live() метод и 1.9 удалил его. Если вы хотите достичь той же функциональности с 1.9+, вам нужно использовать новый метод on(), который имеет несколько иной синтаксис, который он вызывает в объекте документа, и селектор передается как параметр. Поэтому код сверху преобразуется в этот новый способ привязки событий, будет выглядеть так:
// ON example
$(document).on('mouseover', 'div', doSomething);
// this new appended div WILL HAVE mouseover event handler registered
$('<div/>').appendTo('div:last');
Я сделал статистический анализ .bind() vs .live() vs .delegate() с использованием FF-профилировщика. Я сделал 10 раундов каждого (не достаточный образец, чтобы быть окончательным, но иллюстрирует точку). Это результаты.
1) Единый статический элемент с идентификатором, использующим событие click:
.bind(): Mean = 1.139ms, Variance = 0.1276ms
.live(): Mean = 1.344ms, Variance = 0.2403ms
.delegate(): Mean = 1.290ms, Variance = 0.4417ms
2) Несколько статических элементов с общим классом с использованием события click:
.bind(): Mean = 1.089ms, Variance = 0.1202ms
.live(): Mean = 1.559ms, Variance = 0.1777ms
.delegate(): Mean = 1.397ms, Variance = 0.3146ms
3) Несколько динамических элементов (первая кнопка создает второе...) с помощью события click:
.bind(): Mean = 2.4205ms, Variance = 0.7736ms
.live(): Mean = 2.3667ms, Variance = 0.7667ms
.delegate(): Mean = 2.1901ms, Variance = 0.2838ms
Интерпретируйте, как вы хотите, но мне кажется, что по мере увеличения динамических элементов на странице,.delegate(), кажется, имеет лучшую производительность, а статические элементы лучше всего работают с .bind().
Имейте в виду, что я использую очень простое событие click, вызывающее предупреждение. Различные страницы с различными средами (т.е. CPU, просмотр с несколькими вкладками, текущие потоки и т.д.) Будут давать разные результаты. Я использовал это как основное руководство для моего решения использовать одно или другое. Пожалуйста, сообщите, если вы придумали другой результат.
Спасибо!
Вы должны использовать .delegate() вместо .live(), где это возможно.
Поскольку делегирование событий для .live() всегда нацелено на тело/документ, и вы можете ограничить
"пузырь" с .delegate().
UPDATE
Из jQuery:
Как и в jQuery 1.7,
.delegate()был заменен методом.on(). Однако для более ранних версий.delegate()остается наиболее эффективным средством для использования делегирования событий.
Начиная с v1.7,.live,.bind и .delegate все были заменены на .on http://api.jquery.com/on/
Мне было интересно узнать о себе, поэтому я написал статью с некоторыми примерами кода. http://blog.tivix.com/2012/06/29/jquery-event-binding-methods/.
Похоже, что в зависимости от того, как вы вызываете .on(), jquery будет имитировать .bind,.live или .delegate. Это дает вашим обработчикам событий более элегантную реализацию.