Почему FF говорит, что window.event undefined? (функция вызова с добавленным прослушивателем событий)

У меня есть проблема в этой части:

var ex = {
  exampl: function(){
    var ref=window.event.target||window.event.srcElement; // here
    alert(ref.innerHTML); // (example)
  }
}

Эта функция называется следующим образом:

document.body.childNodes[0].addEventListener('mouseover',ex.exampl,true);

Только Firefox говорит, что window.event не определен...

Я не знаю, что делать, чтобы он работал. Он отлично работает в браузерах webkit и в опере (я не могу проверить это в MSIE, и мне все равно).

Почему это происходит?

Ответ 1

попробуйте получить событие, используя переданный параметр (в данном случае он называется e). Я тестировал это и оба window.event, а e поддерживается в chrome.

попробуйте проверить оба варианта, в зависимости от того, что существует

var ex = {
  exampl: function(e){

    console.log(window.event);
    console.log(e);  

    //check if we have "e" or "window.event" and use them as "evt"
    var evt = e || window.event    

  }
}

Ответ 2

Потому что window.event не существует в Firefox. Это потому, что браузер имеет разные модели событий, и вам придется иметь дело с их различиями или использовать библиотеку, такую ​​как jQuery, чтобы не иметь дело со всеми различиями между браузерами. Добро пожаловать в DOM.

Ответ 3

window.event не является особенностью, это ошибка!

Цитирование MDN:

window.event - это свойство Microsoft Internet Explorer, доступное только при вызове обработчика событий DOM. Его значение - это объект Event, который в настоящее время обрабатывается.

И самое главное:

Не относится к какой-либо спецификации.

window.event является нестандартным, поэтому не ожидайте поддержки браузерами.

Первым параметром функции обратного вызова в element.addEventListener() является объект Event. Используйте его вместо window.event.

Ответ 4

У Chrome тоже нет его. Вместо того, чтобы каждый триггер события передавал свой собственный объект события, IE сбросил свойства в window.event и передал это. Это сработало, потому что вы когда-либо имели дело с одним событием за раз. То, что должен иметь каждый браузер, - это window.Event, который является фактическим конструктором для объектов событий. Если вы видите "window.event" где угодно, кроме IE8 и ниже, попробуйте открыть консоль на пустой вкладке и зарегистрировать или предупредить ее там. Скорее всего, это добавление его вручную на странице, на которую вы смотрите.

Если вы посмотрите на нормализующий код кроссбраузера для обработчиков событий, вы часто увидите:

if(!e){ e = window.event; }

Это событие нормализует код, обрабатывающий более старые версии IE. В современных браузерах e должен быть собственным объектом, передаваемым через аргументы, а не ссылкой на свойство окна.