我正在使用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
}