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

IT技术 javascript firefox dom-events addeventlistener
2021-02-02 10:06:20

我在这部分遇到了麻烦:

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 浏览器和歌剧中工作得很好(我无法在 MSIE 中检查它,我也不关心它)。

为什么会发生?

6个回答

尝试使用传递的参数(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    

  }
}
谢谢!它对我非常有用,因为它现在可以在 FF: 中使用exampl:function(e) {if (window.event && !e) e=window.event;var ref=e.target||e.srcElement;}
2021-03-16 10:06:20
@Simon_Weaver 因为 Chrome 和 IE 不是世界上唯一的浏览器,最新版本也不是世界上唯一使用的版本。Firefox 没有window.event,IE 没有处理程序中的第一个参数......或者至少3 年前
2021-03-17 10:06:20
我不明白 - Chrome/IE 不也提供e吗?你为什么不e总是使用
2021-04-02 10:06:20
但是 evt 在 chrome 和 FF 中比较是不一样的。所以这个答案是不正确的,因为我希望得到相同的回应......
2021-04-04 10:06:20
我应该更改我的“addEventListener”吗?
2021-04-12 10:06:20

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

引用MDN

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

而最重要的是:

不属于任何规范。

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

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

这为我指明了正确的方向!我需要同时获得点击事件和次要参数。正如您所说,函数的第一个参数必须是事件,并且您还需要将其包含在对函数的调用中;如 onclick='myClickEvent(event, mySecondAttr);'
2021-03-17 10:06:20

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

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

如果您查看事件处理程序的跨浏览器规范化代码,您会经常看到:

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

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

window.event将在Firefox 63 版(预计于 2018 年 10 月下旬发布)上提供。

刚刚开始在我们的生产服务器上引起问题 - 因为虽然它在那里,但它没有可设置的 returnValue(即 8 时在那里)
2021-03-19 10:06:20