Номер один перехватит событие click
для элементов, которые существуют, когда вы выполняете этот оператор. Например, обработчик напрямую подключается к фактическим элементам, которые совпадают при выполнении этого вызова.
Number Two перехватит событие click
в документе и при получении любого клика проверит, соответствует ли элемент, по которому фактически щелкнули, какому-либо из заданных селекторов, и если да, то запустит обработчик. Это делегирование события, а не прямое подключение.
Итак, это означает несколько вещей:
- Используя номер два, клики по элементам, которые вы добавите позже, вызовут обработчик; с номером один они не будут.
- Только всплывающие события, такие как
click
, работают с номером два (поскольку он основан на событии, поднимающем DOM до уровня документа).
- Если вы используете делегированный обработчик (номер два), а какой-то другой код перехватывает событие на фактическом элементе, а затем отменяет распространение (всплывание) события, делегированный обработчик его не увидит.
- Делегированная форма (номер два) должна сопоставлять элемент, по которому щелкнули (и, возможно, его предков), с селектором, когда происходит щелчок, что занимает ненулевое время. Не обязательно много времени, но больше, чем прямой обработчик (который не обязан этого делать). Если у вас много делегированных обработчиков одного и того же элемента (в данном случае документа), вы можете начать замечать.
Бывают случаи, когда лучше использовать обработчик с прямым подключением, а иногда лучше делегирование события (обычно с использованием чего-то более целенаправленного, чем document
). Обычно разделительная линия между ними является оценочным вызовом, но, например, если вы хотите реагировать на щелчки по строкам таблицы, вам, вероятно, лучше перехватывать событие click
для элемента table
с помощью селектора tr
, а не прикреплять click
событие каждой отдельной строки таблицы, особенно если вы обновляете таблицу динамически. Принимая во внимание, что если у вас есть уникальная кнопка, о которой вы знаете, что она существует в DOM, когда вы подключаете свой обработчик, и вы хотите запустить определенную функцию при нажатии этой кнопки (но не чего-либо еще), прямой обработчик, вероятно, имеет больше смысла.
Вот пример (активная копия):
HTML:
<p>Click me</p>
JavaScript:
jQuery(function($) {
$('p').on('click', function() {
display("Directly-attached handler fired. Click this paragraph and note the difference in what happens compared to when you click the 'click me' paragraph.");
});
$(document).on('click', 'p', function() {
display("Delegated handler fired.");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
Обратите внимание, что когда вы щелкаете абзац «щелкни меня», вы получаете два новых абзаца, добавленных в документ, один из которых является результатом первого вызова on
, а другой — результатом второго. Но обратите внимание: если щелкнуть любой из этих двух новых абзацев, вы увидите только обработчик второго вызова on
(делегированного), а не первого. Это потому, что эти абзацы не существовали, когда вы подключили первый обработчик.
person
T.J. Crowder
schedule
14.11.2011
live()
противbind()
противdelegate()
alfajango.com/blog/ - person fehays   schedule 14.11.2011