我正在开发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,虽然看起来它可能还需要一段时间才能完成。)我做错了什么?
答案 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。
{{1}}