Какая разница между `on` и` live` или `bind`?

В jQuery v1.7 добавлен новый метод on. Из документации:

'Метод .on() присоединяет обработчики событий к выбранному в данный момент набору элементов в объекте jQuery. Начиная с jQuery 1.7, метод .on() предоставляет все функции, необходимые для прикрепления обработчиков событий.

Какая разница с live и bind?

Ответ 1

on() - попытка объединить большинство функций привязки событий jQuery в один. У этого есть дополнительный бонус, чтобы убрать неэффективность с помощью live vs delegate. В будущих версиях jQuery эти методы будут удалены, и останется только on и one.

Примеры:

// Using live()
$(".mySelector").live("click", fn);

// Equivalent `on` (there isn't an exact equivalent, but with good reason)
$(document).on("click", ".mySelector", fn);
// Using bind()
$(".mySelector").bind("click", fn);

// Equivalent `on`
$(".mySelector").on("click", fn);
// Using delegate()
$(document.body).delegate(".mySelector", "click", fn);

// Equivalent `on`
$(document.body).on("click", ".mySelector", fn);

Внутри jQuery отображает все эти методы и средства сортировки обработчиков коротких событий методу on(), что указывает на то, что вы должны игнорировать эти методы с этого момента и просто используйте on:

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

См. https://github.com/jquery/jquery/blob/1.7/src/event.js#L965.

Ответ 2

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" всегда будет целью события, а не контейнером, к которому он присоединен.

Ответ 3

с помощью метода .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:

bind: function( types, data, fn ) {
    return this.on( types, null, data, fn );
},

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

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

jQuery (this.context)? this.context === document в большинстве случаев

Ответ 4

(Мое вступительное предложение имело больше смысла, прежде чем вы изменили вопрос. Первоначально вы сказали: "Какая разница с live?" )

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

live в основном on (или delegate), прикрепленный к документу в целом. Он устарел от версии v1.7 в пользу использования on или delegate. В будущем я подозреваю, что мы будем использовать код on исключительно, вместо использования bind или delegate (или live)...

Итак, на практике вы можете:

  • Используйте on как bind:

    /* Old: */ $(".foo").bind("click", handler);
    /* New: */ $(".foo").on("click", handler);
    
  • Используйте on как delegate (делегирование событий, внедренное в данный элемент):

    /* Old: */ $("#container").delegate(".foo", "click", handler);
    /* New: */ $("#container").on("click", ".foo", handler);
    
  • Используйте on как live (событие делегирования в документе):

    /* Old: */ $(".foo").live("click", handler);
    /* New: */ $(document).on("click", ".foo", handler);
    

Ответ 5

live - это ярлык для .on() now

//from source http://code.jquery.com/jquery-1.7.js
live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}

Также этот пост может быть полезен для вас http://blog.jquery.com/2011/11/03/jquery-1-7-released/

Ответ 6

В основном случае использования нет. Эти две линии функционально одинаковы

$( '#element' ).bind( 'click', handler );
$( '#element' ).on( 'click', handler );

.on() также может выполнять делегирование событий и является предпочтительным.

.bind() на самом деле является просто псевдонимом для .on(). Здесь определение функции связывания в 1.7.1

bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},

Идея добавления .on() заключалась в создании единого API событий, вместо того, чтобы иметь несколько функций для привязки события;.on() заменяет .bind(),.live() и .delegate().

Ответ 7

Что-то, о чем вам следует знать, если вы хотите получить обработчики событий, связанные с элементом, - обратите внимание на тот элемент, к которому привязан обработчик!

Например, если вы используете:

$('.mySelector').bind('click', fn);

вы получите обработчики событий, используя:

$('.mySelector').data('events');

Но если вы используете:

$('body').on('click', '.mySelector', fn);

вы получите обработчики событий, используя:

$('body').data('events');

(в последнем случае соответствующий объект события будет иметь селектор = ". mySelector" )