Что означает следующее в JavaScript?
var evt=event||window.event;
Это означает, что переменной evt
присваивается значение event
или если event
не определено, то ему присваивается значение window.event
.
Это работает потому, что в javascript булевы операторы не оцениваются как true или false, а вместо этого оцениваются как значение последнего объекта, который не является falsy*, или как значение falsy.
Итак, оператор сначала оценивает выражение event || window.event
. Если event
истинно, то выражение не нужно оценивать дальше, поскольку для истинности ИЛИ достаточно одного члена. Поэтому возвращается значение event
. Если event
является ложным, то правая часть оператора OR должна быть оценена, чтобы определить, является ли результат ложным. В этом случае, если window.event
не является ложным, то возвращается его значение.
Это очень распространенная идиома для получения объекта события из обработчиков событий. В браузерах, соответствующих стандартам, объект события передается в качестве первого параметра обработчика события. Но в IE объект события является глобальной переменной. А по историческим причинам все глобальные переменные являются членами объекта window.
Поэтому код должен выглядеть примерно так:
element.onclick = function (event) {
var evt = event || // use the value of event if available or
window.event;// if not assume it's IE and use window.event
/* ... */
}
Примечание: * ложными значениями в javascript являются: false, 0, null и undefined.
Код является хаком, потому что Microsoft решила поместить свои события в глобальный window.event
вместо того, чтобы передать его в качестве параметра в функцию события.
Таким образом, этот код попытается установить evt
в переданное событие (что сработает для браузеров, не относящихся к Microsoft) и, если оно окажется null
(как это будет для браузеров Microsoft), он затем возьмет его из глобала.
С этого момента ваша функция может просто использовать evt
, не обращая внимания на различия браузеров (ну, по крайней мере, те, которые относятся к событиям).