3

一位同事向我展示了以下代码并问我为什么它有效。

<span id="myspan">Do you like my hat?</span>
<script type="text/javascript">
var spanElement = document.getElementById("myspan");
alert("Here I am! " + spanElement.innerHTML + "\n" + myspan.innerHTML);
</script>

我解释说,当浏览器解析包含对适当 dom 节点的引用的文档时,属性会附加到带有元素 id 名称的窗口对象。这有点像window.myspan = document.getElementById("myspan")在渲染页面时在幕后调用。

在随后的讨论中,我们提出了几个问题:

  • 窗口对象和大部分 DOM 不是官方 JavaScript/ECMA 标准的一部分,但上述行为是否记录在任何其他官方文献中,可能与浏览器相关?

  • 以上在浏览器(至少是主要竞争者)中有效,因为有一个窗口对象,但在 rhino 之类的东西中失败了。编写依赖于这种被认为是不好的做法的代码是因为它对执行环境做出了太多假设吗?

  • 是否有任何浏览器会出现上述问题,或者这是否被认为是全面的标准行为?

这里有没有人知道这些问题的答案并愿意启发我?我尝试了快速的互联网搜索,但我承认我不确定如何正确表达查询。欢迎提供参考资料和文档。

4

2 回答 2

3

这是非标准的仅限 IE 的行为,不应使用。

[1] [2] [3]

于 2010-05-11T18:57:52.643 回答
1

这不是标准功能,仅受 IE 支持,在某些情况下,Opera 支持。它还可能受浏览器是否处于quirks 模式,以及元素是否具有name属性的影响。

对于您的第二点,rhino本身不包含 DOM 实现,因此该问题不适用。也就是说,没有内置的 HTML 解释器,所以不会有额外的变量。

env.js是 rhino 的 DOM 实现,提供 HTML 解释器。由于作为window范围变量的 ID 不是 Web 标准,并且 env 项目旨在符合标准,因此您也不会在那里看到所描述的行为。

希望这可以帮助!

于 2010-05-11T19:58:38.397 回答