我正在使用Firefox扩展程序,并且不断看到以下警告:



但是,对于我正在尝试执行的操作,似乎defaultPrevented不起作用,而getPreventDefault()起作用。对于简化的代码段,这是我在Browser上下文中运行时放入Firefox浏览器暂存器的内容:

window.addEventListener('fooEvent', function (event) {
    console.log('fooEvent has fired');
    event.preventDefault();
}, true, true);

因此,然后在浏览器控制台(按Shift + Ctrl + k时获得的控制台)中运行以下代码:
e = document.createEvent('Event');
e.initEvent('fooEvent', true, true);
document.dispatchEvent(e);
console.log('after dispatch', e.defaultPrevented, e.getPreventDefault());

我可以在Javascript控制台中看到fooEvent has fired消息,因此我知道该事件已捕获。但是我看到消息after dispatch false true,它指示defaultPrevented正确返回true时getPreventDefault()仍然为false。但是Firefox仍然显示弃用警告!

我想避免使用过时的API调用,因为我不希望Firefox升级破坏我的扩展。 (有一个open ticket可以删除已弃用的API调用,尽管看起来可能要过一段时间才能完成。)我在做什么错?

最佳答案

我可以在Firefox 30和Nightly中重现此内容。

在处理特权代码中的合成内容事件时,您在这里发现的似乎是一个真正的错误。

回答您的问题:您似乎没有做错任何事;浏览器是。
暂时使用getDefaultPrevented(),但仍可用。
您可以进行功能检测(并希望在删除.defaultPrevented之前先修复.getPreventDefault()):

var dp = "getPreventDefault" in e ?
  e.getPreventDefault() :
  e.defaultPrevented;

作为发现此错误的人,请file a bug并将其阻止为https://bugzilla.mozilla.org/show_bug.cgi?id=691151

如果您在注释或其他内容中提供了新的错误URI,那就太好了。如果您不想自己归档,请这样说,我会为您归档。

编辑

处理它的另一种方法是使用dispatchEvent()的结果。显然,mozilla的人们也忘记了破解它。



from: DOM-Level-2-Events
e = document.createEvent('Event');
e.initEvent('fooEvent', true, true);
if (document.dispatchEvent(e)) {
  // Execute default action
}

09-30 16:02