为什么 document.write 被认为是“不好的做法”?

IT技术 javascript
2020-12-20 22:40:46

我知道这document.write被认为是不好的做法;我希望编制一份理由清单,以提交给第三方供应商,说明为什么他们不应该document.write在他们的分析代码的实现中使用

document.write在下面说明您声称为不良做法的原因

6个回答

几个比较严重的问题:

  • document.write(以下称为 DW)在 XHTML 中不起作用

  • DW 不直接修改 DOM,防止进一步操作 (试图找到这方面的证据,但充其量是情境化的)

  • 页面加载完成后执行的DW会覆盖页面,或者写一个新页面,或者不工作

  • DW 在遇到的地方执行:它不能在给定的节点点注入

  • DW 正在有效地编写序列化文本,这不是 DOM 概念上的工作方式,并且是一种创建错误的简单方法(.innerHTML 也有同样的问题)

使用安全且对 DOM 友好的DOM 操作方法要好得多

DOM 是用于呈现页面的数据结构,因此是用户在页面上看到的 alpha 和 omega。HTML != DOM 是正确的,但对于 DW 是否修改 DOM 的问题并不重要。如果 DW 没有修改 DOM,您将看不到屏幕 - 所有浏览器都是如此,并且只要 DOM 是用来呈现页面的内容,就总是如此。
2021-02-07 22:40:46
“DW 在遇到的地方执行” - 并不总是一个缺点,实际上它可以被认为是某些事情的一个优势,例如,添加脚本元素(实际上是我唯一使用 DW 的事情,即使那样我也会三思而后行) .
2021-02-11 22:40:46
-1,它绝对修改了 DOM。其他一切都很好。虽然我理解依赖结构和方法可以保护您免受伤害的冲动,但这可能是将婴儿和洗澡水一起倒掉的情况。
2021-02-22 22:40:46
@RicardoRivaldo 是的,他们这样做,如果document.write在文档加载完成后调用
2021-03-01 22:40:46
FireBug 不是 DOM 的真实表示。这是 mozilla 尝试将 HTML 解析为 DOM。您可以在 Firebug DOM 视图中使完全损坏的 HTML 看起来正确。
2021-03-05 22:40:46

document.write本身实际上并没有什么问题问题是它真的很容易被滥用。大体上,甚至。

就提供分析代码(如 Google Analytics)的供应商而言,这实际上是他们分发此类代码段的最简单方法

  1. 它使脚本变小
  2. 他们不必担心覆盖已经建立的 onload 事件或包括必要的抽象来安全地添加 onload 事件
  3. 它非常兼容

只要您在文档加载后不尝试使用它document.write,在我看来这并不是天生的邪恶。

任何适用于最新版本的 Chrome / IE / Safari / Opera / FireFox 的东西都被认为是兼容的。
2021-02-10 22:40:46
就像插入分析标签一样?毕竟,这是原始问题的一部分。并且非常兼容,我的意思是仅对 document.write 方法的原始浏览器支持。
2021-02-12 22:40:46
document.write当满足某些条件时,Chrome 不会运行插入脚本的调用。
2021-02-27 22:40:46
覆盖加载事件?又是addEventListener为了什么?
2021-02-28 22:40:46
document.write 对 html 解析器做了非常可怕的事情,并且只在简单的情况下“非常兼容”。
2021-03-05 22:40:46

它可以阻止您的页面

document.write仅在页面加载时有效;如果在页面加载完成后调用它,它将覆盖整个页面。

这实际上意味着您必须从内联脚本块中调用它 - 这将阻止浏览器处理随后的页面部分。在写入块完成之前,不会下载脚本和图像。

另一个合法使用document.write来自 HTML5 Boilerplate index.html示例。

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.3.min.js"><\/script>')</script>

我还看到了使用json2.js JSON 解析/字符串化polyfillIE7 及更低版本需要的相同技术

<script>window.JSON || document.write('<script src="json2.js"><\/script>')</script>
在这里使用还不错,但仍然“更好”使用 DOM 操作函数——甚至谷歌也为谷歌分析做了它。片段在这里
2021-02-08 22:40:46
@JanDvorak如果它不是外部的(没有src则同步加载否则,它将“尽快”异步执行。
2021-02-08 22:40:46
@BMiner 如果您script通过 DOM 操作插入一个元素,它是同步加载的吗?除非是,否则它不是替代品。
2021-02-20 22:40:46
@JanDvorak - 好点;使用 DOM 操作时,浏览器通常会异步加载脚本。您可以使用onloadDOM 事件来确定异步加载的脚本何时可供使用。
2021-02-23 22:40:46
这仍然可能会中断,因为如果用户使用 2G 连接,Chrome 会故意拒绝运行document.write插入<script>标签的调用developers.google.com/web/updates/2016/08/...
2021-03-08 22:40:46

亲:

  • 这是从外部(到您的主机/域)脚本嵌入内联内容的最简单方法。
  • 您可以覆盖框架/iframe 中的整个内容。在更现代的 Ajax 技术广泛使用之前(1998-2002),我曾经经常将这种技术用于菜单/导航部分。

骗局:

  • 它序列化渲染引擎以暂停,直到加载所述外部脚本,这可能比内部脚本花费更长的时间。
  • 它通常用于将脚本放置在内容中的方式,这被认为是不良形式。
@Flimm 值得注意的是,您的评论是在我回答之后 8 年多,而这几乎是 3 年之后。是的,还有其他缺点......如果 document.write 本身没有消失,我会感到惊讶......以及其他一些可能被高度滥用的接口。
2021-02-22 22:40:46
还有比这更多的缺点。例如,谷歌浏览器在某些情况下会拒绝运行document.write创建<script>标签。developer.google.com/web/updates/2016/08/...
2021-03-08 22:40:46