Javascript 主体内的脚本标记和子对象的行为

Javascript 主体内的脚本标记和子对象的行为,javascript,html,browser,standards,Javascript,Html,Browser,Standards,我很好奇下面的例子中“应该”发生什么。大多数当前浏览器(Firefox 5、Chrome 14、Opera 11.50)都会在文本上方添加iframe,但这是一种标准化行为,还是仅仅是一种常见的处理方式,将来可能会发生变化 <!doctype html> <html> <head> <title>Will the iframe be above or below the text?</title> </head&g

我很好奇下面的例子中“应该”发生什么。大多数当前浏览器(Firefox 5、Chrome 14、Opera 11.50)都会在文本上方添加
iframe
,但这是一种标准化行为,还是仅仅是一种常见的处理方式,将来可能会发生变化

<!doctype html>
<html>
  <head>
    <title>Will the iframe be above or below the text?</title>
  </head>
  <body>
    <script>
      var e = document.createElement("iframe");
      document.body.appendChild(e);
    </script>
    <p>some text</p>
  </body>
</html>

iframe是在文本上方还是下方?
var e=document.createElement(“iframe”);
文件.正文.附件(e);
一些文本


来自MDN文档:

将节点添加到指定父节点的子节点列表的末尾


正如@molector所指出的,脚本是在树尚未构建时执行的,因此这个节点被附加到一个空列表中,因此最后成为第一个元素。不过,这可能是特定于实现的。

这是标准化的行为


当脚本运行时,主体中还没有子元素。

该脚本将首先执行,然后是HTML元素
,这就是为什么首先获得iframe。如果希望iframe位于底部,请将脚本也置于底部。所以,是的,这是一个标准的东西。

只有在DOM树准备就绪时,才能对其进行操作。因此,您需要在窗口的onload事件(任何浏览器)或domcontentload事件(非IE)中编写代码


似乎与kbok的答案直接矛盾。浏览器遇到脚本时是否“必须”运行脚本(不能延迟执行,直到DOM就绪)?至少Opera Mobile等待并将在底部添加
iframe
。看起来,但是您的脚本不包含在任何正在等待调用的函数或事件处理程序中。它就在那里,所以浏览器在找到它时会直接执行它。你是对的,这就是重点。浏览器是否需要在找到脚本时运行该脚本(body没有子脚本),或者可以(甚至可能应该?)等到body标记关闭后再执行代码?是的,一旦浏览器找到像这样的“直接”脚本,它将直接执行它。这就是为什么如果您需要与其他元素交互,您应该将“direct”脚本放在底部,除非您使用的是window.onload或在文档完全加载时调用的任何其他函数我的意思是,函数或事件处理程序中没有包含等待调用的脚本。正如Molecle指出的那样,遇到脚本时,body没有子脚本,因此仍然不确定应该发生什么。是的,这是有意义的,因为树还没有构建。我会更新的,那不是真的。只要元素存在于DOM中(即解析开始标记时),就可以对其进行操作。(尽管这可能会导致MSIE抛出模糊的错误消息并清空页面)您知道什么标准规定在遇到脚本时必须执行脚本,并且执行不能延迟到DOM准备就绪为止吗?@maarons,我不知道该标准到底说了什么。但根据我的经验,只有将脚本放在“”之前或使用See,才能延迟执行。更相关的是,网络上几乎每一个脚本都(有意或无意)依赖于这种行为。我知道大多数浏览器是如何解释它的,但我想知道这种行为背后是否有任何标准@Ms2ger仍然有不同行为的浏览器-Opera Mobile将是其中之一,因此并非每个浏览器都会这样做。@Ms2ger感谢链接,找到了这个:然后这个:它说遇到脚本时必须立即执行。
window.onload = function() {
    var e = document.createElement("iframe");
    document.body.appendChild(e);
}