Первый пример делегаты обработчик события выше дерева DOM. Это означает, что он может быть прикреплен к элементу (ancestor
), который находится в DOM, но применяется к потомкам (element
), которые еще не могут быть в DOM.
Второй пример прикрепляет обработчик событий непосредственно к element
, что означает, что элемент должен существовать в DOM в момент запуска кода.
Делегация обладает дополнительным преимуществом эффективности. Представьте, что вы хотите привязать обработчик событий к каждому элементу li
в большом списке. Гораздо эффективнее связать один обработчик с родительским ul
, делегированный li
элементам, чем привязать многие копии одной и той же функции.
Делегация работает, потому что большинство DOM событий пузырь вверх по дереву от элемента, на котором они происходят (целевой). После li
примере, приведенном выше, рассмотрим следующий код:
$("#myList").on("click", "li", function() { /* Do stuff */ });
Когда потомок #myList
, открывается click
событие будет сгенерировано и будет пузыриться от этого элемента #myList
(это небольшое упрощение - есть это еще одна фаза событий, называемых «захват», но это не важно здесь). Обработчик события, связанный с #myList
, будет запущен, а jQuery проверяет, соответствует ли целевой элемент селектору. Если это так, он выполняет обработчик.
http://api.jquery.com/on –
Возможный дубликат [Разница между jQuery \ 'click \', \ 'bind \', \ 'live \', \ 'delegate \', \ 'trigger \ 'и \' on \ '(с примером)?] (http://stackoverflow.com/questions/2954932/difference-between-jquery-click-bind-live-delegate-trigger-and-on) –