JavaScript – Способи підписки на події. JavaScript - Способи передплати подій Події на елементах керування

JavaScript – Способи підписки на події.  JavaScript - Способи передплати подій Події на елементах керування

Прикласти подію клацання на

Виклик методу addEventListener() з рядком «click» у першому аргументі не впливає на значення якості onclick. У наведеному вище фрагменті клацання на кнопці призведе до виведення двох діалогових вікон alert(). Але важливіше те, що метод addEventListener() можна викликати кілька разів і зареєструвати з його допомогою кілька функцій-обробників для одного і того ж типу події в тому самому об'єкті. При появі події в об'єкті будуть викликані усі обробники, зареєстровані для цього типу події, у порядку їх реєстрації.

Багаторазовий виклик методу addEventListener() для одного і того ж об'єкта з тими самими аргументами не дає жодного ефекту - функція-обробник реєструється лише один раз і повторні виклики не впливають на порядок виклику обробників.

Парним методом addEventListener() є метод removeEventListener()що приймає ті ж три аргументи, але не додає, а видаляє функцію-обробник з об'єкта. Це часто буває зручно, коли необхідно зареєструвати тимчасовий обробник події, потім видалити його в якийсь момент.

Internet Explorer версії нижче IE9 не підтримує методи addEventListener() та removeEventListener(). У версії IE5 та вище визначені схожі методи, attachEvent()і detachEvent(). Оскільки модель подій в IE не підтримує фазу перехоплення, методи attachEvent() і detachEvent() приймають лише два аргументи: тип події та функцію обробника, при цьому в першому аргументі методам у IE передається ім'я властивості обробника з префіксом «on», а не тип події без цього префіксу.

Виклик обробників подій

Після реєстрації обробника подій веб-браузер викликатиме його автоматично, коли у вказаному об'єкті виникатиме подія зазначеного типу. У цьому розділі докладно описується порядок виклику обробників подій, аргументи обробників, контекст виклику (значення this) та призначення значення обробника, що повертається. На жаль, деякі з цих подробиць відрізняються між IE версії 8 та нижче та іншими браузерами.

Аргумент обробника подій

При виклик оброблювача подій йому зазвичай (за одним винятком, про який розповідається нижче) передається об'єкт події у вигляді єдиного аргументу. Властивості об'єкта події містять додаткову інформацію про подію. Властивість type, наприклад, визначає тип події, що виникла.

У IE версії 8 і нижче обробникам подій, зареєстрованим установкою властивості, об'єкт події під час виклику не передається. Натомість об'єкт події зберігається в глобальній змінній window.event. Для перенесення обробники подій можна оформляти, як показано нижче, щоб вони використовували змінну window.event при виклику без аргументу:

Об'єкт події передається обробникам подій, зареєстрованим методом attachEvent(), але вони також можуть використовувати змінну window.event.

Під час реєстрації обробника події за допомогою HTML-атрибута браузер перетворює рядок з програмним кодом на мову JavaScript на функцію. Браузери, відмінні від IE, створюють функцію з єдиним аргументом event. У IE створюється функція, яка не приймає аргументів. Якщо в таких функціях використовувати ідентифікатор event, він посилатиметься на window.event. У будь-якому випадку обробники подій, які визначаються в розмітці HTML, можуть посилатися на об'єкт події за допомогою ідентифікатора event.

Контекст обробників подій

Коли обробник подій реєструється установкою якості, це виглядає як визначення нового способу елемента документа:

E.onclick = function() ( /* реалізація обробника */ );

Тому нічого дивного, що обробники подій викликаються (з одним винятком, що стосується IE, що описується нижче) як методи об'єктів, у яких визначено. Тобто в тілі обробника подій ключове слово цього посилається на мету події.

У обробниках ключове слово цього посилається на цільовий об'єкт, навіть коли вони були зареєстровані за допомогою методу addEventListener(). Однак, на жаль, це не відноситься до методу attachEvent(): обробники, зареєстровані за допомогою методу attachEvent(), викликаються як функції, і в них ключове слово цього посилається на глобальний (Window) об'єкт. Цю проблему можна вирішити в такий спосіб:

/* Реєструє зазначену функцію як обробник подій зазначеного типу у вказаному об'єкті. Гарантує, що оброблювач завжди буде викликатись як метод цільового об'єкта. */ function addEvent(target, type, handler) ( if (target.addEventListener) target.addEventListener(type, handler, false); else target.attachEvent("on" + type, function(event) ( // Викликати обробник як метод мети // і передати йому об'єкт події return handler.call(target, event); ));

Зверніть увагу, що обробники подій, зареєстровані таким способом, не можна видалити, тому що посилання на функцію-обгортку, що передається методом attachEvent(), ніде не зберігається, щоб її можна було передати методу detachEvent().

Значення обробників, що повертаються

Значення, яке повертається обробником події, зареєстрованим установкою властивості об'єкта або за допомогою HTML-атрибута, слід враховувати. Зазвичай значення, що повертається false повідомляє браузеру, що він не повинен виконувати дії, передбачені для цієї події за замовчуванням.

Наприклад, обробник onclick кнопки відправки форми може повернути false, щоб запобігти відправці форми браузером. (Це може стати в нагоді, якщо введення користувача не пройшло перевірку на стороні клієнта.) Аналогічно обробник події onkeypress поля введення може фільтрувати введення з клавіатури, повертаючи false при введенні неприпустимих символів.

Також важливе значення, що повертається обробником напопередньомуоб'єкті Windows. Ця подія генерується, коли браузер переходить на іншу сторінку. Якщо цей обробник поверне рядок, вона буде виведена в модальному діалоговому вікні, що пропонує користувачеві підтвердити бажання залишити сторінку.

Важливо розуміти, що враховуються значення, які повертаються обробниками подій, тільки якщо обробники зареєстровані за допомогою установки властивостей. Обробники, зареєстровані за допомогою addEventListener() або attachEvent(), замість цього повинні викликати метод preventDefault() або встановлювати властивість returnValue об'єкта події.

Скасування подій

Значення, що повертається обробником події, зареєстрованим як властивість, можна використовувати для скасування дій, що виконуються за замовчуванням браузером у випадку цієї події. У браузерах, що підтримують метод addEventListener(), скасувати виконання дій за замовчуванням можна також викликом методу preventDefault()об'єкт події. Однак у IE, версії 8 і нижче, той самий ефект досягається установкою властивості returnValueоб'єкт події на значення false.

У наступному фрагменті демонструється обробник події кліка за посиланням, який використовує всі три способи відміни події (блокує перехід користувача за посиланням):

Window.onload = function() ( // Знайти усі посилання var a_href = document.getElementsByTagName("a"); // Додати обробник події click (не для IE

Поточний проект модуля DOM Events 3 визначає в об'єкті Event властивість з ім'ям defaultPrevented. Воно поки що підтримується не всіма браузерами, але суть його в тому, що за звичайних умов воно має значення false і приймає значення true тільки у разі виклику методу preventDefault().

Скасування дій, за умовчанням пов'язаних із подією, - це лише один з різновидів скасування події. Є також можливість зупинити поширення події. У браузерах, які підтримують метод addEventListener(), об'єкт події має метод stopPropagation(), Виклик якого перериває подальше поширення події. Якщо в тому ж цільовому об'єкті будуть зареєстровані інші обробники цієї події, інші обробники все одно будуть викликані, але ніякі інші обробники подій в інших об'єкта не будуть викликані після виклику методу stopPropagation().

У IE версії 8 та нижче метод stopPropagation() не підтримується. Натомість об'єкт події в IE має властивість cancelBubble. Встановлення цієї властивості значення true запобігає поширенню події.

Поточний проект специфікації «DOM Events 3» визначає в об'єкті Event ще один метод – метод з ім'ям stopImmediatePropagation(). Подібно до методу stopPropagation(), він запобігає поширенню події за будь-якими іншими об'єктами. Але крім того, він також запобігає виклику будь-яких інших обробників подій, зареєстрованих у тому ж об'єкті.


Найбільш обговорюване
Зарядний пристрій автомобільних акумуляторів Зарядний пристрій автомобільних акумуляторів
Потужний та якісний саморобний підсилювач звуку Потужний та якісний саморобний підсилювач звуку
Саморобний автомобільний зарядний пристрій із деталей від старих приладів Саморобний автомобільний зарядний пристрій із деталей від старих приладів


top