Когда вы делаете что-то вроде этого:
$("selector").click(function() { ... });
... только элементы, которые уже в DOM, будут сопоставлены селектором, и их событие щелчка будет подключено;если позже вы добавите элементы, которые будут иметь , совпадающие с селектором, они не будут автоматически подключены после факта.
Вы можете использовать делегирование событий, чтобы, казалось бы, автоматически подключить их, используя delegate
или (с более новыми версиями jQuery) один из вариантов on
:
$("container_for_elements").delegate("selector", "click", function() { ... }));
$("container_for_elements").on("click", "selector", function() { ... }));
(Обратите внимание, что порядок аргументов немного отличается междудва.)
С делегированием события, что действительно происходит, так это то, что jQuery перехватывает click
на контейнере , и когда клик поднимается до контейнера, он проверяет путь к событиюпотребовалось, чтобы увидеть, соответствует ли какой-либо из промежуточных элементов селектору.Если это так, он запускает обработчик, как если бы вы подключили его к элементу, даже если он фактически подключен к контейнеру.
Конкретный пример:
<div id="container">
<span>One</span>
<span>Two</span>
<span>Three</span>
</div>
Если мы сделаем это:
$("#container").delegate("span", "click", function() {
console.log($(this).text());
});
... затем щелкнув один из промежутков, вы увидите его содержимое, и если мы сделаем это:
$("#container").append("<span>Four</span>");
... этот промежуток будет обработан автоматически, потому чтоОбработчик события находится в контейнере , а затем селектор проверяет, когда происходит событие, поэтому не имеет значения, что мы добавили элемент позже.