Ответ 1
Это потому, что это так. window.event
предназначен для более старых версий IE.
Типичный способ сделать это:
function postBackByObject(e) {
e = e || window.event;
var o = e.srcElement || e.target;
// ...
}
У меня есть этот 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
В чем моя ошибка?
Это потому, что это так. window.event
предназначен для более старых версий IE.
Типичный способ сделать это:
function postBackByObject(e) {
e = e || window.event;
var o = e.srcElement || e.target;
// ...
}
Вы добавляете события 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
остается неизменной при использовании этого подхода.
Передайте событие в событие onClick
следующим образом:
onclick="myCustomFunction(event);"
Он работает, и вы можете получить доступ к объекту события!
Возможно передать объект события во встроенное объявление:
<input type="button" onclick="postBackByObject(event);" value="click" />
function postBackByObject(e) {
var o = e.srcElement || e.target;
// ...
}
Прикрепление события - это решение, но есть альтернатива, которая может быть полезной для других людей, сталкивающихся с одной и той же проблемой, после долгого поиска я узнал, что:
Объект события реконструируется только 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);"
Ваша строка
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
.
Я не уверен, поддерживается ли window.event во всех браузерах. Я думаю, что вы получаете событие в переменной "e" из postBackByObject (e)