Firefox "window.event undefined"

У меня есть этот script:

function postBackByObject(e) {
   var o = window.event.srcElement || e.target;
   if (o.tagName == "INPUT" && o.type == "checkbox") {
        __doPostBack("", "");
    }
}

Я использую этот script с onclick="postBackByObject();".

но в Firefox 21 я получаю эту ошибку:

TypeError: window.event undefined

В чем моя ошибка?

Ответ 1

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

Типичный способ сделать это:

function postBackByObject(e) {
    e = e || window.event;
    var o = e.srcElement || e.target;
    // ...
}

Ответ 2

Вы добавляете события inline onclick="postBackByObject();"

Попробуйте передать this (цель события) на onclick="postBackByObject(this);" Измените свою функцию, чтобы обработать это изменение:

function postBackByObject(e) {
   if (e.tagName == "INPUT" && e.type == "checkbox") {
        __doPostBack("", "");
    }
}

Лучшей альтернативой будет присоединение событий с использованием addEventListener

Если ваша разметка выглядит следующим образом:

<div id="TvCategories" onclick="postBackByObject(this);" />

затем

document.getElementById('TvCategories').addEventListener('click', postBackByObject);

Функция postBackByObject остается неизменной при использовании этого подхода.

Ответ 3

Передайте событие в событие onClick следующим образом:

onclick="myCustomFunction(event);"

Он работает, и вы можете получить доступ к объекту события!

Ответ 4

Возможно передать объект события во встроенное объявление:

<input type="button" onclick="postBackByObject(event);" value="click" />

function postBackByObject(e) {
    var o = e.srcElement || e.target;
    // ...
}

Ответ 5

Прикрепление события - это решение, но есть альтернатива, которая может быть полезной для других людей, сталкивающихся с одной и той же проблемой, после долгого поиска я узнал, что:

Объект события реконструируется только firefox, если вы явно передаете "событие" из функции

Таким образом, проблема возникает из-за того, что window.event не распознается Firefox, и решение должно передать event функции, ваш код будет:

function postBackByObject(e) {
   var o = e.srcElement || e.target;
   if (o.tagName === "INPUT" && o.type === "checkbox") {
        __doPostBack("", "");
    }
}

И вы все равно можете вызвать его в своем встроенном HTML-пропуске event в качестве параметра:

onclick="postBackByObject(event);"

Ответ 6

Ваша строка

var o = window.event.srcElement || e.target;

не работает во всех браузерах, кроме IE, так как для них windows.event не определено

Правильная формулировка:

var o = e ? e.target : window.event.srcElement;

Поскольку стандартные совместимые браузеры передают событие как параметр e и цель в e.target в IE, e будет undefined, и вы должны использовать window.event.srcElement

Обратите внимание, что последние версии IE поддерживают стандартную совместимую модель.

В более общей заметке, когда вы пытаетесь получить доступ к значению как a.b.c.d, тогда a.b.c должен быть определенным объектом, иначе вы получите сообщение об ошибке a.b.c undefined.

Ответ 7

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