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

ano*_*oot 30 javascript firefox javascript-events addeventlistener

我在这部分遇到了麻烦:

var ex = {
  exampl: function(){
    var ref=window.event.target||window.event.srcElement; // here
    alert(ref.innerHTML); // (example)
  }
}
Run Code Online (Sandbox Code Playgroud)

这个函数以这种方式调用:

document.body.childNodes[0].addEventListener('mouseover',ex.exampl,true);
Run Code Online (Sandbox Code Playgroud)

只有Firefox说window.event没有定义......

我不知道该怎么做,让它发挥作用.它在webkit浏览器和opera中运行得非常好(我无法在MSIE中检查它,我不关心它).

为什么会这样?

Jos*_*eph 22

尝试使用传递的参数获取事件(e在本例中命名).我测试了这两个window.evente铬支持.

尝试检查两者,无论哪个存在

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    

  }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,与铬和FF相比,evt并不相同.所以这个答案是不对的,因为我期待同样的回答...... (2认同)

Mic*_*ski 16

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

引用MDN:

window.event是一个专有的Microsoft Internet Explorer属性,仅在调用DOM事件处理程序时可用.它的值是当前正在处理的Event对象.

最重要的是:

不属于任何规范.

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

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


mpm*_*mpm 15

因为window.event在Firefox中不存在.那是因为浏览器有不同的事件模型,你必须处理他们的差异或使用像jQuery这样的库,不必处理浏览器之间的所有差异.欢迎来到DOM.


Eri*_*pen 5

Chrome本身也没有它.IE不会将每个事件触发器传递给自己的事件对象,而是将属性放入window.event并将其移交.这是有效的,因为你一次只处理一个事件.每个浏览器应该具有的是window.Event,它是事件对象的实际构造函数.如果您在IE8及以下的任何地方看到'window.event',请尝试在空白选项卡上打开控制台并在那里记录或提醒它.有可能是在您正在查看的页面上手动添加它.

如果你看一下事件处理程序的crossbrowser规范化代码,你会经常看到:

if(!e){ e = window.event; }
Run Code Online (Sandbox Code Playgroud)

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