Частые ошибки
Если вы только начинаете работать с событиями, обратите внимание на следующие моменты.
Функция должна быть присвоена как
Если добавить скобки, то
#браузер #документ #события
Если вы только начинаете работать с событиями, обратите внимание на следующие моменты.
Функция должна быть присвоена как
sayThanks
, а не sayThanks()
.Если добавить скобки, то
sayThanks()
– это уже вызов функции, результат которого (равный undefined
, так как функция ничего не возвращает) будет присвоен onclick
. Так что это не будет работать.#браузер #документ #события
👍13🔥2
addEventListener
Метод
Данный метод позволяет "вешать" несколько обработчиков одного и того же события на один элемент. Именно благодаря этому является более предпочтительным вариантом обработки событий.
#браузер #документ #события
Метод
EventTarget.addEventListener()
регистрирует определённый обработчик события, вызванного на EventTarget
.Данный метод позволяет "вешать" несколько обработчиков одного и того же события на один элемент. Именно благодаря этому является более предпочтительным вариантом обработки событий.
#браузер #документ #события
👍11🔥4
Свойство «hidden»
Атрибут и DOM-свойство «hidden» указывает на то, видим ли мы элемент или нет.
Мы можем использовать его в HTML или назначать при помощи JavaScript, как в примере ниже (см. пример выше на картинке).
Технически,
#браузер #документ #свойства_узлов
Атрибут и DOM-свойство «hidden» указывает на то, видим ли мы элемент или нет.
Мы можем использовать его в HTML или назначать при помощи JavaScript, как в примере ниже (см. пример выше на картинке).
Технически,
hidden
работает так же, как style="display:none"
. Но его применение проще.#браузер #документ #свойства_узлов
👍11🔥1
Удаление требует именно ту же функцию
Для удаления нужно передать именно ту функцию-обработчик которая была назначена.
Первый вариант не сработает, т.к. в
Обратим внимание – если функцию обработчик не сохранить где-либо, мы не сможем её удалить. Нет метода, который позволяет получить из элемента обработчики событий, назначенные через
#браузер #документ #события
Для удаления нужно передать именно ту функцию-обработчик которая была назначена.
Первый вариант не сработает, т.к. в
removeEventListener
передана не та же функция, а другая, с одинаковым кодом, но это не важно.Обратим внимание – если функцию обработчик не сохранить где-либо, мы не сможем её удалить. Нет метода, который позволяет получить из элемента обработчики событий, назначенные через
addEventListener
.#браузер #документ #события
👍10🔥4
Обработчики некоторых событий можно назначать только через addEventListener
Существуют события, которые нельзя назначить через DOM-свойство, но можно через
Например, таково событие
Так что
#браузер #документ #события
Существуют события, которые нельзя назначить через DOM-свойство, но можно через
addEventListener
.Например, таково событие
DOMContentLoaded
, которое срабатывает, когда завершена загрузка и построение DOM документа.Так что
addEventListener
более универсален. Хотя заметим, что таких событий меньшинство, это скорее исключение, чем правило.#браузер #документ #события
👍10🔥2
Объект события
Чтобы хорошо обработать событие, могут понадобиться детали того, что произошло. Не просто «клик» или «нажатие клавиши», а также – какие координаты указателя мыши, какая клавиша нажата и так далее.
Когда происходит событие, браузер создаёт объект события, записывает в него детали и передаёт его в качестве аргумента функции-обработчику.
Пример выше демонстрирует получение координат мыши из объекта события.
#браузер #документ #события
Чтобы хорошо обработать событие, могут понадобиться детали того, что произошло. Не просто «клик» или «нажатие клавиши», а также – какие координаты указателя мыши, какая клавиша нажата и так далее.
Когда происходит событие, браузер создаёт объект события, записывает в него детали и передаёт его в качестве аргумента функции-обработчику.
Пример выше демонстрирует получение координат мыши из объекта события.
#браузер #документ #события
👍10🔥1
Основные свойства объекта event
#браузер #документ #события
event.type
— тип события, в данном случае "click"
.event.currentTarget
— элемент, на котором сработал обработчик. Значение – обычно такое же, как и у this
, но если обработчик является функцией-стрелкой или при помощи bind
привязан другой объект в качестве this
, то мы можем получить элемент из event.currentTarget
.event.clientX / event.clientY
— координаты курсора в момент клика относительно окна, для событий мыши.#браузер #документ #события
👍8🔥4❤1
Объект события доступен и в HTML
При назначении обработчика в HTML, тоже можно использовать объект
Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так:
То есть, её первый аргумент называется
#браузер #документ #события
При назначении обработчика в HTML, тоже можно использовать объект
event
.Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так:
f
unction(event) { alert(event.type) }
. То есть, её первый аргумент называется
"event"
, а тело взято из атрибута.#браузер #документ #события
👍9❤2🔥1
Можно использовать класс для обработки событий
Как видим, если
Здесь один и тот же объект обрабатывает оба события. Обратите внимание, мы должны явно назначить оба обработчика через
#браузер #документ #события
Как видим, если
addEventListener
получает класс в качестве обработчика, он вызывает menu.handleEvent(event)
, когда происходит событие.Здесь один и тот же объект обрабатывает оба события. Обратите внимание, мы должны явно назначить оба обработчика через
addEventListener
. Тогда объект menu
будет получать события mousedown
и mouseup
, но не другие (не назначенные) типы событий.#браузер #документ #события
👍12❤2🔥1
Декомпозиция процесса обработки событий
Метод
Теперь обработка событий разделена по методам, что упрощает поддержку кода.
#браузер #документ #события
Метод
handleEvent
не обязательно должен выполнять всю работу сам. Он может вызывать другие методы, которые заточены под обработку конкретных типов событий (см. пример на картинке).Теперь обработка событий разделена по методам, что упрощает поддержку кода.
#браузер #документ #события
👍8🔥4
textContent: просто текст
Свойство
Как мы видим, возвращается только текст, как если бы все
На практике редко появляется необходимость читать текст таким образом.
Намного полезнее возможность записывать текст в
#браузер #документ #свойства_узлов
Свойство
textContent
предоставляет доступ к тексту внутри элемента за вычетом всех <тегов>
(см. пример на картинке выше).Как мы видим, возвращается только текст, как если бы все
<теги>
были вырезаны, но текст в них остался.На практике редко появляется необходимость читать текст таким образом.
Намного полезнее возможность записывать текст в
textContent
, т.к. позволяет писать текст «безопасным способом».#браузер #документ #свойства_узлов
👍13❤1🔥1
Всплытие
Принцип всплытия очень простой.
Когда на элементе происходит событие, обработчики сначала срабатывают на нём, потом на его родителе, затем выше и так далее, вверх по цепочке предков.
Например, есть 3 вложенных элемента
Клик по внутреннему
- Сначала на самом
- Потом на внешнем
- Затем на внешнем
- И так далее вверх по цепочке до самого
Поэтому если кликнуть на
Этот процесс называется «всплытием», потому что события «всплывают» от внутреннего элемента вверх через родителей подобно тому, как всплывает пузырёк воздуха в воде.
#браузер #документ #всплытие
Принцип всплытия очень простой.
Когда на элементе происходит событие, обработчики сначала срабатывают на нём, потом на его родителе, затем выше и так далее, вверх по цепочке предков.
Например, есть 3 вложенных элемента
FORM > DIV > P
с обработчиком на каждом.Клик по внутреннему
<p>
вызовет обработчик onclick
:- Сначала на самом
<p>
.- Потом на внешнем
<div>
.- Затем на внешнем
<form>
.- И так далее вверх по цепочке до самого
document
.Поэтому если кликнуть на
<p>
, то мы увидим три оповещения: p
→ div
→ form
.Этот процесс называется «всплытием», потому что события «всплывают» от внутреннего элемента вверх через родителей подобно тому, как всплывает пузырёк воздуха в воде.
#браузер #документ #всплытие
👍22❤3🔥2
Свойство
Всегда можно узнать, на каком конкретно элементе произошло событие.
Самый глубокий элемент, который вызывает событие, называется целевым элементом, и он доступен через
Отличия от
-
-
Например, если стоит только один обработчик
При этом внутри обработчика
-
-
#браузер #документ #всплытие
event.target
Всегда можно узнать, на каком конкретно элементе произошло событие.
Самый глубокий элемент, который вызывает событие, называется целевым элементом, и он доступен через
event.target
.Отличия от
this
(=event.currentTarget
):-
event.target
– это «целевой» элемент, на котором произошло событие, в процессе всплытия он неизменен.-
this
– это «текущий» элемент, до которого дошло всплытие, на нём сейчас выполняется обработчик.Например, если стоит только один обработчик
form.onclick
, то он «поймает» все клики внутри формы. Где бы ни был клик внутри – он всплывёт до элемента <form>
, на котором сработает обработчик.При этом внутри обработчика
form.onclick
:-
this
(=event.currentTarget
) всегда будет элемент <form>
, так как обработчик сработал на ней.-
event.target
будет содержать ссылку на конкретный элемент внутри формы, на котором произошёл клик.#браузер #документ #всплытие
👍16🔥3
Прекращение всплытия
Всплытие идёт с «целевого» элемента прямо наверх. По умолчанию событие будет всплывать до элемента
Но любой промежуточный обработчик может решить, что событие полностью обработано, и остановить всплытие.
Для этого нужно вызвать метод
Например, здесь (см. картинку) при клике на кнопку
#браузер #документ #всплытие
Всплытие идёт с «целевого» элемента прямо наверх. По умолчанию событие будет всплывать до элемента
<html>
, а затем до объекта document
, а иногда даже до window
, вызывая все обработчики на своём пути.Но любой промежуточный обработчик может решить, что событие полностью обработано, и остановить всплытие.
Для этого нужно вызвать метод
event.stopPropagation()
.Например, здесь (см. картинку) при клике на кнопку
<button>
обработчик body.onclick
не сработает.#браузер #документ #всплытие
👍12🔥3