,
Стоять ті ж обробники, що і раніше, але цього разу - на стадії занурення. Ну а щоб побачити перехоплення в дії, клікніть в ньому на елементі
Обробники спрацюють в порядку «зверху-вниз»: FORM → DIV → P.
JS-код тут такий:
Var elems = document.querySelectorAll ( "form, div, p"); // на кожен елемент повісимо обробник на стадії перехоплення for (var i = 0; i< elems.length; i++) {
elems[i].addEventListener("click", highlightThis, true);
}
Ніхто вам не заважає призначити обробники для обох стадій, ось так:
Var elems = document.querySelectorAll ( "form, div, p"); for (var i = 0; i< elems.length; i++) {
elems[i].addEventListener("click", highlightThis, true);
elems[i].addEventListener("click", highlightThis, false);
}
Клацніть по внутрішньому елементу
Щоб побачити порядок проходу події:
Повинно бути FORM → DIV → P → P → DIV → FORM. Зауважимо, що елемент
Братиме участь в обох стадіях.
підсумки
- При настанні події - елемент, на якому відбулася подія, позначається як event.target.
- Подія спочатку рухається вниз від кореня документа до event.target, по шляху викликаючи обробники, поставлені через addEventListener (...., True).
- Подія рухається від event.target вгору до початку документа, по дорозі воно викликає обробники, поставлені через addEventListener (...., False).
Кожен обробник матиме доступ до властивостей події:
- event.target - найглибший елемент, на якому власне і відбулася подія.
- event.currentTarget (= this) - елемент, на якому в даний момент спрацював самобработчік (до якого «дійшло» подія).
- event.eventPhase - на якій фазі спрацював обробник події (занурення = 1, спливання = 3).
Спливання можна зупинити викликом методу event.stopPropagation (), але робити це не рекомендується, оскільки подія може вам знадобиться для самих неожіданни' цілей.
перехоплення події
Одна з важливих особливостей мови - перехоплення події. Якщо хтось, наприклад, клацає на кнопці, то викликається програма обробки події onClick, відповідна цій кнопці. За допомогою обробки подій Ви можете добитися того, щоб об'єкт, відповідний вашого вікна, документом або шару, перехоплював і обробляв подія ще до того, як для цієї мети об'єктом зазначеної кнопки буде викликаний оброблювач подій. Точно так же об'єкт вашого вікна, документа або шару може обробляти сигнал про подію ще до того, як він досягає свого звичайного адресата.
Щоб побачити, для чого це може стати в нагоді, давайте розглянемо наступний приклад:
Click on this link
Як видно, ми не вказуємо програми обробки подій в тезі . Замість цього ми пишемо
window.captureEvents (Event.CLICK);
з тим, щоб перехопити подія Clickоб'єктом window. Зазвичай об'єкт window не працює з подією Click. Однак, перехопивши, ми потім його переадресуємо в об'єкт window. Зауважимо, що в Event.CLICKфрагмент CLICKповинен писатися великими літерами. Якщо ж Ви хочете перехоплювати кілька подій, то Вам слід відокремити їх один від одного символами |. наприклад:
window.captureEvents (Event.CLICK | Event.MOVE);
Крім цього в функції handle (), Призначеної нами на роль обробника подій, ми користуємося інструкцією return true;. Насправді це означає, що браузер повинен обробити і саму посилання, після того, як завершиться виконання функції handle (). Якщо ж Ви напишете замість цього return false;, То на цьому все і закінчиться.
Якщо тепер в тезі
Ви задасте програму обробки події onClick, То зрозумієте, що дана програма при виникненні даної події викликана вже не буде. І це не дивно, оскільки об'єкт window перехоплює сигнал про подію ще до того, як він досягає об'єкта link. Якщо ж Ви визначите функцію handle ()як
function handle (e) (
alert ( "The window object captured this event!");
window.routeEvent (e);
return true;
}
то комп'ютер буде перевіряти, чи визначено інші програми обробки подій для даного об'єкта. Мінлива e - це наш об'єкт Event, який передається функції обробки подій у вигляді аргументу.
Крім того, Ви можете безпосередньо послати сигнал про подію будь-якого об'єкта. Для цього Ви можете скористатися методом handleEvent (). Це виглядає наступним чином:
window.captureEvents(Event.CLICK);
window.onclick= handle;
function handle(e) {
document.links.handleEvent(e);
}
"Натисніть" за цим посиланням
onClick = "alert (" Оброблювач подій для другого заслання! ");"> Друге посилання
Всі сигнали про події Click, надсилаються на обробку по другій посиланням - навіть якщо Ви зовсім і не клацнули ні по одній з посилань!
Наступний скрипт демонструє, як Ваш скрипт може реагувати на сигнали про натискання клавіш. Натисніть на будь-яку клавішу і подивіться, як працює цей скрипт.
window.captureEvents(Event.KEYPRESS);
window.onkeypress= pressed;
function pressed(e) {
alert("Key pressed! ASCII-value: " + e.which);
}
На этом уроке мы познакомимся с таким понятием как всплытие события, а также рассмотрим, как его можно прервать. Кроме этого выясним, какие ещё этапы (фазы) проходит событие, перед тем как начать всплывать.
Всплытие события
Если у некоторого элемента возникает событие, то оно начинает "всплывать", т.е. возникает у родителя, потом у прародителя и т.д.
Из этого следует, что событие, которое сгенерировал некоторый элемент, можно перехватить с помощью обработчика на родителе, прародителе и т.д.
Всплытие события (пузырька) продемонстрируем на следующем примере:
Заголовок
Некоторый очень важный текст
Раздел
Некоторый текст
Остальной текст
Напишем небольшой скрипт, с помощью которого добавим обработчик события " click " для всех элементов страницы, а также для объектов document и window .
Створимо HTML-сторінку і вставимо в неї вищенаведений HTML код. Сценарій, написаний на мові JavaScript, вставимо перед закриває тегом body. Після цього відкриємо щойно створену сторінку в веб-браузері, натиснемо клавішу F12 і перейдемо в консоль. Тепер натиснемо лівою кнопкою мишкою в області, що належить елементу strong, і подивимося, як подія буде спливати.
Як перервати спливання події
Спливання події (бульбашки) можна перервати. В цьому випадку у вищих (батьківських) елементів, дана подія викликано не буде. Метод, який призначений для припинення спливання події (пузрька) називається stopPropagation ().
Наприклад, змінимо наш вищенаведений приклад таким чином, щоб подія не спливало вище body: