我看到一些关于document.write
被弃用的喋喋不休,但我不确定这些信息的确切来源。我确实在 MDN 中查找过它,但没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太多帮助(也许我只是没有使用正确的搜索词)。
如果确实已弃用,有人可以将我链接到表明它确实已弃用的相应文件吗?
我看到一些关于document.write
被弃用的喋喋不休,但我不确定这些信息的确切来源。我确实在 MDN 中查找过它,但没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太多帮助(也许我只是没有使用正确的搜索词)。
如果确实已弃用,有人可以将我链接到表明它确实已弃用的相应文件吗?
不,它只是最常被认为是不好的做法,几乎和eval
.
阅读:为什么 document.write 被认为是“不好的做法”?
引用上面链接问题的一些要点:
document.write
(以下简称 DW)在 XHTML 中不起作用页面加载完成后执行的DW会覆盖页面,或者写一个新页面,或者不起作用
DW在遇到的地方执行:它不能在给定的节点点注入
同样正如@JaredFarrish 所说,deprecated
主要是一种心态。这是一个很可能永远不会消失的遗物,否则它会破坏许多网站——即使是传统的谷歌分析代码也使用 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
通过 API 创建元素document.createElement
、设置其属性并将其附加到 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)。但是,虽然 Web 上的许多页面都有 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()虽然有规范中的一个相当明确的警告,以...结尾... “出于所有这些原因,强烈建议不要使用此方法。”