关于javascript:为什么document.write被认为是“不好的做法”?

Why is document.write considered a “bad practice”?

我知道document.write被认为是不好的做法;我希望编制一份理由清单,向第三方供应商提交为什么他们不应该在其分析代码的实现中使用document.write的理由。

请在下面说明您将document.write作为不良做法的理由。


一些更严重的问题:

  • document.write(此后dw)在xhtml中不起作用

  • dw不直接修改dom,防止进一步的操作(尝试寻找证据,但最好是情境性的)

  • 页面加载完成后执行的dw将覆盖页面,或写入新页面,或不工作

  • dw在遇到时执行:它不能在给定节点点插入

  • DW有效地编写序列化文本,这不是DOM概念上的工作方式,而且是创建bug的简单方法(.innerhtml有相同的问题)。

更好地使用安全且对dom友好的dom操作方法


从本质上来说,document.write并没有什么问题。问题是它很容易被滥用。粗鲁地,甚至。

对于提供分析代码的供应商(如Google Analytics),这实际上是他们分发此类代码片段的最简单方法。

  • 它使脚本保持较小
  • 他们不必担心覆盖已经建立的onload事件,或者包括必要的抽象来安全地添加onload事件。
  • 它非常兼容
  • 在我看来,只要你在加载文档后不尝试使用它,document.write就不是天生的邪恶。


    document.write的另一个合法使用来自html5样板index.html示例。

    1
    2
    3
    <!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js">
    window.jQuery || document.write('
    <script src="js/libs/jquery-1.6.3.min.js"><\/script>')

    我还看到了使用json2.js json parse/stringify polyfill的相同技术(IE7及以下版本需要)。

    1
    window.JSON || document.write('<script src="json2.js"><\/script>')


    它会阻塞你的页面

    document.write只在页面加载时工作;如果在页面加载完成后调用它,它将覆盖整个页面。

    这实际上意味着您必须从一个内联脚本块调用它——这将阻止浏览器处理后面的页面部分。在写入块完成之前,将不会下载脚本和图像。


    赞成的意见:

    • 这是从外部(到主机/域)脚本嵌入内联内容的最简单方法。
    • 您可以覆盖frame/iframe中的整个内容。在更现代的Ajax技术广泛应用之前(1998-2002年),我经常将这种技术用于菜单/导航片段。

    反对的论点:

    • 它将渲染引擎序列化为暂停,直到加载所述外部脚本为止,这可能比内部脚本花费更长的时间。
    • 它的使用方式通常是将脚本放在内容中,这被认为是不好的形式。


    这是我的两个价值观,一般来说,你不应该使用document.write进行重型起重,但有一个例子是它绝对有用的:

    http://www.quirksmode.org/blog/archives/2005/06/three_javacrip_1.html

    我最近在尝试创建Ajax滑块库时发现了这个问题。我创建了两个嵌套的div,并将width/heightoverflow: hidden应用到外部中。在浏览器禁用JS的情况下,DIV将浮动以适应图库中的图像,这是一个很好的优雅降级。

    事情是,正如上面的文章一样,JS对CSS的劫持直到页面加载后才开始,导致加载DIV时出现短暂的闪烁。所以我需要编写一个CSS规则,或者在页面加载时包含一个工作表。

    显然,这在XHTML中不起作用,但是由于XHTML看起来像是一个死鸭子(并且在IE中呈现为标签汤),所以可能值得重新评估您对doctype的选择……


    它使用XML呈现(如XHTML页面)来断开页面。

    最佳:一些浏览器切换回HTML渲染,一切正常。

    可能:某些浏览器在XML呈现模式下禁用document.write()函数。

    最糟糕的是:每当使用document.write()函数时,某些浏览器都会引发XML错误。


    它覆盖页面上的内容,这是最明显的原因,但我不会称之为"坏"。

    它没有多大用处,除非您使用javascript创建整个文档,在这种情况下,您可以从document.write开始。

    即使如此,在使用document.write时,您并没有真正利用DOM——您只是在向文档中转储一块文本,所以我认为这是一种糟糕的形式。