Обработчик событий html
Введение в браузерные события
Событие – это сигнал от браузера о том, что что-то произошло. Все DOM-узлы подают такие сигналы (хотя события бывают и не только в DOM).
Вот список самых часто используемых DOM-событий, пока просто для ознакомления:
События мыши:
- click – происходит, когда кликнули на элемент левой кнопкой мыши (на устройствах с сенсорными экранами оно происходит при касании).
- contextmenu – происходит, когда кликнули на элемент правой кнопкой мыши.
- mouseover / mouseout – когда мышь наводится на / покидает элемент.
- mousedown / mouseup – когда нажали / отжали кнопку мыши на элементе.
- mousemove – при движении мыши.
События на элементах управления:
- submit – пользователь отправил форму .
- focus – пользователь фокусируется на элементе, например нажимает на .
Клавиатурные события:
- keydown и keyup – когда пользователь нажимает / отпускает клавишу.
События документа:
- DOMContentLoaded – когда HTML загружен и обработан, DOM документа полностью построен и доступен.
CSS events:
- transitionend – когда CSS-анимация завершена.
Существует множество других событий. Мы подробно разберём их в последующих главах.
Обработчики событий
Событию можно назначить обработчик, то есть функцию, которая сработает, как только событие произошло.
Именно благодаря обработчикам JavaScript-код может реагировать на действия пользователя.
Есть несколько способов назначить событию обработчик. Сейчас мы их рассмотрим, начиная с самого простого.
Использование атрибута HTML
Обработчик может быть назначен прямо в разметке, в атрибуте, который называется on .
Например, чтобы назначить обработчик события click на элементе input , можно использовать атрибут onclick , вот так:
При клике мышкой на кнопке выполнится код, указанный в атрибуте onclick .
Обратите внимание, для содержимого атрибута onclick используются одинарные кавычки, так как сам атрибут находится в двойных. Если мы забудем об этом и поставим двойные кавычки внутри атрибута, вот так: onclick=»alert(«Click!»)» , код не будет работать.
Атрибут HTML-тега – не самое удобное место для написания большого количества кода, поэтому лучше создать отдельную JavaScript-функцию и вызвать её там.
Следующий пример по клику запускает функцию countRabbits() :
Как мы помним, атрибут HTML-тега не чувствителен к регистру, поэтому ONCLICK будет работать так же, как onClick и onCLICK … Но, как правило, атрибуты пишут в нижнем регистре: onclick .
Использование свойства DOM-объекта
Можно назначать обработчик, используя свойство DOM-элемента on .
К примеру, elem.onclick :
Если обработчик задан через атрибут, то браузер читает HTML-разметку, создаёт новую функцию из содержимого атрибута и записывает в свойство.
Этот способ, по сути, аналогичен предыдущему.
Обработчик всегда хранится в свойстве DOM-объекта, а атрибут – лишь один из способов его инициализации.
Эти два примера кода работают одинаково:
Так как у элемента DOM может быть только одно свойство с именем onclick , то назначить более одного обработчика так нельзя.
В примере ниже назначение через JavaScript перезапишет обработчик из атрибута:
Кстати, обработчиком можно назначить и уже существующую функцию:
Убрать обработчик можно назначением elem.onclick = null .
Доступ к элементу через this
Внутри обработчика события this ссылается на текущий элемент, то есть на тот, на котором, как говорят, «висит» (т.е. назначен) обработчик.
В коде ниже button выводит своё содержимое, используя this.innerHTML :
Частые ошибки
Если вы только начинаете работать с событиями, обратите внимание на следующие моменты.
Функция должна быть присвоена как sayThanks , а не sayThanks() .
Если добавить скобки, то sayThanks() – это уже вызов функции, результат которого (равный undefined , так как функция ничего не возвращает) будет присвоен onclick . Так что это не будет работать.
…А вот в разметке, в отличие от свойства, скобки нужны:
Это различие просто объяснить. При создании обработчика браузером из атрибута, он автоматически создаёт функцию с телом из значения атрибута: sayThanks() .
Так что разметка генерирует такое свойство:
Используйте именно функции, а не строки.
Назначение обработчика строкой elem.onclick = «alert(1)» также сработает. Это сделано из соображений совместимости, но делать так не рекомендуется.
Не используйте setAttribute для обработчиков.
Такой вызов работать не будет:
Регистр DOM-свойства имеет значение.
Используйте elem.onclick , а не elem.ONCLICK , потому что DOM-свойства чувствительны к регистру.
addEventListener
Фундаментальный недостаток описанных выше способов назначения обработчика –- невозможность повесить несколько обработчиков на одно событие.
Например, одна часть кода хочет при клике на кнопку делать её подсвеченной, а другая – выдавать сообщение.
Мы хотим назначить два обработчика для этого. Но новое DOM-свойство перезапишет предыдущее:
Разработчики стандартов достаточно давно это поняли и предложили альтернативный способ назначения обработчиков при помощи специальных методов addEventListener и removeEventListener . Они свободны от указанного недостатка.
Синтаксис добавления обработчика:
Для удаления обработчика следует использовать removeEventListener :
Для удаления нужно передать именно ту функцию-обработчик которая была назначена.
Вот так не сработает:
Обработчик не будет удалён, т.к. в removeEventListener передана не та же функция, а другая, с одинаковым кодом, но это не важно.
Вот так правильно:
Обратим внимание – если функцию обработчик не сохранить где-либо, мы не сможем её удалить. Нет метода, который позволяет получить из элемента обработчики событий, назначенные через addEventListener .
Метод addEventListener позволяет добавлять несколько обработчиков на одно событие одного элемента, например:
Как видно из примера выше, можно одновременно назначать обработчики и через DOM-свойство и через addEventListener . Однако, во избежание путаницы, рекомендуется выбрать один способ.
Существуют события, которые нельзя назначить через DOM-свойство, но можно через addEventListener .
Например, таково событие DOMContentLoaded , которое срабатывает, когда завершена загрузка и построение DOM документа.
Так что addEventListener более универсален. Хотя заметим, что таких событий меньшинство, это скорее исключение, чем правило.
Объект события
Чтобы хорошо обработать событие, могут понадобиться детали того, что произошло. Не просто «клик» или «нажатие клавиши», а также – какие координаты указателя мыши, какая клавиша нажата и так далее.
Когда происходит событие, браузер создаёт объект события, записывает в него детали и передаёт его в качестве аргумента функции-обработчику.
Пример ниже демонстрирует получение координат мыши из объекта события:
Некоторые свойства объекта event :
event.type Тип события, в данном случае «click» . event.currentTarget Элемент, на котором сработал обработчик. Значение – обычно такое же, как и у this , но если обработчик является функцией-стрелкой или при помощи bind привязан другой объект в качестве this , то мы можем получить элемент из event.currentTarget . event.clientX / event.clientY Координаты курсора в момент клика относительно окна, для событий мыши.
Есть также и ряд других свойств, в зависимости от типа событий, которые мы разберём в дальнейших главах.
При назначении обработчика в HTML, тоже можно использовать объект event , вот так:
Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так: function(event) < alert(event.type) >. То есть, её первый аргумент называется «event» , а тело взято из атрибута.
Объект-обработчик: handleEvent
Мы можем назначить обработчиком не только функцию, но и объект при помощи addEventListener . В этом случае, когда происходит событие, вызывается метод объекта handleEvent .
Как видим, если addEventListener получает объект в качестве обработчика, он вызывает object.handleEvent(event) , когда происходит событие.
Мы также можем использовать класс для этого:
Здесь один и тот же объект обрабатывает оба события. Обратите внимание, мы должны явно назначить оба обработчика через addEventListener . Тогда объект menu будет получать события mousedown и mouseup , но не другие (не назначенные) типы событий.
Метод handleEvent не обязательно должен выполнять всю работу сам. Он может вызывать другие методы, которые заточены под обработку конкретных типов событий, вот так:
Теперь обработка событий разделена по методам, что упрощает поддержку кода.
Итого
Есть три способа назначения обработчиков событий:
- Атрибут HTML: onclick=». » .
- DOM-свойство: elem.onclick = function .
- Специальные методы: elem.addEventListener(event, handler[, phase]) для добавления, removeEventListener для удаления.
HTML-атрибуты используются редко потому, что JavaScript в HTML-теге выглядит немного странно. К тому же много кода там не напишешь.
DOM-свойства вполне можно использовать, но мы не можем назначить больше одного обработчика на один тип события. Во многих случаях с этим ограничением можно мириться.
Последний способ самый гибкий, однако нужно писать больше всего кода. Есть несколько типов событий, которые работают только через него, к примеру transitionend и DOMContentLoaded . Также addEventListener поддерживает объекты в качестве обработчиков событий. В этом случае вызывается метод объекта handleEvent .
Не важно, как вы назначаете обработчик – он получает объект события первым аргументом. Этот объект содержит подробности о том, что произошло.
Мы изучим больше о событиях и их типах в следующих главах.
HTML Атрибуты событий
Глобальные атрибуты событий
HTML 4 добавил возможность позволить событиям инициировать действия в браузере, например, запуск JavaScript, когда пользователь щелкает элемент.
Чтобы узнать больше о программировании событий, пожалуйста, посетите наш Учебник по JavaScript.
Ниже приведены глобальные атрибуты событий, которые могут быть добавлены в элементы HTML для определения действий событий.
= Новые атрибуты событий в HTML5.
Атрибуты события окна
События, запускаемые для объекта Window (применяются к тегу ):
Атрибут | Значение | Описание |
---|---|---|
onafterprint | script | Сценарий, запускаемый после печати документа |
onbeforeprint | script | Выполнение сценария перед печатью документа |
onbeforeunload | script | Сценарий, запускаемый при выгрузке документа |
onerror | script | Сценарий, запускаемый при возникновении ошибки |
onhashchange | script | Сценарий, который должен быть запущен, когда были внесены изменения в якорную часть URL-адреса |
onload | script | Срабатывает после завершения загрузки страницы |
onmessage | script | Сценарий, запускаемый при срабатывании сообщения |
onoffline | script | Скрипт, запускаемый при запуске браузера для работы в автономном режиме |
ononline | script | Сценарий, запускаемый при запуске браузера для работы в Интернете |
onpagehide | script | Сценарий для запуска, когда пользователь переходит от страницы |
onpageshow | script | Сценарий, запускаемый при переходе пользователя на страницу |
onpopstate | script | Сценарий, запускаемый при изменении истории окна |
onresize | script | Срабатывает при изменении размера окна обозревателя |
onstorage | script | Сценарий, запускаемый при обновлении области веб-хранилища |
onunload | script | Срабатывает после того, как страница выгружена (или окно браузера закрыто) |
События формы
События, инициированные действиями внутри HTML-формы (применяются почти ко всем элементам HTML, но наиболее используются в элементах формы):
Атрибут | Значение | Описание |
---|---|---|
onblur | script | Запускает момент, когда элемент теряет фокус |
onchange | script | Запускает момент, когда изменяется значение элемента |
oncontextmenu | script | Сценарий, запускаемый при запуске контекстного меню |
onfocus | script | Запускает момент, когда элемент получает фокус |
oninput | script | Сценарий, запускаемый, когда элемент получает пользовательский ввод |
oninvalid | script | Сценарий, запускаемый при недопустимом элементе |
onreset | script | Срабатывает при нажатии кнопки сброса в форме |
onsearch | script | Срабатывает, когда пользователь пишет что-то в поле поиска (для ) |
onselect | script | Срабатывает после выбора некоторого текста в элементе |
onsubmit | script | Срабатывает при отправке формы |
События клавиатуры
Атрибут | Значение | Описание |
---|---|---|
onkeydown | script | Срабатывает, когда пользователь нажимает клавишу |
onkeypress | script | Срабатывает, когда пользователь нажимает клавишу |
onkeyup | script | Срабатывает, когда пользователь освобождает ключ |
События мыши
Атрибут | Значение | Описание |
---|---|---|
onclick | script | Срабатывает при щелчке мышью по элементу |
ondblclick | script | Срабатывает при двойном щелчке мышью по элементу |
onmousedown | script | Срабатывает при нажатии кнопки мыши на элементе |
onmousemove | script | Срабатывает, когда указатель мыши движется, находясь над элементом |
onmouseout | script | Срабатывает, когда указатель мыши перемещается из элемента |
onmouseover | script | Срабатывает, когда указатель мыши перемещается над элементом |
onmouseup | script | Срабатывает при отпускании кнопки мыши над элементом |
onmousewheel | script | Устаревшие. Используйте onwheel вместо атрибута |
onwheel | script | Срабатывает, когда колесо мыши катится вверх или вниз над элементом |
Перетаскивание событий
Атрибут | Значение | Описание |
---|---|---|
ondrag | script | Сценарий, запускаемый при перетаскивании элемента |
ondragend | script | Сценарий, запускаемый в конце операции перетаскивания |
ondragenter | script | Сценарий, запускаемый при перетаскивании элемента в допустимый целевой объект перетаскивания |
ondragleave | script | Сценарий, запускаемый, когда элемент оставляет допустимый целевой объект перетаскивания |
ondragover | script | Сценарий, запускаемый при перетаскивании элемента над допустимым целевым объектом перетаскивания |
ondragstart | script | Сценарий, запускаемый в начале операции перетаскивания |
ondrop | script | Сценарий, запускаемый при удалении перетаскивания элемента |
onscroll | script | Сценарий, запускаемый при прокрутке полосы прокрутки элемента |
События буфера обмена
Атрибут | Значение | Описание |
---|---|---|
oncopy | script | Срабатывает, когда пользователь копирует содержимое элемента |
oncut | script | Срабатывает, когда пользователь режет содержимое элемента |
onpaste | script | Срабатывает, когда пользователь вставляет некоторое содержимое в элемент |
Медиа-события
События, инициированные носителями, такими как видео, изображения и аудио (применяются ко всем элементам HTML, но наиболее распространены в мультимедийных элементах, например , , , , and ).
Совет: Посмотрите на нашу HTML аудио и видео DOM ссылка для получения дополнительной информации.
Обработчик и объект событий в JS
Рассказывать на тему событий в JS легко и приятно, нет необходимости выдумывать какие-то абстрактные примеры. Все очень просто: Веб-разработчик создал на сайте кнопочки, формы или анимацию для взаимодействия с пользователем. Если пользователь нажал на кнопку, то произошло событие клика. Браузер получил сигнал об этом событии и запустил функцию — обработчик события.
Разумеется, что все эти действия нужно прописать в коде, чем мы сейчас и займемся. Для общего понимания в JS есть 4 группы событий:
- события мыши
- события отправки формы
- события клавиатуры
- события документа
События — это все, чем занимается пользователь на странице.
Обработчики событий в JS
Программист вешает обработчик события на элемент, который сразу отреагирует, если в браузере произойдет событие. В этой статье достаточно подробно описаны все три основных способа, как повесить обработчик события на элемент. Из той статьи так же понятно, что назначать и удалять события, лучше всего через методы: addEventListener и removeEventListener.
Запрограммируем, чтобы при клике по кнопке, появилось модальное окно. Сначала прокрутим в голове алгоритм действий:
- получаем элемент со страницы
- поручим обработчику событий, отслеживать событие клика по кнопке
- в случае клика запустить функцию с алертом
Отправить
let btn = document.querySelector(‘button’); // #1
btn.addEventListener(‘click’, function() < // #2
alert(‘Вы кликнули по кнопке’); // #3
>);
Несколько событий в JS
На один элемент можно повесить несколько обработчиков событий.
bет.addEventListener(‘click’, function(event) <
alert(‘Как дела?’);
>);
bет.addEventListener(‘mouseover’, function(event) <
alert(‘Это круто!’);
>);
Объект события в JS
Однако, нам хотелось бы узнать, какое именно событие произошло и какие данные о себе скрывает объект (например её координаты). Для этого есть специальный объект event, через который можно вытащить свойства и методы у объекта. Event передается в callback функцию, как аргумент, а его свойства могут вызываться уже внутри функции.
btn.addEventListener(‘click’, function(event) <
console.log(event);
>);
При клике по кнопке, в консоль выведется полный список всех свойств и методов у события мыши. На это полезно посмотреть в учебных целях.
Но на практике, вряд ли вам потребуется выводить все имеющиеся данные у объекта. Поэтому, чтобы узнать какое было событие, мы добавили к слову event, метод type. В консоли вывелось название события click, которое произошло на нашем элементе.
btn.addEventListener(‘click’, function(event) <
console.log(event.type);
>);
Таким образом, мы можем добавлять после точки название свойства или метода и извлекать нужные нам данные. Наиболее часто используемое у event объекта свойство — это target.
Конструкция event.target
На этом уроке, мы по клику добавляли класс кнопке, оперируя данными, через event.target. Имея доступ к стилям, мы можем изменить фон. Для удобства поместим event.target в переменную.
let btn = document.querySelector(‘btn’);
btn.addEventListener(‘click’, function(event) <
let bg = event.target;
bg.style.background = ‘red’;
>);
Узнаем координаты мыши при клике по блоку.
// в консоли
X: 34 Y: 40
Отмена события в JS
Иногда полезно иметь возможность отменять событие. Кликнув по ссылке, мы ничего не увидим в консоли, поскольку браузер уведет нас по ссылке. Чтобы этого не произошло, нужно отменить стандартное поведение браузера — прописать в теле callback функции — метод preventDefault().
Теперь при клике по ссылке, мы никуда не переходим.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.
DOM — Метод addEventListener
Добавим обработчик события, который срабатывает при нажатии пользователем на кнопку:
Метод addEventListener() присоединяет обработчик события к определенному элементу. При этом новый обработчик события не переписывает уже существующие обработчики событий.
Таким образом, вы можете добавлять сколько угодно обработчиков событий к одному элементу. При этом это могут быть обработчики событий одного типа, например, два события нажатия мышкой.
Вы можете добавлять обработчики событий к любому объекту DOM, а не только к HTML элементам, например, к объекту окна.
Метод addEventListener() позволяет легко контролировать то, как обработчик реагирует на, так называемое, «всплывание» события.
Когда используется метод addEventListener(), JavaScript отделяется от разметки HTML, что улучшает читаемость скрипта и позволяет добавлять обработчики событий даже тогда, когда вы не можете контролировать разметку HTML.
Чтобы удалить обработчик события, нужно воспользоваться методом removeEventListener().
Синтаксис:
элемент.addEventListener(событие, функция, useCapture);
Первый параметр — тип события (например, «click» или «mousedown»).
Второй параметр — функция, которая будет вызываться при возникновении события.
Третий параметр — логическое значение (true/false), определяющее следует ли отправить событие дальше («всплывание») или нужно закрыть это событие. Этот параметр необязателен.
Обратите внимание, что в имени события не используется префикс «on» — «click» вместо «onclick».
В следующем примере при нажатии пользователем на элемент появляется окно с сообщением «Hello World!»:
Также, можно задать и внешнюю «именованную» функцию:
Метод addEventListener() позволяет добавлять несколько обработчиков событий к одному и тому же элементу не переписывая уже существующие обработчики событий:
Также, можно добавлять обработчики событий разных типов:
Добавление обработчика событий к объекту window
Метод addEventListener() позволяет добавлять обработчики событий к любому объекту HTML DOM — HTML элементам, HTML документу, объекту окна (объект window) и другим объектам, поддерживающим события как объект xmlHttpRequest.
В следующем примере добавляется обработчик события, который срабатывает, когда пользователь изменяет размер окна браузера:
Передача параметров
Если необходимо передать параметры, то используйте «анонимную» функцию, которая вызывает специализированную функцию с параметрами:
Всплытие или перехват события?
В HTML DOM существует два способа распространения события — всплытие и перехват.
Распространение события — это последовательность обработки события HTML элементами. Если у вас есть элемент
, вложенный в элемент
, то какой элемент должен обработать событие «click» первым?
При всплытии первым обрабатывает событие самый вложенный элемент, затем его родитель и т.д.: таким образом сначала обрабатывать событие «click» будет элемент
, а затем элемент
При перехвате все происходит наоборот — сначала событие обрабатывает самый внешний элемент, в нашем случае
Метод addEventListener() позволяет задавать тип распространения события. Это можно сделать при помощи параметра «useCapture«:
addEventListener(событие, функция, useCapture );
По умолчанию этот параметр имеет значение false, что задает всплытие события. Если задать ему значение true, то будет использоваться перехват.
Метод removeEventListener()
Метод removeEventListener() удаляет обработчик события, подключенный методом addEventListener():
Поддержка браузерами
Методы addEventListener() и removeEventListener() в настоящее время поддерживаются всеми основными браузерами.
Однако, IE 8 и более ранних версий, а также Opera 6.0 и более ранних версий не поддерживают методы addEventListener() и removeEventListener(). Тем не менее, для этих версий браузеров можно использовать метод attachEvent() для прикрепления обработчика события и метод detachEvent() для его удаления:
элемент.attachEvent(событие, функция);
элемент.detachEvent(событие, функция);