Дії браузера за замовчуванням
Багато подій автоматично тягнуть за собою дію браузера.
- Клік по посиланню ініціює перехід на новий URL.
- Натискання на кнопку «відправити» в формі - відсилання її на сервер.
- Подвійний клік на тексті - ініціює його виділення.
Є два способи скасувати дію браузера:
- Основний спосіб - це скористатися об'єктом події. Для скасування дії браузера існує стандартний метод event.preventDefault ().
- Якщо ж обробник призначений через onсобитіе (не через addEventListener), то можна просто повернути false з обробника.
У наступному прикладі при кліці по посиланню перехід не відбудеться:
Повертати true не потрібно
Зазвичай значення, яке повертає обробник події, ігнорується.
Єдиний виняток - це return false з обробника, призначеного через onсобитіе.
Іноді в коді початківців розробників можна побачити return інших значень. Але вони не потрібні і ніяк не обробляються.
Даний приклад за допомогою CSS може виводитися так:
Наприклад, ось так:
Так як ми застосували делегування, то меню може збільшуватися, можна додати вкладені списки ul / li. стилізувати їх за допомогою CSS - обробник не зажадає змін.
Дій браузера за замовчуванням досить багато.
Ось деякі приклади подій, які викликають дію браузера:
- mousedown - натискання кнопкою миші в той час як курсор знаходиться на тексті починає його виділення.
- click на - ставить або прибирає галочку.
- submit - при натисканні на в формі дані відправляються на сервер.
- wheel - рух коліщатка миші ініціює прокрутку.
- keydown - при натисканні клавіші в поле вводу з'являється символ.
- contextmenu - при правому кліку показується контекстне меню браузера.
- ...
Події можуть бути пов'язані між собою
Деякі події природним чином випливають одне з одного.
Наприклад, натискання мишкою mousedown на поле введення призводить до фокусуванні всередину нього. Якщо скасувати дію mousedown. то і фокуса не буде.
Спробуйте натиснути мишкою на перший - відбудеться подія onfocus. Це звичайна ситуація.
Але якщо натиснути на другий, то фокусування не відбудеться.
Зробіть так, щоб при кліці на посилання всередині елемента #contents користувачеві виводився питання про те, чи дійсно він хоче покинути сторінку і якщо він не хоче, то переривати перехід по посиланню.
Так це повинно працювати:
- Вміст #contents може бути завантажено динамічно і присвоєно за допомогою innerHTML. Так що знайти всі посилання і поставити на них обробники не можна. Використовуйте делегування.
- Вміст може містити вкладені теги, в тому числі всередині посилань. наприклад, . .
Це - класична задача на тему делегування.
У реальному житті, ми можемо перехопити подія і створити AJAX-запит до сервера, який збереже інформацію про те, з якої посиланням пішов відвідувач.
Ми перехоплюємо подія на contents і піднімаємося до parentNode поки не отримаємо A або не зайдемо в контейнер.