我已经读到这样做是不好的,并且在规范之外,但我有一个有点间歇性的错误,可能是相关的.只是想知道普遍的共识是"用凝固汽油弹燃烧代码"还是"它在这些有限的条件下工作".
我发现,在一个非常复杂的代码库中,我们维护,标记,从外部源(javascript和jquery)和内联脚本加载,在
之前和之后
.大部分是在表单完全加载后需要加载的代码.
在我开始做改革,以便把代码到head标签的底部,我想明白发生了什么,现在到运行该代码的客户(我们的目标是不会打破当前的用户体验).这些脚本是在呈现页面之前加载还是之后?这个无人区代码的实际状态首先不应该存在于什么状态?
谢谢!
从根本上说,它是无效的标记和浏览器必须从中恢复的解析错误.所以我会在你的目标浏览器中测试它,看看它们做了什么.
理论上:在结束标记之后和开始
标记之前,解析器处于" '头部'插入模式之后 ".我已经列出了下面的规则,但是由于你的评论,我认为相关的是:
标签名称为以下之一的开始标记:"base","basefont","bgsound","link","meta","noframes","script","style","template","title"
解析错误.
将头元素指针指向的节点推到打开元素的堆栈上.
使用"in 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","title"
解析错误.
将头元素指针指向的节点推到打开元素的堆栈上.
使用"in head"插入模式的规则处理令牌.
从开放元素堆栈中删除头元素指针指向的节点.(此时可能不是当前节点.)
此时头元素指针不能为空.
标记名称为"模板"的结束标记
使用"in head"插入模式的规则处理令牌.
标记名称为以下之一的结束标记:"body","html","br"
按照下面"其他任何"条目中的描述行事.
标签名称为"head"的开始标记
任何其他结束标记
解析错误.忽略令牌.
还要别的吗
为没有属性的"body"开始标记标记插入HTML元素.
将插入模式切换为"in body".
重新处理当前令牌.