【问题标题】:What's up with document.domConfig on Firefox?Firefox 上的 document.domConfig 怎么了?
【发布时间】:2010-02-07 15:37:46
【问题描述】:

当我在 Firefox 中遇到一个有趣的现象时,我正在迭代 document 的属性,document 声称支持属性 domConfig 尽管 MDC says it isn't implemented 但当我尝试检索该属性时,我得到了一个异常:

错误:未捕获的异常:[Exception...“组件返回失败代码:0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOM3Document.domConfig]”nsresult:“0x80004001 (NS_ERROR_NOT_IMPLEMENTED)”位置:“JS 框架 :: javascript:alert(typeof( document.domConfig)) :: :: line 1" data: no]

以下显示了行为,Chrome 和 IE 都是一致的(我没有检查过 Opera)说 domConfig 不是窗口的属性,但 Firefox 声称它是但无法检索它(复制粘贴到URL 字段,因为我无法通过 markdown 提供链接)。

/* true in FF, false in other browsers */ 
javascript:alert("domConfig" in document)
/* exception in FF, 'undefined' in other browsers */
javascript:alert(typeof(document.domConfig)) 

这是怎么回事?

【问题讨论】:

  • 对我来说似乎很清楚:文档说它没有实现,当你尝试访问它时,你肯定会得到一个“NOT_IMPLEMENTED”异常。像“文档”这样的“原生”对象是进入浏览器内部的入口,因此 C++ 对象向 Javascript 公开一个触发异常的属性这一事实仅意味着它作为存根存在。这对您有何影响?
  • @Pointy,那么为什么它会显示为属性?迭代属性时我必须跳过它。
  • 看来我猜是因为 Mozilla 开发人员把它暴露在那里。我不完全确定 Javascript C++ 边界是如何工作的,但我猜测有一个函数被调用,它抛出了 NOT_IMPLEMENTED 异常。你总是可以将你的“属性嗅探器”包装在一个 try/catch 块中,然后忽略这样的异常。
  • 不过,@Motti 还是有道理的。为什么在尝试获取其类型时会抛出异常?对我来说听起来很愚蠢。它迫使开发人员为未知类型的异常做准备,并默默地丢弃它们——这根本不是好的做法。
  • 记住男孩和女孩,定义!= 实施。请参阅 Nickolay 的回答。

标签: javascript firefox exception dom


【解决方案1】:

Pointy 说得对,domConfig 暴露在一个接口中(DOM Level 3 Core Document - 在 Mozilla 的源代码中称为nsIDOM3Document),但它是not implemented(参见nsDocument::GetDomConfig())。 typeof 首先获取值,然后确定其类型(而不是根据接口定义),因此typeof document.domConfig 抛出异常也就不足为奇了。

至于为什么会这样,bug this code was added in没有讨论过,只能猜测。

我的猜测是,对于 Mozilla 打算实现的规范,最终确定(Mozilla 术语中的“冻结”)接口是有意义的,以便在接口的新属性/方法获得后,无需进一步修改即可从二进制代码中使用它们实施的。而且这似乎并不重要。

如果您有兴趣听取开发人员的意见,可以在mozilla.dev.tech.dom 或 mozilla.dev.platform 中询问。

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2018-07-31
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2015-06-29
    • 2012-09-05
    • 2021-06-21
    相关资源
    最近更新 更多