Основные понятия
Генерация и распространение событий
В этой главе мы описываем модель обработки событий, принятую в DOM 2. Именно реакция на внешние события делает документы динамическими, поэтому методы и свойства, описанные в этой главе, служат клеем, соединяющим описанные ранее элементы DOM в единое и живое целое, реагирующее на различные события. Начнем с самого понятия событие. Все события в DOM 2 подразделяются на следующие:
Аппаратные события пользовательского интерфейса. Это события, вызванные взаимодействием пользователя с устройствами ввода-вывода (нажатие клавиши, движение мыши и т. п.)
Логические события пользовательского интерфейса. Это события, не связанные с внешними устройствами, например, получение от операционной системы сообщения о смене фокуса.
События, генерируемые изменением структуры документа, например, добавление нового элемента.
Модель событий DOM 2 пока реализована только в Gecko. Internet Explorer имеет свою модель генерации и обработки событий, которая описана в этой главе.
Любое событие связано с конкретным узлом документа (цель события), доступным через интерфейс EventTarget, который указывается в свойстве target объекта Event, описывающего данное событие. Когда событие достигает своей цели, активизируются все обработчики событий данного узла, описываемые интерфейсом EventListener. При этом гарантируется, что все обработчики будут активизированы, но не оговаривается порядок, в котором это будет происходить. Если не произойдет перехвата или просачивания события, то процесс генерации события завершится, когда все обработчики будут активизированы. Этот процесс называется распространением события (event propagation). Если происходит перехват события или его просачивание, то процесс обработки события изменяется, как описано ниже.
Исключения, возникающие в процессе обработки события, не прекращают его распространения: управление просто передается следующему обработчику событий. Если обработка события генерирует новые события, то они должны обрабатываться синхронно.
Перехват события
Перехват события (event capture) состоит в следующем. Обработчик события любого предка цели может перехватить событие прежде, чем оно достигнет своей цели. Процесс перехвата действует сверху вниз от корня дерева документа, т. е. от объекта Document. В момент генерации события фиксируется цепочка его существующих обработчиков от корня дерева до узла-цели; если во время обработки события какие-то обработчики будут удалены или добавлены, то это не окажет влияния на процесс обработки данного события.
Для включения механизма перехвата событий нужно установить аргумент useCapture метода addEventListener в true. После этого обработчик событий будет перехватывать все события заданного типа, направленные к потомках узла, в котором он зарегистрирован. Это приведет к тому, что все обработчики данного события у всех узлов цепочки от данного узла до цели будут активизированы. При этом события, целью которых является узел, в котором зарегистрирован перехватывающий обработчик, его не активизируют.
Если перехватывающий обработчик хочет прекратить дальнейшую обработку события, то он должен вызвать метод stopPropagation объекта Event. Тем самым он прекратит передачу события по цепочке узлов вниз. Однако, обработчики событий в узлах того же уровня иерархии все равно будут активизированы.
Просачивание события
Просачивание события (event bubbling) - это процесс, который происходит в направлении, противоположном перехвату. Он состоит в том, что после активизации обработчиков события узла-цели происходит активизация обработчиков этого события у элементов, являющихся предками этого узла вверх по дереву документа вплоть до его корня. Обработчики событий, зарегистрированные для перехвата событий, при этом не активизируются. В момент генерации события фиксируется цепочка его существующих обработчиков от узла-цели до корня дерева; если во время обработки события какие-то обработчики будут удалены или добавлены, то это не окажет влияния на процесс просачивания данного события.
Любой обработчик может прекратить дальнейшее просачивание события вызовом метода stopPropagation объекта Event. Тем самым он прекратит передачу события по цепочке узлов вверх. Однако, обработчики событий в этом узле будут активизированы.
Является событие просачивающимся или нет, определяется свойством bubbles его интерфейса Event.
Отмена события
Некоторые события являются отменяемыми (cancelable). Для таких событий обычно предусмотрена типовая обработка. Примером может служить щелчок мышью на гиперссылке, где действием по умолчанию является загрузка ресурса, на который указывает гиперссылка. Перед выполнением типовой обработки реализация DOM должна вызвать обработчики данного события, если таковые зарегистрированы. Обработчики имеют возможность либо отменить типовую обработку события, либо разрешить ее. В примере с гиперссылкой отмена события означает, что загрузка ресурса не произойдет.
Является событие отменяемым или нет, определяется свойством cancelable его интерфейса Event. Отмена типовой обработки события производится вызовом метода preventDefault этого интерфейса.
Исключения: интерфейс EventException
В процессе обработки события может быть сгенерировано исключение, описываемое интерфейсом EventException. Этот интерфейс имеет единственное свойство code типа Number, которое содержит номер исключения согласно следующей таблицы:
Название | Значение | Описание | Модель |
---|
UNSPECIFIED_EVENT_TYPE_ERR | 0 | Тип события не задан или пуст. | DOM 2 |
1 2 3 4 5 6 7 8
8 8 8
| |