JavaScript. Подробное руководство, 6-е издание, стр. 257

<b>function cancelHandler(event) {</b>

<b>  var event = event || window.event; // Для IE</b>

<b>  /* Здесь выполняется обработка события */</b>

<b>  // Теперь отменить действие по умолчанию, связанное с событием</b>

<b>  if (event.preventDefault) event.preventDefault(); // Стандартный прием</b>

<b>  if (event.returnValue) event.returnValue = false; // IE</b>

<b>  return false; // Для обработчиков, зарегистрированных как свойства</b>

<b>}</b>

Текущий проект модуля «DOM Events» определяет в объекте Event свойство с именем

<b>defaultPrevented</b>
. Оно пока поддерживается не всеми броузерами, но суть его в том, что при обычных условиях оно имеет значение false и принимает значение true только в случае вызова метода
<b>preventDefault().</b>
[46]

Отмена действий, по умолчанию связанных с событием, - это лишь одна из разновидностей отмены события. Имеется также возможность остановить распространение события. В броузерах, поддерживающих метод

<b>addEventListener(),</b>
объект события имеет метод
<b>stopPropagation(),</b>
вызов которого прерывает дальнейшее распространение события. Если в том же целевом объекте будут зарегистрированы другие обработчики этого события, то остальные обработчики все равно будут вызваны, но никакие другие обработчики событий в других объекта не будут вызваны после вызова метода
<b>stopPropagation().</b>
Метод
<b>stopPropagation()</b>
можно вызвать в любой момент в ходе распространения события. Он действует и в фазе перехвата, и в вызове обработчика целевого объекта, и в фазе всплытия.

В IE версии 8 и ниже метод

<b>stopPropagation()</b>
не поддерживается. Вместо этого объект события в IE имеет свойство
<b>cancelBubble</b>
. Установка этого свойства в значение true предотвращает распространение события. (В IE версии 8 и ниже фаза перехвата не поддерживается, поэтому отменить событие можно только в фазе всплытия.)

Текущий проект спецификации «DOM Events» определяет в объекте

<b>Event</b>
еще один метод - метод с именем
<b>stopImmediatePropagation().</b>
Подобно методу
<b>stopPropagation(),</b>
он предотвращает распространение события по любым другим объектам. Но кроме того, он также предотвращает вызов любых других обработчиков событий, зарегистрированных в том же объекте. На момент написания этих строк метод
<b>stopImmediatePropagation()</b>
поддерживался не во всех броузерах. Некоторые библиотеки, такие как jQuery и YUI, определяют свою, переносимую, версию метода
<b>stopImmediatePropagation()</b>
.

17.4. События загрузки документа

Теперь, когда мы познакомились с основами обработки событий в языке JavaScript, можно приступать к изучению подробностей, касающихся отдельных категорий событий. В этом разделе мы начнем с событий, возникающих при загрузке документа.

Большинству веб-приложений совершенно необходимо, чтобы веб-броузер извещал их о моменте, когда закончится загрузка документа и он будет готов для выполнения операций над ним. Этой цели служит событие «load» в объекте

<b>Window</b>
, и оно уже подробно обсуждалось в главе 13, где в примере 13.5 была представлена реализация вспомогательной функции
<b>onLoad().</b>
Событие «load» возбуждается только после того, как документ и все его изображения будут полностью загружены. Однако обычно сценарии можно запускать сразу после синтаксического анализа документа, до того как будут загружены изображения. Можно существенно сократить время запуска веб-приложения, если начинать выполнение сценариев по событиям, отличным от «load».

Событие «DOMContentLoaded» возбуждается, как только документ будет загружен, разобран синтаксическим анализатором, и будут выполнены все отложенные сценарии. К этому моменту изображения и сценарии с атрибутом

<b>async</b>
могут продолжать загружаться, но сам документ уже будет готов к выполнению операций. (Отложенные и асинхронные сценарии обсуждались в разделе 13.3.1.) Это событие впервые было введено в Firefox и впоследствии заимствовано всеми другими производителями броузеров, включая корпорацию Microsoft, которая добавила поддержку этого события в IE9. Несмотря на приставку «DOM» в имени, это событие не является частью стандарта модели событий «DOM Level 3 Events», но оно стандартизовано спецификацией HTML5.

Как описывалось в разделе 13.3.4, в ходе загрузки документа изменяется значение свойства

<b>document.readyState</b>
. Каждое изменение значения этого свойства в IE сопровождается событием «readystatechange» в объекте
<b>Document</b>
, благодаря чему в IE это событие можно использовать для определения момента появления состояния «complete». Спецификация HTML5 стандартизует событие «readystatechange», но предписывает возбуждать его непосредственно перед событием «load», поэтому не совсем понятно, в чем заключается преимущество события «readystatechange» перед «load».

В примере 17.1 определяется функция

<b>whenReady(),</b>
близко напоминающая функцию
<b>onLoad()</b>
из примера 13.5. Функция, передаваемая функции
<b>whenReady(),</b>
вызывается (как метод объекта
<b>Document</b>
) сразу, как только документ будет готов к выполнению операций. В отличие от ранее представленной функции
<b>onLoad(), whenReady()</b>
ожидает появления событий «DOMContentLoaded» и «readystatechange» и использует событие «load» только как запасной вариант, на случай если она будет задействована в старых броузерах, не поддерживающих первые два события. Функция
<b>whenReady()</b>
будет использоваться в некоторых сценариях, следующих далее (в этой и в других главах).

Пример 17.1. Вызов функций, когда документ будет готов к выполнению операций

<b>/*</b>

<b>* Передайте функции whenReady() свою функцию, и она вызовет ее (как метод</b>

<b>* объекта документа), как только завершится синтаксический анализ документа</b>

<b>* и он будет готов к выполнению операций. Зарегистрированные функции</b>