Ну и в чем разница между этими двумя методами? Это семантически то же самое или это влияет на что-то?
$('#demo').on('click', function() {
alert('Click con on.click');
});
$('#demo2').click(function() {
alert('Click con click');
});
#demo{
background-color:#F2F2F2;
width:500px;
height:100px;
text-align:center;
vertical-align: middle;
display:table-cell;
cursor:pointer;
}
#demo2{
background-color:#E6E6E6;
width:500px;
height:100px;
text-align:center;
vertical-align: middle;
display:table-cell;
cursor:pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="demo">Click con on.click</div>
<div id="demo2">Click con click</div>
Возможно, самое важное отличие состоит в том, что он
.on('click', selector, function(){})
позволяет вам работать с элементами, добавленными после загрузки DOM, а.click(function(){})
здесь нет.Другие отличия:
.on()
создает единый обработчик для всех элементов, включенных в селектор, при этом.click()
создавая обработчик для каждого из этих элементов.on()
позволяет использовать пространства имен.Хочу добавить кое-что по этой теме. Этот метод
.on
позволяет делегировать события, но его также можно использоватьlistener
напрямую, изменив синтаксис.Суть в том, чтобы предоставить ему селектор в вызове. Так:
$(document).on('click', myEventHandler)
вы услышите все щелчки всего документа.$('#myElement').on('click', myEventHandler)
он будет прослушивать все клики от всех потомков myElement (и самого себя).$('#myElement').on('click', '.mySelector', myEventHandler)
то, что он делает, то же самое, что и выше, но затем он фильтрует.mySelector
перед вызовомmyEventHandler
.Итак:
$('#myElement').on('click', myEventHandler)
это точно так же, какПричина, по которой
on
«позволяет работать с элементами, добавленными после загрузки DOM», заключается в том, что на самом делеlistener
для этого события объявлено в элементе более низкого уровня, который его охватывает.Яснее:
На самом деле тот, который получает событие,
listener
объявлен для , затем он фильтрует все содержащиеся в нем элементыmyDIV
с помощью селектора .button
Вот почему добавление к нему нового элемента кнопки
myDIV
реагирует на событиеclick
.Легкий! ;)
Повседневный пример. Когда мы используем компонент некоторых
framework
, таких как aalert
ofBootstrap
. Мы видим, что при динамическом добавлении оповещения в DOM сdata-dismiss="alert"
автоматическим атрибутом кнопка закрытия вызывает закрытие оповещения без необходимости прикреплять файлlistener
. Это потому, что внутри библиотека Bootstrap js делает следующее:Затем
myHandler
он выполняет ближайшийdismiss
элемент класса (метод ) и т. д.alert
jQuery.closest
Как
jQuery
определить, какая кнопка оповещения была нажата? Благодаряevent bubbling
... Несмотря на то, чтоlistener
было установлено для корневого элемента (document
), событие фактическиclick
произошло на кнопке оповещения и работало вниз, пока не получило егоdocument
. Затем онjQuery
отфильтровал всеalerts
и вызвалhandler
метод,apply
передавjavascript
в качестве параметра элемент, вызвавший событие (button
).Когда мы используем
$(document).on('click', 'button.myClass', myHandler)
jQuery
то, что он делает внутри, этоdocument.addEventListener('click', myHandler, false)
.Таким образом, он захватывает
clicks
все объекты на странице, а затем выполняетdispatch
to objectbutton.myClass
.