Добавляем...


Распространение и маршрутизация событий
Как уже упоминалось выше, в браузерах, обеспечивающих поддержку DOM2, событие начинается на уровне Document и проходит путь "вниз" по иерархии вложений к целевому объекту (объекту, соответствующему элементу, где происходит событие). В течение этой фазы все промежуточные объекты вызывают зарегистрированные для этого типа событий и для фазы захвата обработчики событий. После достижения событием цели, где могут быть выполнены обработчики событий целевого объекта, событие начинает путь обратно по иерархии туда, где оно начиналось — к объекту Document. В течение этой фазы все промежуточные объекты вызывают зарегистрированные для этого типа событий и для фазы возврата обработчики событий, в том числе и обработчики, привязка которых.была выполнена с помощью атрибутов (X)HTML.

Слежение за событиями в фазах захвата и возврата может быть достаточно непростым из-за сложности взаимосвязей родительских и дочерних узлов в DOM. Обработчик будет вызываться для события только в том случае, когда событие нацелено на узел поддерева с корнем в том узле, к которому привязана программа-приемник данного события. Отношения вложения для различных частей страницы часто меняются, поэтому многие программисты предпочитают захватывать события в главном объекте, содержащем все нужные объекты, например, на уровне Document или Form.
Отмена распространения

Попробуйте щелкнуть <a id="mylink" href="http://www.javascriptref.com">
сюда</a>.
<script type="text/javascript">
<!--
// Только браузеры DOM 2, в IE6 не поддерживается
function killClicks(event)
{
event.preventDefault();
event.stopPropagation();
}
document.addEventListener("click", killClicks, true);
document.getElementById("mylink").onclick = function() {
alert("Событие click добралось до узла ссылки");
}
// -->
</script>

Обработчик killClick регистрируется в качестве приемника событий в фазе захвата, так что он выполняется на пути события вниз к ссылке. Он сначала не дает щелчку выполнить обычную работу, а затем с помощью вызова stopPropagation() сигнализирует о том, что дальнейшая обработка события не должна выполняться.
Перенаправление событий
Каждый узел имеет метод dispatchEvent(), который можно вызвать для перенаправления события к этому узлу. Указанный метод принимает Event в качестве аргумента и возвращает false, если хотя бы один обработчик, обслуживающий данное событие, вызывает preventDefault() или возвращает false. Предположим, требуется направить событие к элементу со значением id, равным "eventprocessor ". Для этого можено использовать

function routeClick(event)
(
var rv = document.getElementById("eventprocessor").dispatchEvent(event);
if (rv)
alert("Процессор событий отменил поведение по умолчанию");
else
alert("Процессор событий разрешил поведение по умолчанию");
}

Функции, подобные этой, позволяют привязать обработчики событий к одному объекту, обеспечивающему централизованное управление событиями, объекту, не обязанному содержать все элементы, для которых осуществляется управление событиями.
При использовании такого подхода для перенаправления события узел, в котором вызывается dispatchEvent(), становится новым целевым объектом события. Браузер "воображает", что событие произошло именно там. Это значит, что браузер заставит событие пройти путь от объекта Document вниз к этой новой цели и обратно. По этой причине следует соблюдать осторожность, чтобы не допустить появления бесконечных циклов, создаваемых в результате отправки событий целевым объектам, для которых установлены соответствующие приемники событий. В результате событие будет обречено на бесконечное хождение между объектом Document и обработчиком событий, что быстро приведет к отказу браузера.


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика