Javascript 为什么getPreventDefault()可以工作,而defaultPrevented不能';T

Javascript 为什么getPreventDefault()可以工作,而defaultPrevented不能';T,javascript,firefox,events,firefox-addon,dom-events,Javascript,Firefox,Events,Firefox Addon,Dom Events,我正在开发Firefox扩展,我一直看到以下警告: 不推荐使用getPreventDefault()。改用defaultPrevented 然而,对于我试图做的事情,似乎defaultPrevented不起作用,而getpreventeddefault()起作用。以下是我在浏览器上下文中运行时在Firefox浏览器草稿行中输入的简化代码片段: window.addEventListener('fooEvent', function (event) { console.log('fooE

我正在开发Firefox扩展,我一直看到以下警告:

不推荐使用getPreventDefault()。改用defaultPrevented

然而,对于我试图做的事情,似乎
defaultPrevented
不起作用,而
getpreventeddefault()
起作用。以下是我在
浏览器
上下文中运行时在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已触发
消息,因此我知道该事件已被捕获。但是我在dispatch false true之后看到消息
,这表明
defaultPrevented
仍然是false,而
getpreventeddefault()
正确返回true。但是Firefox仍然显示弃用警告


我希望避免使用不推荐的API调用,因为我不希望Firefox升级破坏我的扩展。(不推荐使用的API调用可能会被删除,尽管看起来可能需要一段时间才能完成。)我做错了什么?

我可以在Firefox 30和每晚都复制这一点

当涉及到处理来自特权代码的合成内容事件时,您在这里发现的似乎是一个真正的bug

回答你的问题:你似乎没有做错什么;浏览器正在运行。 暂时使用
getDefaultPrevented()。
您可以使用功能检测(并希望在删除
.getPreventDefault()
之前修复
.defaultPrevented
):

作为发现这个错误的人,请阻止它

如果您在评论或其他内容中提供新的bug URI,那就太好了。如果你不想自己归档,请说出来,我会帮你归档

编辑

另一种处理方法是使用
dispatchEvent()
的结果。很明显,mozilla的人也忘了打破它

dispatchEvent的返回值指示处理该事件的任何侦听器是否为preventDefault。如果调用了preventDefault,则该值为false,否则该值为true


你看到了吗?:@Nile:我在Firefox29中看到了这种行为,这个bug已经被修复了。我还通过运行该票据中的代码片段来确认警报消息中的
defaultPrevented
是否为
true
。@EliCourtwright:否,该错误报告声明他们没有在FF29中修复它?@Bergi:该修复已后端口到Firefox 29(
status-firefox29:verified
)。在注释#16中落在分支上。@Bergi-nah,verified表示“verified-fixed”。确认的bug是“新的”,而不是“未确认的”,状态通常是“受影响的”。非常感谢!我已经按照您的建议提交了一个bug,并使另一张罚单成为它的拦截器:Edit:
dispatchEvent
returnvalue.interest。我已经实现了(并测试了)您最初的建议,即检查是否存在
getPreventDefault
,然后在它存在时使用它,否则就求助于
defaultPrevented
。我没有意识到
dispatchEvent
有那个返回值,下次我在编写那个代码或做类似的事情时,我会记住这一点。谢谢
var dp = "getPreventDefault" in e ?
  e.getPreventDefault() :
  e.defaultPrevented;
e = document.createEvent('Event');
e.initEvent('fooEvent', true, true);
if (document.dispatchEvent(e)) {
  // Execute default action
}