В модели обработки событий DOM Level 0 броузер передает события тем элемен_ там документа, в которых они происходят. Если объект имеет соответствующий обработчик события, этот обработчик запускается. И больше ничего не происхо_ дит. В DOM Level 2 ситуация сложнее. В развитой модели обработки событий, когда событие происходит в элементе документа (известном как целевой узел со_ бытия), вызывается обработчик (или обработчики) событий целевого узла, но, кроме того, одну или две возможности обработать данное событие получает каж_ дый из элементов_предков этого элемента. Распространение события осуществ_ ляется в три этапа. Сначала на этапе перехвата события распространяются от объекта Document вниз по дереву документа к целевому узлу. Если у какого_либо из предков целевого элемента (но не у него самого) есть специально зарегистри_ рованный перехватывающий обработчик события, на данном этапе распростра_ нения события этот обработчик запускается. (Скоро мы узнаем, как регистриру_ ются обычные и перехватывающие обработчики событий.)
Следующий этап распространения события происходит в самом целевом узле: запускаются любые предусмотренные для этого обработчики событий, зарегист_ рированные непосредственно в целевом узле. Этот этап аналогичен обработке со_ бытий, предоставляемой моделью событий Level 0.
Третий этап распространения события – это этап всплывания, на котором собы_ тие распространяется, или «всплывает», обратно, вверх по иерархии документа от целевого узла к объекту Document. Если на этапе перехвата по дереву докумен_ та распространяются все события, то в этапе всплывания участвуют не все типы событий: например, событие submit не имеет смысла распространять вверх по до_ кументу за рамки элемента <form>, к которому оно относится. В то же время уни_ версальные события, такие как mousedown, могут быть интересны любому элемен_ ту документа, поэтому они всплывают по иерархии документа, вызывая любые предусмотренные для этого обработчики событий во всех предках целевого узла. Как правило, события ввода всплывают, а высокоуровневые семантические со_ бытия – нет. (Полный список всплывающих и невсплывающих событий приве_ ден в табл. 17.3 далее в этой главе.)
Любой обработчик может остановить дальнейшее распространение события, вы_ звав метод stopPropagation() объекта Event, представляющего данное событие. Более подробную информацию об объекте Event и его методе stopPropagation() можно найти далее в этой главе.
Некоторые события приводят к выполнению веб_броузером связанных с ними действий, предлагаемых по умолчанию. Например, когда в теге <a> происходит событие click, действием броузера, предлагаемым по умолчанию, является пере_ ход по гиперссылке. Такие действия по умолчанию выполняются только после завершения всех трех фаз распространения события, и любой обработчик, вы_
416 Глава 17. События и обработка событий
званный во время распространения события, имеет возможность отменить дей_ ствие по умолчанию, вызвав метод preventDefault() объекта Event.
Подобная схема распространения событий может показаться усложненной, но она обеспечивает важный механизм централизации кода обработки событий. Стандарт DOM Level 1 предоставляет доступ ко всем элементам документа и до_ пускает возникновение событий (таких как события mouseover) в любом из них. Это значит, что имеется намного больше мест, где могут быть зарегистрированы обработчики событий, чем в старой модели обработки событий Level 0. Предпо_ ложим, что вы хотите вызывать обработчик события при наведении указателя мыши на элемент <p> в вашем документе. Вместо регистрации обработчика собы_ тия onmouseover для каждого тега <p> можно зарегистрировать один обработчик события в объекте Document и в ходе распространения этого события обработать его либо на этапе перехвата, либо на этапе всплывания.
И еще одна важная деталь, относящаяся к распространению событий. В модели Level 0 можно зарегистрировать только один обработчик для определенного ти_ па события в определенном объекте. В то же время в модели Level 2 можно заре_ гистрировать произвольное количество функций_обработчиков для определен_ ного типа события в определенном объекте. Это также относится к предкам це_ левого узла события, чья функция или функции обработки вызываются в ходе перехвата и всплывания события в документе.