Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
197
Добавлен:
10.05.2015
Размер:
99 Кб
Скачать
☆

Передача объекта event функции-обработчику

Как было сказано, событие передается вверх по иерархии от элемента-источника к родительскому элементу и дальше. Процесс может быть остановлен присвоением свойству cancelBubbleзначенияtrue.

<script type="text/javascript">

function checkCancel() {

if (window.event.shiftKey)

window.event.cancelBubble = true;

}

function showSrc() {

if (window.event.srcElement.tagName == "IMG")

alert(window.event.srcElement.src);

}

</script>

...

<body onclick="showSrc()">

<img onclick="checkCancel()" src="sample.gif">

</body>

...

В этом примере и элемент img, и его родительский элементbodyимеют обработчик событияonclick. При щелчке по изображению сначала вызывается функцияcheckCancel, которая проверяет состояние клавишиShift. Если клавиша нажата, передача вверх по иерархии прекращается, если нет, выполняется также функцияshowSrc. К сожалению, этот пример работает только в Internet Explorer (начиная с версии 4.0). Различия в объектной модели Internet Explorer и большинства других браузеров максимальны именно в объектеeventи доступе к нему. В случае Internet Explorer объектeventдоступен в функции-обработчике как глобальный объект, в других браузерах этот объект создается элементом-источником и доступен при вызове обработчика. Перепишем код следующим образом:

<script type="text/javascript">

function checkCancel(e) {

if (e.shiftKey)

e.cancelBubble = true;

}

function showSrc(e) {

if (e.srcElement.tagName == "IMG")

alert(e.srcElement.src);

}

</script>

...

<body onclick="showSrc(event)">

<img onclick="checkCancel(event)" src="sample.gif">

</body>

...

В этом варианте функция checkCancel работает как в Internet Explorer, так и в Mozilla Firefox, Apple Safari и Google Chrome, однако функция showSrc по-прежнему работает только в Internet Explorer. Дело в том, что элемент-источник события доступен в Internet Explorer как свойство событияsrcElement, а в других браузерах какtarget. Для учета различий можно применить один из нескольких методов:

  1. Написать отдельные страницы для каждого браузера. Его мы обсуждать не будем.

  2. Определить используемый браузер (при помощи объекта window.navigator).

  3. function showSrc(e) {

  4. // userAgent в Internet Explorer любой версии содержит

  5. // подстроку 'MSIE', которой нет в других браузерах

  6. var isIE = window.navigator.userAgent.indexOf('MSIE') > -1;

  7. if (isIE) {

  8. if (e.srcElement.tagName == "IMG")

  9. alert(e.srcElement.src);

  10. }

  11. else {

  12. if (e.target.tagName == "IMG")

  13. alert(e.target.src);

  14. }

  15. }

Такой подход использовался и используется, однако он имеет существенный недостаток: мы не знаем, существует ли свойство targetу объектаeventв "другом" браузере.

  1. Определить наличие интересующего свойства. Этот подход считается более плодотворным.

  2. function showSrc(e) {

  3. var elem = null;

  4. if (e.srcElement)

  5. elem = e.srcElement;

  6. else if (e.target)

  7. elem = e.target;

  8. if (elem != null) {

  9. if (elem.tagName == "IMG")

  10. alert(elem.src);

  11. }

  12. else {

  13. alert("Ваш браузер не поддерживает DOM модель");

  14. }

  15. }