Почему тонкие межбраузерные различия в Event Object

Следующее объявление на уровне окна:

    var event; // for IE
    var event = "anything"; // for Chrome

уничтожит объект события, как здесь:

    <div onMouseOver = "alert(event.type);">Mouseover Div</div>

Firefox не кажется поэтапным ни с одним из заявлений.

Я понимаю, что объявление переменной с именем «событие» — это плохой код, но мне любопытно узнать о технической разнице здесь, например. что использование var в IE повторно инициализирует переменную в значение null, тогда как Chrome не будет перезаписывать объявление var, если только значение не назначено явно, и, возможно, FF полностью удерживает объект события за пределами области объявления var окна.

Это скорее любопытство. Я столкнулся с ошибкой в ​​IE на сайте вне моего контроля, которая была вызвана этим, и чем больше я изучал, тем больше я видел тонкие различия между браузерами. Просто интересно, есть ли у кого-нибудь какие-либо идеи здесь.


person johnmdonahue    schedule 03.02.2010    source источник
comment
Какой ответ вы ищете? Все сводится к тому, что разные поставщики браузеров имеют разные и непоследовательные DOM API и механизмы рендеринга.   -  person meder omuraliev    schedule 04.02.2010
comment
Ответ Тима Дауна отвечает на мой вопрос - спасибо!   -  person johnmdonahue    schedule 04.02.2010
comment
Если его ответ ответил на ваш вопрос, вы должны отметить его как правильный ответ, чтобы он получил баллы и кредит.   -  person Gordon Tucker    schedule 04.02.2010
comment
Спасибо, Гордон. Все еще получаю расположение земли здесь.   -  person johnmdonahue    schedule 04.02.2010


Ответы (2)


В IE event является свойством объекта window и используется в функциях обработчиков событий для доступа к обрабатываемому событию. В других браузерах, таких как Firefox, ситуация такова, что в атрибуте обработчика события код JavaScript внутри атрибута вызывается так, как если бы он формировал тело функции, в которую был передан параметр с именем event, соответствующий обрабатываемому событию. . Итак, в

<div onmouseover="alert(event.type);">Mouseover Div</div>

код наведения мыши эффективно

function(event) {
    alert(event.type);
}

и параметр event переопределяет любой event, объявленный в содержащей его области, тогда как в IE это

function() {
    alert(event.type);
}

а идентификатор event разрешается как свойство глобального объекта (т. е. window).

person Tim Down    schedule 03.02.2010
comment
Спасибо за объяснение Тим - это имеет смысл. Так обрабатывает ли Chrome объект события, аналогичный IE? Кажется, он не работает: var event = null;. Но, похоже, это не относится к WebKit, поскольку Safari, кажется, справляется с этим нормально. - person johnmdonahue; 04.02.2010
comment
Я еще не уверен, отсюда и моя неопределенность в отношении других браузеров, таких как Firefox. Из того, что вы говорите, может показаться вероятным, что механизм Chrome похож на IE, но я проведу небольшое исследование. - person Tim Down; 04.02.2010
comment
Кажется почти уверенным, что Chrome работает так же, как IE: в атрибуте обработчика событий window.event === event возвращает true, а установка глобальной переменной с именем event нарушает работу, поскольку глобальный объект — это последнее, что JavaScript проверяет при попытке разрешить идентификатор. Ситуация в Safari 4 любопытна: window.event === event возвращает true, но определение глобальной переменной event не переопределяет значение event внутри обработчика событий, поэтому я бы сделал вывод, что Safari одновременно устанавливает window.event и передает тот же объект, что и параметр event. . - person Tim Down; 04.02.2010
comment
Спасибо, Тим. Я ценю, что вы объясняете свой метод здесь. - person johnmdonahue; 04.02.2010

Объект «событие» в IE является свойством объекта «окно»; то есть он глобальный. В Firefox это значение создается и передается обработчикам событий.

Если вы используете jQuery или какой-либо другой фреймворк, обычно поддержка обработки событий нормализует объект «событие» во что-то, что одинаково работает в разных браузерах.

person Pointy    schedule 03.02.2010
comment
Спасибо за добавленную информацию о фреймворках, нормализующих объект события. Хорошее понимание. - person johnmdonahue; 04.02.2010
comment
Если вам нравятся ответы, которые вы получили, вы должны проголосовать за них. Вот как работает StackOverflow для всех! - person Pointy; 04.02.2010
comment
Спасибо, Пойнти, я здесь новичок и еще не набрал необходимых 15 баллов. Но я обязательно это сделаю, когда сделаю. - person johnmdonahue; 04.02.2010
comment
Pointy: Итак, в IE событие является глобальным, поэтому все функции foo's, такие как onclick='foo()', будут знать о событии через window.event, тогда как FF отправляет event в функцию-оболочку, поэтому мне придется использовать onclick='foo(event)', поэтому в конечном итоге у меня будет function (event){foo(event);} (то же самое как хром).... я прав? - person Royi Namir; 08.03.2014
comment
@RoyiNamir Ну, традиционный хак состоит в том, чтобы объявить событие как параметр функции-обработчика, а затем написать event = event || window.event; в качестве первого оператора функции. - person Pointy; 08.03.2014