Чтобы хорошо обработать событие, недостаточно знать о том, что это – «клик» или «нажатие клавиши». Могут понадобиться детали: координаты курсора, введённый символ и другие, в зависимости от события.
Детали произошедшего браузер записывает в «объект события», который передаётся первым аргументом в обработчик.
Свойства объекта события
Пример ниже демонстрирует использование объекта события:
<
input
type
=
"
button"
value
=
"
Нажми меня"
id
=
"
elem"
>
<
script
>
elem.
onclick
=
function
(
event
)
{
// вывести тип события, элемент и координаты клика
alert
(
event.
type +
" на "
+
event.
currentTarget)
;
alert
(
event.
clientX +
":"
+
event.
clientY)
;
}
</
script
>
Свойства объекта event
:
event.type
- Тип события, в данном случае
click
event.currentTarget
- Элемент, на котором сработал обработчик. Значение – в точности такое же, как и у
this
, но бывают ситуации, когда обработчик является методом объекта и егоthis
при помощиbind
привязан к этому объекту, тогда мы можем использоватьevent.currentTarget
. event.clientX / event.clientY
- Координаты курсора в момент клика (относительно окна)
Есть также и ряд других свойств, в зависимости от событий, которые мы разберём в дальнейших главах, когда будем подробно знакомиться с событиями мыши, клавиатуры и так далее.
При назначении обработчика в HTML, тоже можно использовать переменную event
, это будет работать кросс-браузерно:
<
input
type
=
"
button"
onclick
=
"
alert
(
event.
type)
"
value
=
"
Тип события"
>
Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так: function(event) { alert(event.type) }
. То есть, её первый аргумент называется "event"
.
Особенности IE8-
IE8- вместо передачи параметра обработчику создаёт глобальный объект window.event
. Обработчик может обратиться к нему.
Работает это так:
elem.
onclick
=
function
(
)
{
// window.event - объект события
alert
(
window.
event.
clientX )
;
}
;
Кроссбраузерное решение
Универсальное решение для получения объекта события:
element.
onclick
=
function
(
event
)
{
event =
event ||
window.
event;
// (*)
// Теперь event - объект события во всех браузерах.
}
;
Строка (*)
, в случае, если функция не получила event
(IE8-), использует window.event
.-событие event
.
Можно написать и иначе, если мы сами не используем переменную event
в замыкании:
element.
onclick
=
function
(
e
)
{
e =
e ||
event;
// Теперь e - объект события во всех браузерах.
}
;
Итого
- Объект события содержит ценную информацию о деталях события.
- Он передаётся первым аргументом
event
в обработчик для всех браузеров, кроме IE8-, в которых используется глобальная переменнаяwindow.event
.
Кросс-браузерно для JavaScript-обработчика получаем объект события так:
element.
onclick
=
function
(
event
)
{
event =
event ||
window.
event;
// Теперь event - объект события во всех браузерах.
}
;
Ещё вариант:
element.
onclick
=
function
(
e
)
{
e =
e ||
event;
// если нет другой внешней переменной event
...
}
;
Комментарии
<code>
, для нескольких строк кода — тег<pre>
, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)