В jQuery v1.7 новый метод,on
был добавлен . Из документации:
«Метод .on () присоединяет обработчики событий к текущему выбранному набору элементов в объекте jQuery. Начиная с jQuery 1.7, метод .on () предоставляет все функции, необходимые для подключения обработчиков событий. '
Какая разница с live
и bind
?
Ответы:
on()
это попытка объединить большинство функций привязки событий jQuery в одну. Это дополнительный бонус прибирать неэффективность сlive
противdelegate
. В будущих версиях jQuery эти методы будут удалены и толькоon
иone
останутся.Примеры:
Внутренне, jQuery отображает все эти методы и сокращенные методы- обработчики событий на
on()
метод, дополнительно указывая, что вы должны игнорировать эти методы с этого момента и просто использоватьon
:См. Https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
источник
$(document.body).delegate("click", ".mySelector", fn);
должно быть$(document.body).delegate(".mySelector", "click", fn);
on
в природе очень близко кdelegate
. Так почему бы не использовать делегат? Это потому,on
что не приходит один. естьoff
, чтобы отменить привязку события иone
создать событие, которое будет выполнено только один раз. Это «пакет» нового события.Основная проблема
live
заключается в том, что он прикрепляется к «окну», заставляя событие щелчка (или другое событие) на элементе глубоко внутри структуры страницы (dom) «всплывать» вверх страницы, чтобы найти событие Хендлер готов разобраться с этим. На каждом уровне должны быть проверены все обработчики событий, это может сложиться быстро, если вы делаете глубокую имбрикацию (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Так что,
bind
какclick
и другие ярлыки событий ярлыка, прикрепляются непосредственно к цели события. Если у вас есть таблица, скажем, 1000 строк и 100 столбцов, и каждая из 100 000 ячеек содержит флажок, щелчок которого вы хотите обработать. Присоединение 100'000 обработчиков событий займет много времени при загрузке страницы. Создание одного события на уровне таблицы и использование делегирования событий на несколько порядков эффективнее. Цель события будет получена во время выполнения события. "this
" будет столом, но "event.target
" будет вашим обычным делом "this
" вclick
функции. Теперь хорошо то,on
что "this
" всегда будет целью события, а не контейнером, к которому она прикреплена.источник
с помощью
.on
метода это можно сделать.live
,.delegate
и.bind
с той же функцией, но можно.live()
только с помощью.live()
(делегирование событий в документ).jQuery("#example").bind( "click", fn )
знак равноjQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
знак равноjQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
знак равноjQuery( document ).on( "click", "#example", fn )
Я могу подтвердить это непосредственно из источника jQuery:
jQuery (this.context)?
this.context
===document
в большинстве случаевисточник
(Мое вступительное предложение имело больше смысла, прежде чем вы изменили вопрос. Первоначально вы сказали: «В чем разница
live
?»)on
это больше похоже на то, наdelegate
что это похожеlive
, это в основном унифицированная формаbind
иdelegate
(на самом деле команда заявила, что ее целью является "... объединить все способы прикрепления событий к документу ..." ).live
в основномon
(илиdelegate
) прикреплен к документу в целом. Начиная с версии v1.7 , он устарел в пользу использованияon
илиdelegate
. В дальнейшем я подозреваю, что мы увидим код, использующийon
исключительно, а не используяbind
илиdelegate
(илиlive
) ...Итак, на практике вы можете:
Используйте
on
какbind
:Используйте
on
likedelegate
(делегирование события коренится в данном элементе):Используйте
on
лайкlive
(делегирование событий, основанное на документе):источник
on
это сочетаниеbind
иdelegate
, и, как я уже сказал, не очень похожеlive
. Вы можете использоватьon
likebind
(прикрепить обработчик непосредственно к элементу), или вы можете использоватьon
likedelegate
(прикрепить обработчик к элементу, но вызвать событие, только если выбранный элемент соответствует селектору, и как будто этот элемент был событие произошло (например, делегирование события), или вы можете использовать его какlive
(delegate
используя документ в качестве корня). Именно делегирование событий делает его полезным, если вы добавляете элементы динамически.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
На самом деле в старом исходном коде jQuery они использовали лайв в качестве общего случая и делегат в качестве особого случая, что еще больше запутало ситуацию, когда вы об этом думаете.delegate
прямо быстро, но все же. :-)live это ярлык для .on () сейчас
также этот пост может быть полезен для вас http://blog.jquery.com/2011/11/03/jquery-1-7-released/
источник
Там нет одного для основного варианта использования. Эти две линии функционально одинаковы
.on () также может выполнять делегирование событий и является предпочтительным.
.bind () на самом деле просто псевдоним для .on () сейчас. Вот определение функции связывания в 1.7.1
Идея добавления .on () заключалась в том, чтобы создать единый API событий, а не иметь несколько функций для привязки событий; .on () заменяет .bind (), .live () и .delegate ().
источник
Что-то, о чем вы должны знать, если хотите связать обработчики событий с элементом - обратите внимание, к какому элементу был прикреплен обработчик!
Например, если вы используете:
вы получите обработчики событий, использующие:
Но если вы используете:
вы получите обработчики событий, использующие:
(в последнем случае соответствующий объект события будет иметь selector = ". mySelector")
источник
events
в любом случае недокументировано, и я думаю, что это больше не работает в 1.9