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

时间:2012-03-21 21:54:27

标签: javascript firefox javascript-events addeventlistener

我在这部分遇到了麻烦:

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 个答案:

答案 0 :(得分:22)

尝试使用传递的参数获取事件(在本例中名为e)。我对此进行了测试,Chrome中支持window.evente

try checking for both, whichever exists

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    

  }
}

答案 1 :(得分:16)

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

引用MDN

  

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

最重要的是:

  

不属于任何规范。

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

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

答案 2 :(得分:15)

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

答案 3 :(得分:5)

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

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

if(!e){ e = window.event; }

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

答案 4 :(得分:0)

window.event将在Firefox from version 63上可用(预计于2018年10月下旬发布)。

答案 5 :(得分:0)

使用jQuery ..

let e = $.Event();

https://api.jquery.com/category/events/