Javascript 为什么getPreventDefault()可以工作,而defaultPrevented不能';T
我正在开发Firefox扩展,我一直看到以下警告: 不推荐使用getPreventDefault()。改用defaultPrevented 然而,对于我试图做的事情,似乎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
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
}