为什么Firefox说window.event未定义?(使用添加了事件监听器的函数调用)

30

我在这个部分有些问题:

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 浏览器和 Opera 中运行得非常好(我无法在 MSIE 中检查它,也不关心它)。

为什么会发生这种情况?

6个回答

22

尝试使用传递的参数(在这种情况下命名为e)获取事件。我已经测试过,window.evente 在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    

  }
}

我应该改变我的“addEventListener”吗? - anony_root
谢谢!这对我非常有用,因为它现在可以在FF中运行:exampl:function(e) {if (window.event && !e) e=window.event;var ref=e.target||e.srcElement;} - anony_root
3
在Chrome和FF中,evt并不相同。因此,这个答案是不正确的,因为我期望得到相同的响应... - Jonathan
我不明白 - Chrome/IE 不也会提供 e 吗?为什么不总是使用 e 呢? - Simon_Weaver
@Simon_Weaver 因为Chrome和IE并不是世界上唯一的浏览器,而且最新版本也不是全世界都在使用的唯一版本。Firefox没有window.event,IE没有处理程序中的第一个参数...或者至少3年前没有。 - Joseph
有时在使用第三方库定义的预设方法时,无法传递参数 e 是不可选的。 - eaglei22

19

window.event 不是一项功能,而是一个错误!

引用MDN的说法:

window.event 是一项专有的 Microsoft Internet Explorer 属性,在调用 DOM 事件处理程序时才可使用。它的值为当前被处理的 Event 对象。

最重要的是:

不属于任何规范。

window.event 是非标准的,所以不要期望任何浏览器支持它。

element.addEventListener() 中回调函数的第一个参数是一个 Event 对象。请使用它代替 window.event


1
这为我指明了正确的方向!我需要获取点击事件和一个次要参数。正如你所说,函数的第一个参数必须是事件,并且你需要在调用函数时也将其包含进去;例如:onclick='myClickEvent(event, mySecondAttr);' - SteinIP

15

window.event在Firefox中不存在。这是因为浏览器具有不同的事件模型,您将需要处理它们之间的差异,或使用类似于jQuery的库来避免处理浏览器之间的所有差异。欢迎来到DOM。


5
Chrome本地也没有这个功能。IE并不是在每次事件触发时都传递自己的事件对象,而是将属性放入window.event中并将其传递。这种方式可以在一次只处理一个事件的情况下正常工作。每个浏览器都应该拥有window.Event,它是事件对象的实际构造函数。如果你看到在IE8及以下以外的任何地方出现'window.event',请尝试在空白标签页上打开控制台并记录或警报它。很可能是某些内容在页面上手动添加了它。
如果你查看跨浏览器规范化代码的事件处理程序,通常会看到:
if(!e){ e = window.event; }

这是处理旧版本IE事件规范化代码。在现代浏览器中,e应该是作为自己的对象通过参数传递,而不是window属性的引用。


0

不仅提供参考链接,还要适当解释上述代码如何/为什么会解决问题。 - Dhaval Simaria

-1

刚开始在我们的生产服务器上出现问题 - 因为虽然它存在,但它没有可设置的returnValue(这是ie 8中存在的)。 - Worthy7
没有是一个谎言,2023年还没有事件,LOL。 - user956584
我的 Firefox 108 已经有了。 - Matthieu Riegler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接