火狐"window.event is undefined"错误



我有这个脚本:

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

我将此脚本与onclick="postBackByObject();"一起使用。

但在Firefox 21中,我得到了这个错误:

类型错误:window.event未定义

我怎么了?

这是因为它是。window.event用于旧版本的IE。

典型的方法是:

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

您在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传递,并且IE中e.target的目标,e将未定义,您必须使用window.event.srcElement

请注意,IE的最新版本确实支持符合标准的模型。

更一般的注意事项是,当您尝试将值访问为a.b.c.d时,a.b.c必须是已定义的对象,否则将得到错误a.b.c undefined

我不确定是否所有浏览器都支持window.event。我认为您在postBackByObject(e)

的变量"e"中得到了事件

最新更新