【问题标题】:Why does getPreventDefault() work but defaultPrevented doesn't?为什么 getPreventDefault() 有效但 defaultPrevented 无效?
【发布时间】:2014-06-11 18:42:31
【问题描述】:

我正在开发 Firefox 扩展程序,但我不断看到以下警告:

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

但是,对于我正在尝试做的事情,defaultPrevented 似乎不起作用,而 getPreventDefault() 起作用。对于简化的代码 sn-p,这是我在 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() 正确返回真。但 Firefox 仍然显示弃用警告!

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

【问题讨论】:

  • @Nile:我在 Firefox 29 中看到了这种行为,该错误已被修复。我还刚刚通过在该票证中运行 sn-p 来确认本地修复,以确认警报消息中的 defaultPreventedtrue
  • @EliCourtwright:不,那个错误报告说他们没有在 FF29 中修复它?
  • @Bergi:该修复已向后移植到 Firefox 29 (status-firefox29: verified)。在评论 #16 中降落在树枝上。
  • @Bergi nah,已验证的意思是“已验证已修复”。已确认的错误是“新的”而不是“未确认的”,状态通常是“受影响的”。

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


【解决方案1】:

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

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

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

var dp = "getPreventDefault" in e ?
  e.getPreventDefault() :
  e.defaultPrevented;

作为发现此漏洞的人,请file a bug 并针对https://bugzilla.mozilla.org/show_bug.cgi?id=691151 阻止它

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

编辑

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

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

from: DOM-Level-2-Events

e = document.createEvent('Event');
e.initEvent('fooEvent', true, true);
if (document.dispatchEvent(e)) {
  // Execute default action
}

【讨论】:

  • 非常感谢!我已按照您的建议提交了一个错误,并将另一张票设为阻止它:bugzilla.mozilla.org/show_bug.cgi?id=1024488
  • 编辑:dispatchEvent 返回值。
  • 有趣。我已经实施(并测试了)您关于检查 getPreventDefault 是否存在的原始建议,然后在存在时使用它,否则退回到 defaultPrevented。我没有意识到dispatchEvent 有那个返回值,下次我处理那个代码或做任何类似的事情时我会记住这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2020-05-14
  • 2020-10-07
  • 2023-03-30
  • 2013-05-13
  • 2011-09-06
相关资源
最近更新 更多