将 <script> 标签放在 </body> 标签之后是错误的吗?

IT技术 javascript html
2021-01-17 22:05:48

将 script 标签放在 body ( </body>)的结束标签之后有多大错

<html>
  ....
  <body>
     ....
  </body>
  <script type="text/javascript" src="theJs.js"></script>
</html>
6个回答

它不会or标签之外进行验证它也不会有太大区别——除非你正在做可能在 body 元素完全加载之前破坏 IE 的DOM 操作——将它放在关闭.<body><head></body>

<html>
  ....
  <body>
     ....
     <script type="text/javascript" src="theJs.js"></script>
  </body>
</html>
@technosaurus:总是有<script src="..." defer>,它适用于所有主要浏览器(尽管在 IE9 及更低版本中存在潜在的破坏性错误)。
2021-03-11 22:05:48
@PHPst:好吧,无效代码可能会在某些浏览器中产生副作用。无论哪种方式,我都看不到它的缩进比上面的代码少一个制表符宽度是如何使它看起来更干净。
2021-03-21 22:05:48
@PHPst:如果您真的想以这种方式编写代码,我希望浏览器能够处理它。但是,我仍然建议您编写代码进行验证。
2021-03-29 22:05:48
@epalla:如果你把脚本放在 body 标签的末尾,那么它到达那里时就没有其他内容可以加载了,所以把它放在外面或放在里面应该没有什么区别。然后,您的页面的额外好处仍在验证中,这就是我试图在我的回答中提出的观点。
2021-04-05 22:05:48
是的,我同意你的看法,因为你的回答很好。我只是想补充一点,将 JS 放在页面底部而不是像我们长期以来所做的那样放在头部是有原因的。
2021-04-07 22:05:48

是的。在正文的结束标记之后只允许html元素的注释和结束标记

浏览器可能会执行错误恢复,但您不应该依赖它。

这是一个更好的答案。有太多的新浏览器随着移动设备的出现而冒着做错的风险,而您只需要剪切并粘贴一个结束标签。
2021-03-18 22:05:48

正如安迪所说,文档将无效,但脚本仍将被解释。例如,请参阅来自 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;
    ...
“支持真正损坏的 html。” ——我想这说明了一切。
2021-03-12 22:05:48

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

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

然而,谷歌在他们的如何进行 G+ 登录的示例中做到了这一点,“最后更新时间为 2014 年 4 月 10 日”。我从服务器上的 Java 版本 ( developers.google.com/+/quickstart/java ) 中得到它,但大概它是相同的 HTML+js。
2021-03-16 22:05:48

W3C 推荐的过程中,在“元素主体”之后按程序插入“元素脚本”是“解析错误” 在“Tree Construction”中创建一个错误并运行“tokenize again”来处理该内容。所以这就像一个额外的步骤。只有这样它才能运行“脚本执行”——参见方案流程

其他任何东西都是“解析错误”。将“插入模式”切换为“in body”并重新处理令牌。

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