document.write是否已被弃用?

8

我看到有些人在谈论document.write已经被弃用,但我不确定这个信息来自哪里。我在MDN上查了一下, 但没有任何关于它被弃用的注释... 所以现在我有点怀疑。不幸的是,谷歌也没有提供太多帮助(也许我只是没有使用正确的搜索词)。

如果它确实被弃用了,有人可以给我链接到适当的文件,证明它确实被弃用了吗?


4
它已经被更适当的内容操作手段所取代,因此“弃用(deprecated)”更多地是一种心态而不是现实。它是个遗迹,可能永远不会消失,但大部分使用不再是最佳实践。 - Jared Farrish
很好的措辞@JaredFarrish,我无法表达得更好。 - Fabrício Matté
请注意,W3C参考文献:http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75233634 - Jared Farrish
还有HTML5规范:http://dev.w3.org/html5/spec/dynamic-markup-insertion.html#dynamic-markup-insertion - Jared Farrish
嘿,谢谢大家 - 这就是为什么我从不相信没有一些主要来源来支持它的网络上的任何东西。 - Stephen
显示剩余3条评论
3个回答

10
不是。它通常被认为是一种不良做法,几乎像eval一样被误用。

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

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

  • document.write(以下简称DW)在XHTML中无法工作

  • 页面加载完成后执行DW将覆盖页面,或者写入新页面,或者不起作用

  • DW在遇到时立即执行:它无法在给定节点点注入

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

显然,就功能而言,它早已被适当的DOM操作方法所取代。引用上面链接的问题:DW实际上是在编写序列化文本,这不符合DOM的概念工作方式。
为了平衡,这里列出了DW可能被认为是合适的地方:
  • There's nothing wrong with DW, per se - it won't destroy your page if you use it appropriately;
  • It allows for easily fallbacking an external script to a local copy such as when loading jQuery from a CDN fails:

    <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>
    
  • It's one of the easiest ways to insert external snippets in your page while keeping the code short (e.g. analytics). Note that systems such as Google Analytics now favor the asynchronous method - creating a script element through the document.createElement API, setting its properties and appending it to the DOM - rather than using its traditional document.write method.

简而言之:
DW 很容易被误用,因此在实际使用中,尽可能选择适当的 DOM 操作方法。


+1,但也许您可以提供一些关于为什么这是不良实践的要点吗? - Jeffrey Sweeney
似乎每个人都喜欢列出不使用它的原因。为了进行平衡的讨论,我们来列出一个什么时候使用它是合适的清单如何? - RobG
@RobG 好的。适当是一个相当主观的观点。DW通常是一种快速而肮脏的完成工作的方式,类似于.innerHTML。您会看到w3schools在许多页面示例中广泛使用DW,这是w3fools所不赞成的。除了外部JS回退之外,我真的想不出有什么东西不能轻松地用适当的DOM操作方法替换。即使GA现在也有一种异步方法,这是(主观上)更合适的。 - Fabrício Matté

3

document.write何时适用?

有许多地方鼓励程序员避免使用document.write(即使HTML5规范也不赞成它),这是一件好事,因为它是那些在网页脚本的最开始引入但从未标准化或指定的相当笨重的东西之一,并且已经被其他方法取代。

然而,仍然有至少一种情况可以考虑使用它。

不支持脚本的用户代理

许多网页有数百kb的脚本,主要是因为开发人员只是随意添加库和插件,没有考虑页面大小,因为这可以节省几个小时的开发时间,而开发人员认为他们的时间比客户或雇主的访问者更重要。

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

document.write是一种非常简单的实现脚本加载器的方法。当然,有更复杂的脚本加载器可以完成同样的事情,但是老旧的document.write基础、适用于任何地方,并且对于这个目的来说,像innerHTML一样轻松地完成工作。

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

innerHTML无法插入时

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

使用innerHTML插入的脚本元素不会执行,因此如果文档流处于打开状态,则使用document.write代替innerHTML非常容易。然而,通常的警告仍然适用,即在文档加载后使用document.write将首先删除当前文档,这通常(嗯,几乎从不)不是期望的结果。

弹出窗口

好的,大家都讨厌弹出窗口,结合document.write似乎是最糟糕的。但有时,通过document.write编写内容的简单弹出窗口比更复杂的对话框更简单快速(开发和展示都是如此)。

XHTML的借口

document.write在非HTML文档(例如XML)中不起作用。但是,虽然Web上的许多页面具有XHTML DOCTYPE(可能是因为CMS更喜欢XML而不是HTML),但这些页面几乎总是作为text/HTML提供的,因此浏览器会将它们视为HTML处理。网络很难立即转向XML(即实际作为XML提供的文档)。对于网页,DOCTYPE基本上是浏览器用来确定是否应处于标准模式的标志,因此XML问题有点无关紧要。

然而,归根结底,document.write 几乎不应在“现实世界”中使用,因为 DOM 方法提供了一个标准化的替代方案,具有良好的规范行为,并且几乎被普遍支持。 document.write 或多或少等同于 eval,在某些罕见情况下它是有用的,但通常有更好的方法来解决问题。

“弹出窗口”是一个不错的借口,但任何库或非常小的代码片段都可以提供带有可选模板的对话框模态,我认为这比可能被用户浏览器阻止的弹出窗口更具可用性,迫使开发人员请求用户解除弹出窗口以启用页面功能的一些部分。 - Fabrício Matté
哦,不用担心“不支持脚本的用户代理”,我已经读了三遍。禁用JS的用户仍然是少数派。我从来没有考虑过在禁用JS的情况下是否会下载脚本,但我认为大多数浏览器会忽略这种情况下的脚本元素。不过,知道一些现代浏览器确实会下载这些脚本也是很好的。 - Fabrício Matté
问题是它是否已被弃用。我在这篇文章中没有看到对这个问题的回答。 - Ingo Bürk
@IngoBürk——你说得对,因为Fabricio已经回答了那个问题。 - RobG

0
在 W3C HTML5 规范 [W3C 推荐 2014 年 10 月 28 日第 6.3.3 节] 中,document.write() 仍然存在https://www.w3.org/TR/html5/webappapis.html#document.write(),尽管规范中有一个相当明确的警告,最后是这样说的..."出于所有这些原因,强烈不建议使用此方法。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接