代码*如何在* HEAD标记的结尾和BODY标记处理之间?

时间:2017-01-26 17:23:56

标签: javascript jquery html

我已阅读that it is bad来执行此操作,并且在规范之外,但我有一个有点间歇性的错误,可能是相关的。只是想知道普遍的共识是"用凝固汽油弹烧掉那个代码"或者"它在这些有限的条件下工作"。

我发现,在一个非常复杂的代码库中,我们维护了<script>标记,这些标记都是在</head>之后和{{之前}从外部源(javascript和jquery)和内联脚本加载的1}}。大多数是在表单完全加载后需要加载的代码。

在我开始进行更改以将代码合并到Head标记的底部之前,我想了解现在正在发生什么到运行此代码的客户端(目标是不打破当前的用户体验)。这些脚本是在呈现页面之前加载还是之后?这个无人区域代码的实际状态首先不应该存在于什么状态?

谢谢!

2 个答案:

答案 0 :(得分:7)

从根本上说,它是无效的标记和浏览器必须从中恢复的解析错误。所以我会在你的目标浏览器中测试它,看看它们做了什么。

理论上:在结束</head>标记之后和开始<body>标记之前,解析器位于“'after head' insertion mode”中。我已经列出了以下规则,但感谢your comment,我认为相关的是:

  
      
  • 标签名称为以下之一的开始标记:“base”,“basefont”,“bgsound”,“link”,“meta”,“noframes”,“script”,“style”,“template”,“标题”      
        
    • 解析错误。
    •   
    • 将head元素指针指向的节点推送到open元素堆栈上。
    •   
    • 使用“in head”插入模式的规则处理令牌。
    •   
    • 从开放元素堆栈中删除head元素指针指向的节点。 (此时可能不是当前节点。)
    •   
    • 此时头元素指针不能为空。
    •   
  •   

告诉我们:

  1. 这是一个解析错误,请参阅我的开头段落。 : - )
  2. 该规范似乎告诉浏览器供应商将脚本视为head的末尾。
  3. 完整规则:

      

    当用户代理要应用“后头”插入模式的规则时,用户代理必须按如下方式处理令牌:

         
        
    • 字符标记,是U + 0009字符制表,“LF”(U + 000A),“FF”(U + 000C),“CR”(U + 000D)或U + 0020之一SPACE

           
          
      • 插入角色。
      •   
    •   
    • 评论标记

           
          
      • 插入评论。
      •   
    •   
    • DOCTYPE令牌

           
          
      • 解析错误。忽略令牌。
      •   
    •   
    • 标签名称为“html”的开始标记

           
          
      • 使用“in body”插入模式的规则处理令牌。
      •   
    •   
    • 标签名称为“body”的开始标记

           
          
      • 为令牌插入HTML元素。
      •   
      • 将frameset-ok标志设置为“not ok”。
      •   
      • 将插入模式切换为“in body”。
      •   
    •   
    • 标签名称为“frameset”的开始标记

           
          
      • 为令牌插入HTML元素。
      •   
      • 将插入模式切换为“in frameset”。
      •   
    •   
    • 标签名称为以下之一的开始标记:“base”,“basefont”,“bgsound”,“link”,“meta”,“noframes”,“script”,“style”,“template” “,”标题“

           
          
      • 解析错误。
      •   
      • 将head元素指针指向的节点推送到open元素堆栈上。
      •   
      • 使用“in head”插入模式的规则处理令牌。
      •   
      • 从开放元素堆栈中删除head元素指针指向的节点。 (此时可能不是当前节点。)
      •   
      • 此时头元素指针不能为空。
      •   
    •   
    • 标记名称为“template”的结束标记

           
          
      • 使用“in head”插入模式的规则处理令牌。
      •   
    •   
    • 标记名称为以下标记之一的结束标记:“body”,“html”,“br”

           
          
      • 按照下面“其他任何”条目中的描述行事。
      •   
    •   
    • 标签名称为“head”的开始标记

    •   
    • 任何其他结束标记

           
          
      • 解析错误。忽略令牌。
      •   
    •   
    • 其他任何事情

           
          
      • 为没有属性的“body”开始标记令牌插入HTML元素。
      •   
      • 将插入模式切换为“in body”。
      •   
      • 重新处理当前令牌。
      •   
    •   

答案 1 :(得分:4)

</head>结束标记和<body>开始标记之间的内容会在<body>开始标记之后插入,除非它是一个不属于正文的元素,在这种情况下它将被插入头部的末端。

某些元素,如script,可能出现在头部或身体中;该位置的脚本元素将插入头部的末尾,除非浏览器已经处于“体内”插入模式,在这种情况下,它们将被放置在正文中。

有关详细信息,请参阅W3C HTML的8.2.5.4.4 The "in head" insertion mode8.2.5.4.6 The "after head" insertion mode8.2.5.4.7 The "in body" insertion mode部分。请注意,由于历史原因,错误或故意违反规范的决定,不保证实现遵循规范,并且不应依赖此行为。