Почему 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 должен быть собственным объектом, передаваемым через аргументы, а не ссылкой на свойство окна.