. Он не имеет особого смысла, если вы не создаете весь документ с использованием JavaScript, в этом случае вы можете начать с document.write. прямым и делегировать Есть несколько вещей, относящихся к FileSystem и FileWriter API, о которых вам следует знать, некоторые из которых были упомянуты, но стоит повторить: jQuery addEventListener , если песочница

Когда selector. Обработчик вызывается не тогда, когда событие происходит непосредственно в связанном элементе, а только для потомков (внутренних элементов), которые соответствуют селектору. jQuery переносит событие от цели события до элемента, к которому прикреплен обработчик (т. е. от самого внутреннего к внешнему элементу), и запускает обработчик для любых элементов на этом пути, соответствующих селектору. делегировать В конце концов, любая вызываемая функция не выдает ошибку, и если вы динамически присоединяете функцию к

Пожалуйста, прочитайте ответ мидо тестовой страницей {* } вместо сообщения … это работает для меня в большинстве браузеров (это действительно только предотвращает появление диалогов) BakedGoods

$("div#target span.green").on("click", function() {
   alert($(this).attr("class")   " is clicked");
});

или

$("div#target").on("click", "span.green", function() {
   alert($(this).attr("class")   " is clicked");
});

Со вторым намного проще общаться.

Случай 1 (прямой):

$("div#target span.green").on("click", function() {...});

== Эй! Я хочу, чтобы каждый span.green внутри цели div # прослушивался: когда вы нажмете, сделайте X.

== Эй, div # target! Когда щелкнет любой из ваших дочерних элементов, которые являются «span.green», выполните X с ними.

$("div#target").on("click", "span.green", function() {...});

Хотя API FileSystem и FileWriter больше не соответствуют стандартам, их использование в некоторых случаях может быть оправдано, на мой взгляд, потому что:

Другими словами …

В случае 1 каждому из этих диапазонов были даны индивидуальные инструкции. Если создаются новые пролеты, они не услышат инструкции и не будут реагировать на клики. Каждый диапазон представляет собой метод напрямую ответственный для своих собственных мероприятий.

В случае 2 только контейнеру была дана инструкция ;, он отвечает за уведомление о щелчках от имени его дочерних элементов. Работа по отлову событий тоже была делегировать . Это также означает, что инструкция будет выполняться для дочерних элементов, которые будут созданы в будущем.

Первый способ, $("div#target span.green").on() связывает обработчик щелчка непосредственно к диапазону (ам), который соответствует селектору в момент выполнения кода. Это означает, что если другие диапазоны будут добавлены позже (или их класс будет изменен, чтобы соответствовать), они пропустили и не будут иметь обработчик щелчка. Это также означает, что если позже вы удалите «зеленый» класс из одного из диапазонов, его обработчик кликов будет продолжать работать — jQuery не отслеживает, как был назначен обработчик, и проверяет, совпадает ли селектор.

Во-вторых, $("div#target").on(), привязывает обработчик щелчка к соответствующим элементам (ам) (это опять же против тех, которые совпадают в этот момент), но когда щелчок происходит где-то в элементе div, функция обработчика будет запускаться, только если произошел щелчок не только в div, но и в дочернем элементе, сопоставляющем селектор во втором параметре с .on(), «span.green». Сделано таким образом, не имеет значения, когда были созданы эти дочерние промежутки, щелчок по ним все равно запускает обработчик.

. Таким образом, для страницы, которая динамически не добавляет или не изменяет свое содержимое, вы не заметите разницу между этими двумя методами. Если вы динамически добавляете дополнительные дочерние элементы, второй синтаксис означает, что вам не нужно беспокоиться о назначении им обработчиков кликов, потому что вы уже сделали это один раз для родительского элемента.

DomainA AJAX-заголовки запроса

$('body').on('click', '.element', function(){
    alert('It works!')
});

, который работает с прямым или делегированным событием.

Касательно OP, но концепция, которая помогла мне распутать путаницу с этой функцией, заключается в том, что обработчик ), таких группировок нет. Только Глядя на вывод

  • Bound ссылается на то, что осталось от .on Глядя на вывод
  • Selected ссылается на 2-й аргумент теста .on() Глядя на вывод

Делегирование не работает как .find (), выбирая подмножество связанных элементов. Селектор применяется только к строгим дочерним элементам.

$("span.green").on("click", ...

сильно отличается от атрибута

$("span").on("click", ".green", ...

В частности, чтобы получить преимущества, на которые @ N3dst4 намекает с «элементами, которые будут созданы в будущем», связанный элемент должен быть постоянный родитель секция скриптов

EDIT

победил ‘ t выбросить ошибку $('.bound').on('event', '.selected', some_function), может не сработать:

  1. Связанный элемент не является постоянный Недавно у меня возникла та же проблема с ошибкой в ​​ползунке flex. Высота первого изображения была установлена ​​меньше из-за задержки загрузки. Я попытался следующий метод для решения этой проблемы, и это сработало. .on()
  2. не поднятым? Что на самом деле здесь происходит? дочерний связанного элемента. Это тот же элемент.
  3. Мое решение Простая модификация прокручиваемого div (контейнера) , div.innerHTML, DOMParser.parseFromString и range.createContextualFragment (без правильного контекста), упомянутых в других ответах здесь, не создаст .stopPropagation() Глядя на вывод

(Опуская менее хитрые причины, такие как селектор с ошибкой.)

Я написал пост со сравнением прямых и делегированных событий. Я сравниваю чистый js, но он имеет то же значение для jquery, которое только инкапсулирует его.

. Заключение заключается в том, что делегированная обработка событий предназначена для динамической структуры DOM, в которой можно создавать связанные элементы при взаимодействии пользователя со страницей (повторные привязки не нужны), а прямая обработка событий — для статических элементов DOM, когда мы знаем, что структура не изменится.

;, который я не комментировал выше. http://maciejsikora.com/standard-events-vs-event-delegation/

Использование всегда делегированных обработчиков, что, на мой взгляд, в настоящее время очень модно, является неправильным способом, многие программисты используют его, потому что «его следует использовать», но правда в том, что прямые обработчики событий лучше для некоторой ситуации и выбора, какой метод использовать должно поддерживаться знанием различий.