Интерфейс Event в DOM2

Интерфейс Event содержит данные о событии, которые можно использовать для его обработки.

Для интерфейса Event определены три числовые константы, определяющие этап обработки события:

· CAPTURING_PHASE (1) – событие находится на этапе захвата;

· AT_TARGET (2) – событие находится на этапе обработки в объекте, в котором произошло событие;

· BUBBLING_PHASE (3) – событие находится на этапе «всплывания».

Для интерфейса Event определены следующие свойства, доступные только для чтения:

· type – содержит строковое значение имени события, например, "click" (аналогично одноименному свойству для объекта event в Internet Explorer);

· target – содержит объект, в котором произошло событие (аналогично свойству srcElement для объекта event в Internet Explorer);

· currentTarget – содержит объект, блок прослушивания которого (см.????) обрабатывает событие;

· eventPhase – содержит значение константы для текущего этапа обработки события;

· bubbles – содержит значение true, если «всплывание» событий разрешено и false – в противном случае (аналогично свойству cancelBubble для объекта event в Internet Explorer);

· cancelable – содержит значение true, если действие события по умолчанию можно отменить и false – в противном случае (аналогично свойству returnValue для объекта event в Internet Explorer);

· timeStamp – содержит время, когда произошло событие (в миллисекундах с 1 января 1970 года) или 0, если время события не удалось определить.

Интерфейс Event также содержит методы: stopPropagation() и preventDefault().

Значение свойства bubbles для разных событий может быть как true (событие может всплывать), так и false (событие не может всплывать). Если событие является всплывающим (значение свойства bubbles равно true), то отменить его всплывание можно с помощью метода stopPropagation(). Метод не имеет параметров и не возвращает значения.

Возможность отмены события по умолчанию является значением свойства cancelable события. Это значение для разных событий может быть как true (действие события по умолчанию можно отменять), так и false (действие события по умолчанию нельзя отменять). Если событие можно отменить (значение свойства cancelable равно true), то отменить его действие по умолчанию можно с помощью метода preventDefault(). Метод не имеет параметров и не возвращает значения.

Во всех Web-браузерах, поддерживающих спецификацию DOM2 Events, для интерфейса Event введено также свойство which (только для чтения), содержащее десятичный код Unicode символа клавиши клавиатуры (при событиях keydown, keypress и keyup). Это свойство аналогично свойству keyCode события event в Internet Explorer.

Пример 4.5.46. Использование свойств и методов события Event:

1. Обработка события для клавиши клавиатуры:

Определение элемента, в котором произошло событие, для примера 4.5.44(2). Изменим функцию-обработчик для этого примера следующим образом:

function clickEvent(evt)

{

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Получение элемента, в котором

// обрабатывается событие, в IE

eventElement = window.event.srcElement;

else

// Получение элемента, в котором

// обрабатывается событие, в DOM2

eventElement = evt.target;

// Получение имени элемента

elementName = eventElement.tagName;

// Получение значения атрибута id для элемента

elementId = eventElement.id;

// Вывод имени и значения id

alert("elementName=" + elementName +

"\nelementId=" + elementId);

}

Тогда для элементов тела документа HTML при щелчке по ним мышью будут выведены следующие сообщения:

2. Обработка события для клавиши клавиатуры:

Объявление функции-обработчика для события нажатия клавиши и описание функции обработчика имеют следующий вид:

document.onkeypress = eventKeyPress;

function eventKeyPress(evt)

{

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Получение кода нажатой клавиши

pressedKeyCode = window.event.keyCode;

else

// Получение кода нажатой клавиши

pressedKeyCode = evt.which;

// Получение символа для клавиши

keySymbol = String.fromCharCode(

parseInt(pressedKeyCode));

// Вывод символа клавиши

alert("Нажата клавиша '" + keySymbol + "'");

}

В теле документа HTML выводится следующий заголовок:

<h4>Нажмите на одну из алфавитно-цифровых<br/>

клавиш клавиатуры</h4>

Пример вывода Web-страницы:

3. Обработка «всплывания» события:

В заголовке Web-страницы заданы следующие функции:

// Обработка события щелчка мышью для элемента p

function pEvent(evt)

{

// Если Web-браузер – Internet Explorer

if (navigator.userAgent.indexOf("MSIE")!= -1)

alert(' pEvent():\nid=' +

window.event.srcElement.id);

else // Если Web-браузер совместим с DOM2

{

alert(' pEvent():\nid=' + evt.target.id +

' currentId=' + evt.currentTarget.id);

}

}

// Обработка события щелчка мышью для элемента span

function spanEvent(evt)

{

// Если Web-браузер – Internet Explorer

if (navigator.userAgent.indexOf("MSIE")!= -1)

{

// Вывод значения id для свойства srcElement

alert(' spanEvent():\nid=' +

window.event.srcElement.id);

}

else // Если Web-браузер совместим с DOM2

{

// Вывод значений id для свойств

// target и currentTarget

alert(' spanEvent():\nid=' + evt.target.id +

' currentId=' + evt.currentTarget.id);

}

}

// Задание обработки событий

function addListener()

{

// Если Web-браузер – Internet Explorer

if (navigator.userAgent.indexOf("MSIE")!= -1)

{

// Прикрепление функций-обработчиков событий

document.getElementById(

"p1").attachEvent("onclick", pEvent);

document.getElementById(

"sp1").attachEvent("onclick", spanEvent);

document.getElementById(

"sp2").attachEvent("onclick", spanEvent);

}

else // Если Web-браузер совместим с DOM2

{

// Добавление блоков прослушивания

// для событий

document.getElementById("p1").addEventListener(

"click", pEvent, false);

document.getElementById("sp1").addEventListener(

"click", spanEvent, false);

document.getElementById("sp2").addEventListener(

"click", spanEvent, false);

}

}

.bold {font-weight: bold}

<body onload="addListener()">

<p id="p1">Для указания относительного размера шрифта

(по сравнению с размером шрифта родительского текста) можно

использовать значения

<span id="sp1" class="bold">larger</span>

и <span id="sp2" class="bold">smaller</span>.</p>

Если щелкнуть мышью по содержимому одного из элементов span, например, с id="sp1", то в Internet Explorer будет выведено два раза следующее сообщение:

а в совместимых с DOM2 Web-браузерах сообщения будут иметь следующий вид:

И в том, и в другом случае событие будет обработано сначала для элемента span с id="sp1", а затем для его элемента-родителя p c id="p1".

4. Отмена «всплывания» события:

Если примере 4.5.46(3) в функции spanEvent() в фигурные скобки для Internet Explorer вставить предложение

event.cancelBubble = true;,

а в фигурные скобки для Web-браузеров, совместимых с DOM2, вставить предложение

evt.stopPropagation();,

то обработка события в элементе-родителе p c id="p1" выполняться не будет и для Internet Explorer, и для Web-браузеров, совместимых с DOM2, будет выведено только первое из двух сообщений примера 4.5.46(3).

5. Захват события:

Заменим в примере 4.5.46(3) предложение добавления блока прослушивания элемента p c id="p1" в функции addListener() на следующее предложение:

document.getElementById("p1").addEventListener(

"click", pEvent, true);.

В этом случае событие щелчка мышью по одному из элементов span в Web-браузерах, совместимых с DOM2, будет сначала обрабатываться функцией pEvent(), а затем функцией spanEvent(), а сообщения функций alert() будут выведены в следующем порядке:

В Internet Explorer захват событий не реализован (точнее этот захват происходит, если для события потомка не определена обработка события). Поэтому, если в примере 4.5.46(3) в функции addListener() закомментировать предложения прикрепления функций-обработчиков для элементов span, будет выведено следующее сообщение функции alert():

6. Отмена обработки события в узле-потомке при захвате:

Предотвратить обработку события функцией spanEvent() в примере 4.5.46(5) можно, если в функцию pEvent() в фигурные скобки для Web-браузеров, совместимых с DOM2, вставить предложение

evt.stopPropagation();.

В этом случае будет выведено только первое из двух сообщений в примере 4.5.46(5).

7. Отмена обработки события по умолчанию:

По умолчанию обработка события для элемента a заключается в переходе к указанной в атрибуте href гиперссылке.

Следующая последовательность предложений отменяет переход по гиперссылке для элемента a и выводит на экран сообщение "Гиперссылка не функционирует".

function linkClick(evt)

{

// Если Web-браузер – Internet Explorer

if (if (navigator.userAgent.indexOf("MSIE")!= -1))

// Отмена обработки события по умолчанию в IE

window.event.returnValue =false;

else

// Отмена обработки события

// по умолчанию в DOM2

evt.preventDefault();

// Вывод сообщения об отмене гиперссылки

alert("Гиперссылка не функционирует");

}

function addListener()

{

// Объявление функции-обработчика для a1

document.getElementById("a1").onclick=linkClick;

}

<body onload="addListener()">

<p><a id="a1" href="nextPage.html">

Переход к следующей странице</a></p>.

При вызове гиперссылки будет выведено сообщение:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: