在body的结束标记(</body>)之后放置脚本标记有多错误?

<html>
  ....
  <body>
     ....
  </body>
  <script type="text/javascript" src="theJs.js"></script>
</html>

当前回答

只有html元素的注释和结束标记被允许放在主体的结束标记之后。

您可以通过规范或验证器确认这一点。

浏览器可以执行错误恢复,HTML规范甚至描述了在这种情况下如何恢复,但您永远不应该依赖于此。


还值得注意的是,将脚本元素放在末尾的通常原因是确保脚本在运行之前可能试图通过DOM访问的元素已经存在。

随着defer属性的到来,我们可以将脚本放在头部,同时还可以让浏览器在下载HTML的同时下载JS,以获得更好的性能。

其他回答

正如Andy所说,文档将是无效的,但是脚本仍然会被解释。请看WebKit的例子:

void HTMLParser::processCloseTag(Token* t)
{
    // Support for really broken HTML.
    // we never close the body tag, since some stupid web pages close it before
    // the actual end of the doc.
    // let's rely on the end() call to close things.
    if (t->tagName == htmlTag || t->tagName == bodyTag
                              || t->tagName == commentAtom)
        return;
    ...

它不会在<body>或<head>标记之外进行验证。把它放在</body>结束之前也不会有太大区别——除非你在做DOM操作,可能会在body元素完全加载之前破坏IE。

<html>
  ....
  <body>
     ....
     <script type="text/javascript" src="theJs.js"></script>
  </body>
</html>

按照W3C推荐的过程,在“元素体”之后插入“元素脚本”是一个“解析错误”。在“树结构”中创建一个错误,并运行“再次标记”来处理该内容。这就像一个额外的步骤。只有这样,它才能运行“脚本执行”-见方案过程。

任何其他的都是“解析错误”。将“插入模式”切换为“主体内”并重新处理令牌。

从技术上讲,对于浏览器来说,如何标记和优化它是一个内部过程。

Internet Explorer不再允许这样做了(我相信从版本10开始),并将忽略这类脚本。

Firefox和Chrome仍然容忍它们,但有可能有一天它们会将其作为非标准丢弃。

只有html元素的注释和结束标记被允许放在主体的结束标记之后。

您可以通过规范或验证器确认这一点。

浏览器可以执行错误恢复,HTML规范甚至描述了在这种情况下如何恢复,但您永远不应该依赖于此。


还值得注意的是,将脚本元素放在末尾的通常原因是确保脚本在运行之前可能试图通过DOM访问的元素已经存在。

随着defer属性的到来,我们可以将脚本放在头部,同时还可以让浏览器在下载HTML的同时下载JS,以获得更好的性能。