【问题标题】:Workaround for Firefox's lack of window.event? [duplicate]Firefox 缺少 window.event 的解决方法? [复制]
【发布时间】:2017-12-13 15:03:43
【问题描述】:

Firefox 缺少 window.event 让我措手不及……即

<script>
function clicked()
{ 
 console.log(event);
}
</script>

<div onclick = "clicked()">Whatever</div>

几乎可以在所有现代浏览器中使用,但“事件”在 Firefox 中是未定义的,我们必须在其中显式编写

<script>
function clicked(event)
{ 
 console.log(event);
}
</script>

<div onclick = "clicked(event)">Whatever</div>

是否有任何可行的解决方法来访问 Firefox 中的事件对象而不必将其显式作为函数参数?

【问题讨论】:

  • 你为什么要这样做? window.event 完全不标准。
  • ??您已经有了“解决方法”,将事件对象传递给处理程序。全局事件对象不是标准的,一开始就不应该使用。
  • 有时公司继承的代码只是想通过黑客攻击保持几乎没有功能,而完全重写是并行完成的。
  • @AlexanderOMara 我不太同意这里重复的关闭原因。最初的问题询问原因,而这个问题要求解决方法。
  • 是的,我找到了“为什么”的问题,但它没有提供解决方法(我认为传播不良做法只会帮助在浏览器中保持丑陋,但有时它是业务类型的必要弊端) .确实不是重复的。

标签: javascript firefox events


【解决方案1】:

这是一个丑陋的 hack,假设所有事件侦听器最终都将由 EventTarget.addEventListener() 方法注册。下面的“解决方案”更改了EventTarget 的原型(糟糕!),以便将所有事件侦听器包装在一个方法中,该方法将在委派给实际侦听器之前将事件分配给window.event。

const addEventListener = EventTarget.prototype.addEventListener;

EventTarget.prototype.addEventListener = function(name, handler) {
  addEventListener.call(this, name, function(event) {
    window.event = event;
    
    handler(event);
  })
};

function clicked() {
  // just demonstrating that window.event is set
  console.log(window.event.target.innerHTML);
}

document.getElementById('one').addEventListener('click', clicked);
document.getElementById('two').addEventListener('click', clicked);
<button id="one">Test 1</button>
<button id="two">Test 2</button>

以上只是说明了一种可能的方法,并且在很大程度上未经测试。您的里程可能会有所不同。


更新

正如 cmets 中所指出的,这不适用于通过on... HTML 属性绑定或使用Element.on... 属性分配的事件处理程序。

另一种(可以说是更安全)的方法是在文档元素上使用事件捕获,并在那里执行对window.event 的分配。

document.documentElement.addEventListener('click', function(event) {
  window.event = event;
}, true);

function clicked() {
  // just demonstrating that window.event is set
  console.log(window.event.target.innerHTML);
}

document.getElementById('one').addEventListener('click', clicked);
document.getElementById('two').onclick = clicked;
<button id="one">Test 1</button>
<button id="two">Test 2</button>
<button id="three" onclick="clicked()">Test 3</button>

【讨论】:

  • 可怕而可怕的工作。足以让这个可憎之物存活一段时间。
  • 不,HTMLEventAttribute 不以EventTarget#addEventListener 结尾。这工作仅适用于通过此方法注册的事件。
  • @Kaiido 请澄清。 HTMLEventAttribute 是什么意思?你能举个例子吗?
  • HTML on&lt;...&gt; 属性。
  • @Kaiido 我在上面的 sn-p 中有那些。
猜你喜欢
  • 2017-01-19
  • 2016-09-20
  • 1970-01-01
  • 2019-12-05
  • 2016-10-19
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多