我已阅读that it is bad来执行此操作,并且在规范之外,但我有一个有点间歇性的错误,可能是相关的。只是想知道普遍的共识是"用凝固汽油弹烧掉那个代码"或者"它在这些有限的条件下工作"。
我发现,在一个非常复杂的代码库中,我们维护了<script>
标记,这些标记都是在</head>
之后和{{之前}从外部源(javascript和jquery)和内联脚本加载的1}}。大多数是在表单完全加载后需要加载的代码。
在我开始进行更改以将代码合并到Head标记的底部之前,我想了解现在正在发生什么到运行此代码的客户端(目标是不打破当前的用户体验)。这些脚本是在呈现页面之前加载还是之后?这个无人区域代码的实际状态首先不应该存在于什么状态?
谢谢!
答案 0 :(得分:7)
从根本上说,它是无效的标记和浏览器必须从中恢复的解析错误。所以我会在你的目标浏览器中测试它,看看它们做了什么。
理论上:在结束</head>
标记之后和开始<body>
标记之前,解析器位于“'after head' insertion mode”中。我已经列出了以下规则,但感谢your comment,我认为相关的是:
- 标签名称为以下之一的开始标记:“base”,“basefont”,“bgsound”,“link”,“meta”,“noframes”,“script”,“style”,“template”,“标题”
- 解析错误。
- 将head元素指针指向的节点推送到open元素堆栈上。
- 使用“in head”插入模式的规则处理令牌。
- 从开放元素堆栈中删除head元素指针指向的节点。 (此时可能不是当前节点。)
- 此时头元素指针不能为空。
告诉我们:
head
的末尾。完整规则:
当用户代理要应用“后头”插入模式的规则时,用户代理必须按如下方式处理令牌:
字符标记,是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 mode,8.2.5.4.6 The "after head" insertion mode和8.2.5.4.7 The "in body" insertion mode部分。请注意,由于历史原因,错误或故意违反规范的决定,不保证实现遵循规范,并且不应依赖此行为。