作者:sx-March23 | 2023-08-27 12:38
我知道document.write
被认为是不好的做法; 我希望编制一份提交给第三方供应商的理由清单,说明为什么他们不应该document.write
在分析代码的实现中使用它们.
请在下面提供您声称document.write
为不良做法的理由.
1> annakata..:
一些比较严重的问题:
document.write(以下称DW)在XHTML中不起作用
DW不直接修改DOM,阻止进一步操纵 (试图找到这个的证据,但它最好是情境)
页面加载完成后执行的DW将覆盖页面,或者写一个新页面,或者不起作用
DW执行遇到的地方:它不能在给定节点处注入
DW有效地编写序列化文本,这不是DOM在概念上的工作方式,并且是一种创建错误的简单方法(.innerHTML也有同样的问题)
使用安全和DOM友好的DOM操作方法要好得多
-1,它绝对修改DOM.其他一切都很好.虽然我理解依赖于可以防止伤害的结构和方法的冲动,但这可能是一个用洗澡水甩掉婴儿的情况.
DOM是用于呈现页面的数据结构,因此是用户在页面上看到的alpha和omega.HTML!= DOM是正确的,但是对DW是否修改了DOM的问题并不重要.如果DW没有修改DOM,你就看不到屏幕 - 所有浏览器都是如此,并且只要DOM是用于呈现页面的内容,它就会一直存在.
_"DW执行遇到的地方"_ - 并不总是一个缺点,实际上它可以被认为是某些事情的优势,例如,添加脚本元素(实际上我唯一使用DW的东西,甚至我认为两次).
FireBug不是DOM的真实表示.Mozilla尝试将HTML解析为DOM.您可以在Firebug DOM视图中看到完全破坏的HTML.
@RicardoRivaldo是的,如果在文档加载完成后调用`document.write`,它们就会这样做
@vsync - 没有插入在给定点调用的给定点,你看到区别吗?
由于XHTML不再是HTML的最新版本,现在也可以安全地触发/忽略#1点吗?例如,如果您不是在编写XHTML,为什么要担心与XHTML不兼容?由于您的JavaScript不需要与其他任何人的网站进行交互,因此您只需要自己的网站.
特别是对于Firebug,这只是对DOM本身的一种了解,它不解析HTML,或者您将无法查看未解析的DOM属性。甚至firebug-lite也可以通过检查DOM本身来工作,而不是解析原始HTML(甚至更多)
以下是将document.write与appendChild交错导致的实际安全漏洞:https://bugzilla.mozilla.org/show_bug.cgi?id = 607222
2> Peter Bailey..:
实际上document.write
,本身没有任何问题.问题是滥用它真的很容易.甚至,甚至.
对于提供分析代码的供应商(如Google Analytics)而言,它实际上是分发此类代码段的最简单方式
它使脚本保持较小
他们不必担心覆盖已经建立的onload事件或包括必要的抽象来安全地添加onload事件
它非常兼容
根据document.write
我的拙见,只要你在文件加载后没有尝试使用它,就不是天生就是邪恶的.
就像插入分析标签一样?毕竟,这是原始问题的一部分.并且非常兼容,我的意思是只支持document.write方法的原始浏览器.
document.write对html解析器做了非常可怕的事情,并且在简单的情况下只是"非常兼容".
覆盖onload事件?什么是`addEventListener`?
3> Kevin Hakans..:
另一个合法用途document.write
来自HTML5 Boilerplate index.html示例.
我也看到了使用json2.js JSON解析/ stringify polyfill(IE7及以下版本所需)的相同技术.
可以在这里使用,但仍然"更好"使用DOM操作功能 - 甚至谷歌也用于谷歌分析.代码段是[此处](https://support.google.com/analytics/bin/answer.py?hl=zh-CN&answer=1008080).
@BMiner如果通过DOM操作插入`script`元素,是否同步加载?除非是,否则它不是替代品.
@JanDvorak - 好点; 在使用DOM操作时,浏览器通常会异步加载脚本.您可以使用`onload` DOM事件来确定何时可以使用异步加载的脚本.
4> Sean McMilla..:
它可以阻止您的页面
document.write
仅在页面加载时有效; 如果在页面加载完成后调用它,它将覆盖整个页面.
这实际上意味着您必须从内联脚本块调用它 - 这将阻止浏览器处理后面页面的部分内容.在写入块完成之前,不会下载脚本和图像.
5> Tracker1..:
优点:
这是从外部(到您的主机/域)脚本嵌入内联内容的最简单方法.
您可以覆盖框架/ iframe中的整个内容.在更广泛地使用现代Ajax技术(1998-2002)之前,我曾经常常将这种技术用于菜单/导航部分.
缺点:
它将呈现引擎序列化以暂停,直到加载所述外部脚本,这可能比内部脚本花费更长的时间.
它通常以这样的方式使用,即脚本放在内容中,这被认为是错误的形式.
还有更多的缺点.例如,谷歌Chrome将拒绝运行`document.write`,在某些情况下会创建`
sx-March23
这个屌丝很懒,什么也没留下!