Javascript 放置<;脚本>;在</车身>;标签?

Javascript 放置<;脚本>;在</车身>;标签?,javascript,html,Javascript,Html,将脚本标记放在正文的结束标记之后()有多错误 .... .... 它不会超出或标记的范围。除非在body元素完全加载之前进行DOM操作,否则将其放在关闭之前也不会有太大区别 .... .... 是。在主体的结束标记之后,只允许html元素的注释和结束标记 浏览器可能会执行错误恢复,但您永远不应该依赖于此。是。但是,如果你真的在它之外添加代码,很可能不会是世界末日,因为大多数浏览器都会修复它,但这仍然是一种不好的做法。如前所述,文档将无效,但脚本仍然会被解释。请参见来自WebKit的示例: v

将脚本标记放在正文的结束标记之后(
)有多错误


....
....
它不会超出
标记的范围。除非在body元素完全加载之前进行DOM操作,否则将其放在关闭之前也不会有太大区别


....
....

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


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

是。但是,如果你真的在它之外添加代码,很可能不会是世界末日,因为大多数浏览器都会修复它,但这仍然是一种不好的做法。

如前所述,文档将无效,但脚本仍然会被解释。请参见来自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;
    ...

IE不再允许这样做了(我相信从版本10开始),并且会忽略这样的脚本。FF和Chrome仍然容忍它们,但总有一天它们会将其视为非标准。谷歌实际上在“CSS优化”方面推荐了这一点。他们建议在关键的折页样式上加衬里,并推迟其他样式(css文件)

例如:

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>

.blue{颜色:蓝色;}
你好,世界!

请参阅:

按程序在“元素体”后面插入“元素脚本”是“解析错误”。在“树构造”中,创建错误并运行“再次标记”以处理该内容。所以这就像是额外的步骤。只有这样才能运行“脚本执行”-请参阅

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

从技术上讲,它的内部过程,他们如何标记和优化它


我希望我帮助了一些人。

现代浏览器会在正文中添加脚本标记,如下所示:


基本上,这意味着页面完成后将加载脚本,这在某些情况下(即DOM操作)可能很有用。但是,我强烈建议您使用相同的脚本,并将其放在带有“defer”的head标记中,因为它会产生相同的效果



@epalla:如果您将脚本放在body标记的末尾,那么当它到达那里时,就没有其他内容可以加载了,所以将脚本放在外部或内部应该没有什么区别。你还有一个额外的好处,那就是你的页面仍在验证中,这就是我在回答中试图表达的观点。是的,我同意你的观点,因为你的答案是好的。我只是想补充一点,将JS放在页面底部而不是头部是有原因的,因为我们已经做了很长时间了。@PHPst:在某些浏览器中,无效代码可能会受到副作用。不管怎样,我看不出它的缩进比上面的代码小一个制表符宽度如何使它看起来更干净。@PHPst:如果你真的想用这种方式编写代码,我希望浏览器能够处理它。不过,我还是建议您编写代码进行验证。@technosaurus:总有
,它在所有主流浏览器中都能工作(尽管在IE9及更低版本中可能会有一个漏洞)。这是一个更好的答案。现在有太多的新浏览器在使用移动设备,当你只需要剪切和粘贴一个结束标签时,就有可能出错。然而谷歌在他们关于如何进行G+登录的示例中做到了这一点,其“最后更新日期为2014年4月10日”。我从服务器()上的Java版本中获得了它,但它可能与所有的HTML+js都是一样的。你不应该把东西放在
body
元素之外。谷歌的那篇文章并没有建议任何人做任何这样的事情。我恐怕谷歌网页上说的正是这样。看起来,那个网页曾经推荐过这样的事情,但现在不再推荐了。(现在有一些javascript的动态加载。)德文版本不是最新的,仍然包含旧的代码示例。“element noscript”必须由RFC在“element html”和“element body”中定义。在现代浏览器中是否支持它。可能与“支持真正破坏的html”重复--我认为这就说明了一切。如果
script
标记有一个
event
属性,可以定义该属性来确定何时解析脚本,那么这将非常有用。因此,您有
event=“load”event=“DOMContentLoaded”
用于在创建DOM后运行脚本,或者在窗口
beforeunload
event上运行脚本。例如,
。用defer将其放在头部不会产生相同的效果;在head中使用defer:脚本是异步获取的,只有在HTML解析完成后才执行。然而,如果将脚本放在正文的末尾:HTML解析将在没有任何停顿的情况下完成,当它完成时,脚本将被提取并执行。
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>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>