【问题标题】:Is document.write actually deprecated?document.write 真的被弃用了吗?
【发布时间】:2012-09-24 22:59:56
【问题描述】:

我看到一些关于 document.write 被弃用的讨论,但我不确定这些信息的确切来源。 I did look it up in MDN,但没有任何关于它被弃用的符号......所以现在我有点怀疑。不幸的是,谷歌也没有太多帮助(也许我只是没有使用正确的搜索字词)。

如果确实已弃用,有人可以将我链接到表明它确实已弃用的相应文档吗?

【问题讨论】:

标签: javascript


【解决方案1】:

没有。它通常被认为是不好的做法,几乎与eval 一样被滥用。

阅读:Why is document.write considered a 'bad practice'?

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

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

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

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

正如@JaredFarrish 所说,deprecated 主要是一种心态。这是一个很可能永远不会消失的遗物,否则它会破坏许多网站 - 即使Traditional Google Analytics code 使用 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>
    
  • 这是在页面中插入外部 sn-ps 并同时保持代码简短(例如分析)的最简单方法之一。请注意,Google Analytics 等系统现在更喜欢异步方法——通过document.createElement API 创建一个script 元素,设置其属性并将其附加到DOM——而不是使用其传统的document.write 方法。

tl;博士:
DW 很容易被误用,因此对于现实世界的使用,只要可行,最好使用适当的 DOM 操作方法。

【讨论】:

  • +1,但也许您可以提供一些要点,说明为什么文章中的做法不好?
  • 似乎每个人都喜欢为什么不使用它的列表。为了平衡讨论,列出一个合适的时间列表怎么样?
  • @RobG 够公平的。 appropriate 是一个相当主观的观点。 DW 通常是一种快速而肮脏地完成工作的方法——类似于.innerHTML。您会看到 w3schools 在许多页面的示例中广泛使用 DW,这是 w3fools 不赞成的。除了外部 JS 回退之外,我真的想不出任何不能被适当的 DOM manip 方法轻松替换的东西。甚至 GA 现在也有一个异步方法,这(主观上)更合适。
【解决方案2】:

document.write 什么时候可以?

有很多地方鼓励程序员避免使用document.write(甚至HTML5 specification 也给了它一个沉重的耳光),这是一件好事,因为它是一开始就引入的那些相当笨重的东西之一从未标准化甚至未指定且已被其他方法取代的 Web 脚本。

但是,至少在一种情况下它可能被认为是有帮助的。

不支持脚本的用户代理

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

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

document.write 是实现脚本加载器的一种非常简单的方法。当然,有更复杂的脚本加载器可以做同样的事情,但是旧的 document.write 已经死了,可以在任何地方工作,为此,它可以像 innerHTML 一样轻松地完成这项工作。

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

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

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

不执行使用innerHTML 插入的脚本元素,因此如果文档流是打开的,使用document.write 代替innerHTML 非常简单。但通常需要注意的是,在加载文档后使用 document.write 将首先删除当前文档,这并不总是(错误,几乎永远不会)可取的。

弹出窗口

好吧,每个人都讨厌弹出窗口,将它们与 document.write 结合起来似乎是最糟糕的最糟糕的。但有时,内容由document.write 撰写的简单弹出窗口比更复杂的对话更简单、更快捷(开发和呈现)。

XHTML 的借口

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

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

【讨论】:

  • Popup windows 是一个不错的借口,但是任何库或非常小的 sn-ps 都会提供带有可选模板的对话框模式,IMO 提供的可用性比弹出窗口可能恰好被用户阻止浏览器,迫使开发人员请求用户取消阻止弹出窗口以启用页面的某些功能。
  • 哦,不要介意“不支持脚本的用户代理”,我不得不第三次阅读它。禁用 JS 的用户仍然是极少数。我从未真正考虑过是否会在禁用 JS 的情况下下载脚本,但我认为大多数浏览器在这种情况下会简单地忽略脚本元素。不过,很高兴知道一些确实会下载这些的现代浏览器。
  • 问题是它是否已被弃用。我在这篇文章中没有看到该问题的任何答案。
  • @IngoBürk——你是对的,因为 Fabricio 已经回答了这个问题。
【解决方案3】:

在 W3C HTML5 规范 [W3C 建议 2014 年 10 月 28 日第 6.3.3 节] document.write() 仍然存在,https://www.w3.org/TR/html5/webappapis.html#document.write() 尽管规范中有一个相当明确的警告,以...结尾... "由于所有这些原因,强烈建议不要使用这种方法。”

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多