为什么getPreventDefault()有效,但defaultPrevented没有?

时间:2014-06-11 18:42:31

标签: javascript events firefox javascript-events firefox-addon

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

Use of getPreventDefault() is deprecated. Use defaultPrevented instead.

但是,对于我正在尝试做的事情,似乎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仍然是假的,getPreventDefault()正确返回true。但Firefox仍会显示弃用警告!

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

1 个答案:

答案 0 :(得分:6)

我可以在Firefox 30和Nightly中重现这一点。

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

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

dispatchEvent()

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

如果您在评论或其他内容中提供了新的错误URI,那就太棒了。如果您不想自己提交,请说明,我会为您提交。

修改

处理它的另一种方法是使用e = document.createEvent('Event'); e.initEvent('fooEvent', true, true); if (document.dispatchEvent(e)) { // Execute default action } 的结果。显然,mozilla人们忘了来打破它。

  

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

from: DOM-Level-2-Events

{{1}}