Выразительный JavaScript.

Распространение (propagation).

События, зарегистрированные на узлах, имеющих дочерние узлы, получат и некоторые события, случившиеся с их детьми. Если кликнуть на кнопку внутри параграфа, обработчики событий параграфа получат событие click.

Если и у параграфа и у кнопки есть обработчики, то первым запустится более конкретный – то есть, обработчик кнопки. Событие как бы распространяется наружу, от узла, где оно случилось, до его родительского и далее до корня документа. После отработки всех обработчиков всех промежуточных узлов, очередь среагировать на событие доходит и до самого окна.

В любой момент обработчик может вызвать метод stopPropagation объекта события, чтобы «высшие» узлы не получили его. Это может быть полезным, когда у вас есть кнопка внутри другого кликабельного элемента, и вы не хотите, чтобы клики по кнопке активировали поведение внешнего элемента.

Следующий пример регистрирует обработчики "mousedown" как на кнопке, так и на окружающем параграфе. При щелчке правой кнопкой обработчик кнопки вызывает stopPropagation, который предотвращает запуск обработчика параграфа. При клике другой кнопкой запускаются оба обработчика.

<р>Параграф с <buttоn>кнопкой </button>.</p>

<script>

Var para = document.querySelector("p");

Var button = document.querySelector("button");

Para.addEventListener("mousedown", function() {

Console.log("Обработчик параграфа.");

});

Button.addEventListener("mousedown", function(event) {

Console.log("Обработчик кнопки.");

If (event.which == 3).

Event.stopPropagation();

});

</script>

У большинства объектов событий есть свойство target, ссылающееся на узел, который запустил обработку. Его можно использовать для проверки того, что вы не обрабатываете что-то, пришедшее с ненужного вам узла.

Также возможно использовать свойство target, чтобы распространить обработку конкретного типа события. К примеру, если у вас есть узел, содержащий длинный список кнопок, было бы удобнее зарегистрировать один обработчик событий для узла, и в нём выяснять, нажали ли на кнопку – вместо того, чтобы регистрировать обработчики каждой кнопки по отдельности.

<button>A</button>

<button>B</button>

<button>C</button>

<script>

Document.body.addEventListener("click", function(event) {

If (event.target.nodeName == "BUTTON").

Console.log("Clicked", event.target.textContent);

});

</script>