我有这个脚本:
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)