当前位置:Gxlcms > html代码 > 为什么把Script标签放在body结束标签之后html结束标签之前?

为什么把Script标签放在body结束标签之后html结束标签之前?

时间:2021-07-01 10:21:17 帮助过:50人阅读

新浪微博、谷歌等,为什么把Script标签放在body结束标签之后html结束标签之前?
而不是之前推荐的body结束标签之前?
问题关键:放在body结束标签之前与之后有什么差别?

回复内容:

Google并没有把输出输出内容,由客户端浏览器来辅助它处理HTML,最终目的是为了提速与尽可能加大服务端吞吐量。

至于新浪微博的问题,比较复杂,只能推测下。
新浪微博默认采用【非IE6下】bigpipe机制分块输出页面内容。这需要在首块时候就吐出页面框架结构给浏览器。那么这个先吐出的页面结构是否需要闭合标签呢?
从直觉触发,为了避免浏览器出现未知异常,应该在首次吐出的页面框架中闭合body。那么,之后分块输出的 script 标签必然会被打印在 之后,然后依赖浏览器修复机制执行代码。
新浪微博当时的工程师们可能并不知道修复机制,仅仅是为了避免项目风险,经过测试后发现这么做可行,就这么做了。
不管怎样,基于bigpipe机制分块吐出机制,在body没有闭合,页面数据继续到达的情况下,之后被吐出的script代码很可能存在操作document.body对象,这样可能会导致异常,你我做如此实现时候都必须掂量下是否要冒风险不闭合body标签。

此外,对于贺老祖的一些解释,偶表示部分不认同。
content type 的问题。
rfc3236 规定了 application/xhtml+xml 这样的 XHTML mimetype 来表示一个XHTML文件。但是浏览器并不一定按照这个 mimetype 来解析,偶从开源浏览器代码中【Gecko/Webkit】只看到 parser HTML 部分的实现,这部分内容对于 XHTML 是无特殊处理的,就是说即使是 XHTML 也会被当做 HTML parser。唯一有一点不同的是,页面的 DTD 如何写会被浏览器嗅探,用来触发三种不同的文档模式【怪异、近乎标准、标准】。至于当前文档的 mimetype 是什么,对解析 HTML 或者渲染的影响,没有得到很明显的源码证据。
【当然,基于network层是会区分mimetype 的,它会筛选出它认为是HTML的类型交付HTML parse 处理。事实上IE会比其他浏览器做的要更多,对于非二进制类型,会启用“HTML嗅探机制”,如果首200字符内有特定HTML标记,则会将文档交由HTML parse 处理】。

贺老祖【】内表述的挂羊头卖狗肉行为偶就不细说了,仅当做 贺老祖 个人情绪发泄。个人感觉没必要太学院了,实际适用就好。



恩恩,惯例,最后来个总结。
说了这么多,两种方式实际使用上没有什么区别,唯一差异在于你是否要利用浏览器的自动修复机制。
当然,理论上讲,利用了自动修复机制必然会导致性能有损失。
至于性能损失多大,是否要如此用,偶说不好,由看官自行判断。 从实际效果来看,应该是没有区别的。但是放在 html 结束标签之前应该是不规范的(通不过 HTML 验证),放在 body 结束之前才对。当然你完全可以选择无视验证。具体选择这么做的原因,还真不清楚。 IE 8-(8 不确定)有一个 bug,如果