document.write 真的被弃用了吗?

IT技术 javascript
2021-02-25 13:37:36

我看到了一些关于document.write被弃用的喋喋不休,但我不确定这些信息的确切来源。我确实在 MDN 中查找过它,但是没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太大帮助(也许我只是没有使用正确的搜索词)。

如果它确实已被弃用,有人可以将我链接到显示它确实已被弃用的适当文件吗?

3个回答

不。它通常被认为是不好的做法,几乎与eval.

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

引用上面链接问题中的一些要点:

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

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

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

同样正如@JaredFarrish 所说,deprecated主要是一种心态。这是一个很可能永远不会消失的遗物,否则它会破坏许多站点 - 即使是传统的 Google Analytics 代码也使用 DW。

显然,在功能方面它很久以前就被适当的 DOM 操作方法所取代,并再次引用上面的链接问题:DW is effectively writing serialised text which is not the way the DOM works conceptually.


为了平衡,这里列出了 DW 可能被认为合适的地方:

  • DW 本身并没有错——如果你使用得当,它不会破坏你的页面;
  • 它允许轻松地将外部脚本回退到本地副本,例如当从 CDN 加载 jQuery 失败时:

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="js/libs/jquery-1.8.2.min.js">\x3C/script>');</script>
    
  • 这是在保持代码简短(例如分析)的同时在页面中插入外部代码段的最简单方法之一。请注意,诸如 Google Analytics 之类的系统现在更喜欢异步方法 -script通过document.createElementAPI创建元素,设置其属性并将其附加到 DOM - 而不是使用其传统document.write方法。

tl;dr:
DW 很容易被误用,因此对于现实世界的使用,只要可行,就更喜欢适当的 DOM 操作方法。

+1,但也许您可以提供一些要点来说明为什么文章中的做法不好?
2021-05-10 13:37:36
似乎每个人都喜欢为什么不使用它的列表。为了进行平衡的讨论,如何列出合适的时间?
2021-05-18 13:37:36
@RobG 够公平的。appropriate不过是比较主观的看法。DW 通常是一种以快速而肮脏的方式完成工作的方法 - 类似于.innerHTML. 您会看到 w3schools 在许多页面的示例中广泛使用 DW,w3fools 对此表示不满。除了外部 JS 回退之外,我真的想不出任何不能被适当的 DOM 操作方法轻易替换的东西。甚至 GA 现在也有一个异步方法,这(主观上)更合适。
2021-05-20 13:37:36

什么时候document.write好?

有很多地方是鼓励程序员避免的document.write(即使是HTML5 规范也给它狠狠的一巴掌),这是一件好事,因为它是在 web 脚本编写之初引入的那些相当笨重的东西之一,从未标准化或甚至指定,它已被其他方法取代。

但是,仍然至少有一种情况可能被认为是有帮助的。

不支持脚本的用户代理

许多网页有数百 kb 的脚本,主要是因为开发人员只是在不考虑页面大小的情况下放入库和插件,因为它节省了几个小时的开发时间,而且开发人员认为他们的时间比他们的客户或雇主的访问者的时间更重要。

如果脚本被禁用或不可用,浏览器通常不会下载脚本,但有些可能。使用脚本插入脚本意味着如果脚本不可用,则永远不会将脚本元素放置在文档中并且永远不会下载相关资源。

document.write是实现脚本加载器的一种非常简单的方法。当然,有更复杂的脚本加载器可以做同样的事情,但好老是document.write基本的,在任何地方都可以使用,为此,它可以像innerHTML一样轻松地出色地完成工作。

鉴于innerHTML(甚至标记片段作为使用DOM 方法创建元素的一种方法)的广泛使用,使用类似的工具来插入脚本似乎是合理的。

使用 innerHTML 插入不起作用的地方

这与上面的几乎相同,但略有不同。

使用innerHTML 插入的脚本元素不会被执行,所以如果文档流是打开的,那么使用document.writeinnerHTML 代替它是非常简单的。但是,通常的警告适用,document.write在加载文档后使用将首先删除当前文档,这并不总是(错误,几乎从不)可取。

弹出窗口

好吧,每个人都讨厌弹出窗口,并将它们与document.write最糟糕的情况结合起来似乎是最糟糕的。但有时,与document.write更复杂的对话相比,包含由作者编写的内容的简单弹出窗口更简单、更快(无论是开发还是呈现)。

XHTML 借口

document.write不适用于非 HTML 文档(例如 XML)。但是,虽然网络上的许多页面都有 XHTML DOCTYPE(可能是因为 CMS 更喜欢 XML 而非 HTML),但这些页面几乎总是以文本/HTML 的形式提供,因此浏览器就是这样对待它们的。Web 极不可能很快转向 XML(即文档实际上以 XML 形式提供)。对于网页,DOCTYPE 本质上是浏览器用来确定它是否应该处于标准模式的标志,所以 XML 的东西有点像 Phurphy。

然而,底线是document.write几乎永远不应该在“现实世界”中使用,因为 DOM 方法提供了标准化的替代方案,具有明确指定的行为并且几乎得到普遍支持。document.write或多或少等同于eval在某些罕见的情况下它很有用,但几乎总是有更好的做事方式。

问题是它是否已被弃用。我在这篇文章中没有看到这个问题的任何答案。
2021-04-24 13:37:36
哦,别介意“不支持脚本的用户代理”,我不得不第三次阅读它。JS禁用的用户仍然是极少数。我从来没有真正考虑过是否会在禁用 JS 的情况下下载脚本,但我认为大多数浏览器在这种情况下会简单地忽略脚本元素。不过,很高兴知道一些确实下载这些的现代浏览器。
2021-04-25 13:37:36
Popup windows 是一个不错的借口,但是任何库或非常小的片段都会提供带有可选模板的对话框模式,IMO 提供比弹出窗口更好的可用性,弹出窗口可能碰巧被用户的浏览器阻止,迫使开发人员请求用户取消阻止弹出窗口启用页面的某些功能。
2021-05-18 13:37:36
@IngoBürk——你说得对,因为法布里西奥已经回答了这个问题。
2021-05-20 13:37:36

在 W3C HTML5 规范中 [W3C Recommendation 28 October 2014 section 6.3.3] document.write() 仍然存在,https://www.w3.org/TR/html5/webappapis.html#document.write()虽然有规范中相当明确的警告,结尾是... “由于所有这些原因,强烈建议不要使用这种方法。”