我看到了一些关于document.write
被弃用的喋喋不休,但我不确定这些信息的确切来源。我确实在 MDN 中查找过它,但是没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太大帮助(也许我只是没有使用正确的搜索词)。
如果它确实已被弃用,有人可以将我链接到显示它确实已被弃用的适当文件吗?
我看到了一些关于document.write
被弃用的喋喋不休,但我不确定这些信息的确切来源。我确实在 MDN 中查找过它,但是没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太大帮助(也许我只是没有使用正确的搜索词)。
如果它确实已被弃用,有人可以将我链接到显示它确实已被弃用的适当文件吗?
不。它通常被认为是不好的做法,几乎与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 可能被认为合适的地方:
它允许轻松地将外部脚本回退到本地副本,例如当从 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.createElement
API创建元素,设置其属性并将其附加到 DOM - 而不是使用其传统document.write
方法。
tl;dr:
DW 很容易被误用,因此对于现实世界的使用,只要可行,就更喜欢适当的 DOM 操作方法。
document.write
好?有很多地方是鼓励程序员避免的document.write
(即使是HTML5 规范也给它狠狠的一巴掌),这是一件好事,因为它是在 web 脚本编写之初引入的那些相当笨重的东西之一,从未标准化或甚至指定,它已被其他方法取代。
但是,仍然至少有一种情况可能被认为是有帮助的。
许多网页有数百 kb 的脚本,主要是因为开发人员只是在不考虑页面大小的情况下放入库和插件,因为它节省了几个小时的开发时间,而且开发人员认为他们的时间比他们的客户或雇主的访问者的时间更重要。
如果脚本被禁用或不可用,浏览器通常不会下载脚本,但有些可能。使用脚本插入脚本意味着如果脚本不可用,则永远不会将脚本元素放置在文档中并且永远不会下载相关资源。
document.write
是实现脚本加载器的一种非常简单的方法。当然,有更复杂的脚本加载器可以做同样的事情,但好老是document.write
基本的,在任何地方都可以使用,为此,它可以像innerHTML一样轻松地出色地完成工作。
鉴于innerHTML(甚至标记片段作为使用DOM 方法创建元素的一种方法)的广泛使用,使用类似的工具来插入脚本似乎是合理的。
这与上面的几乎相同,但略有不同。
使用innerHTML 插入的脚本元素不会被执行,所以如果文档流是打开的,那么使用document.write
innerHTML 代替它是非常简单的。但是,通常的警告适用,document.write
在加载文档后使用将首先删除当前文档,这并不总是(错误,几乎从不)可取。
好吧,每个人都讨厌弹出窗口,并将它们与document.write
最糟糕的情况结合起来似乎是最糟糕的。但有时,与document.write
更复杂的对话相比,包含由作者编写的内容的简单弹出窗口更简单、更快(无论是开发还是呈现)。
document.write
不适用于非 HTML 文档(例如 XML)。但是,虽然网络上的许多页面都有 XHTML DOCTYPE(可能是因为 CMS 更喜欢 XML 而非 HTML),但这些页面几乎总是以文本/HTML 的形式提供,因此浏览器就是这样对待它们的。Web 极不可能很快转向 XML(即文档实际上以 XML 形式提供)。对于网页,DOCTYPE 本质上是浏览器用来确定它是否应该处于标准模式的标志,所以 XML 的东西有点像 Phurphy。
然而,底线是document.write
几乎永远不应该在“现实世界”中使用,因为 DOM 方法提供了标准化的替代方案,具有明确指定的行为并且几乎得到普遍支持。document.write
或多或少等同于eval
在某些罕见的情况下它很有用,但几乎总是有更好的做事方式。
在 W3C HTML5 规范中 [W3C Recommendation 28 October 2014 section 6.3.3] document.write() 仍然存在,https://www.w3.org/TR/html5/webappapis.html#document.write()虽然有规范中相当明确的警告,结尾是... “由于所有这些原因,强烈建议不要使用这种方法。”