我知道 document.write
被认为是不良实践;我希望列举出一些理由,提交给第三方供应商,告诉他们为什么不能在分析代码的实现中使用 document.write
。
请在下面提供您认为 document.write
是不良实践的原因。
我知道 document.write
被认为是不良实践;我希望列举出一些理由,提交给第三方供应商,告诉他们为什么不能在分析代码的实现中使用 document.write
。
请在下面提供您认为 document.write
是不良实践的原因。
一些比较严重的问题:
document.write (以下简称DW) 在XHTML中无法使用
DW无法直接修改DOM,防止进一步操作(正在尝试找到证据,但这最多是情景问题)
在页面加载完成后执行DW会覆盖页面、编写新页面或不起作用
DW在遇到时就执行:它无法注入到特定节点点
DW实际上是在写序列化文本,这不是DOM在概念上工作的方式,也是创建错误的简单方法(.innerHTML也有同样的问题)
使用安全和DOM友好的DOM操作方法要好得多
document.write
本身实际上没有任何问题,问题在于使用起来非常容易出错,甚至是严重的错误。
对于提供分析代码(例如Google Analytics)的供应商来说,这实际上是他们分发这些代码片段的最简单方法:
只要不在文档加载完成后尝试使用它,在我看来,document.write
并不是本质上邪恶的东西。
addEventListener
是用来做什么的? - m93adocument.write
调用。 - Flimm它可以阻止您的页面
document.write
只能在页面加载时起作用;如果在页面加载完成后调用它,它将覆盖整个页面。
这实际上意味着您必须从内联脚本块中调用它,而这将阻止浏览器处理随后的页面部分。直到写入块完成之前,脚本和图像都不会被下载。
document.write
的另一个合法用途来自于 HTML5 Boilerplate index.html 示例。
<!-- 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"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.3.min.js"><\/script>')</script>
我也看到了同样的技巧,使用json2.js JSON解析/字符串填充(IE7及以下版本需要)。
<script>window.JSON || document.write('<script src="json2.js"><\/script>')</script>
script
元素,它是否同步加载?除非是这样,否则它不是一个替代品。 - John Dvorakonload
DOM事件来确定异步加载的脚本何时可用于使用。 - BMinersrc
),则会同步加载。否则,它将异步地“尽快”执行。 - Oriol<script>
标签的document.write
调用。请参见https://developers.google.com/web/updates/2016/08/removing-document-write - Flimm优点:
缺点:
<script>
标签的document.write
。具体请参考https://developers.google.com/web/updates/2016/08/removing-document-write - Flimm总的来说,在进行重量级处理时,通常不应该使用 document.write
,但是有一种情况可以明确地使用它:
http://www.quirksmode.org/blog/archives/2005/06/three_javascrip_1.html
我最近发现这个问题,是因为尝试创建 AJAX 滑动画廊。 我创建了两个嵌套的 div,并在外部 <div>
上应用了 width
/height
和 overflow: hidden
的 JS。 这样,如果浏览器禁用了 JS,该 div 将浮动以适应画廊中的图像 - 一些不错的优雅降级。
问题是,就像上面的文章一样,这种对 CSS 的 JS 劫持直到页面加载后才能生效,从而导致 div 加载时出现短暂闪烁。 所以我需要编写一个 CSS 规则或在页面加载时包含样式表。
显然,这在 XHTML 中不起作用,但由于 XHTML 似乎已经过时(并且在 IE 中呈现为标签 soup),所以重新评估 DOCTYPE 的选择可能是值得的...
它覆盖了页面上的内容,这是最明显的原因,但我不会称其为“糟糕”。
除非您正在使用JavaScript创建整个文档,否则它没有太多用途,在这种情况下,您可以从document.write开始。
即使如此,当您使用document.write时,实际上并没有充分利用DOM-您只是将一大块文本倾泻到文档中,因此我认为这是不好的形式。
div.innerHTML = "<label for='MySelect'>Choose One</label><select id='MySelect'><option value='foo' selected=''>foo</option><option value='bar'>bar</option></select>";
这样做吗?那似乎会产生很多不必要且不易读的代码。这也与John Resig和其他JS开发人员提倡的方法完全相反。 - Lèse majesté以下是我脑海中的想法:
document.write
需要在页面加载或正文加载中使用。因此,如果您想在任何其他时间使用脚本来更新页面内容,则document.write
几乎无用。
从技术上讲,document.write
只会更新HTML页面而不是XHTML/XML。IE似乎对此事情很宽容,但其他浏览器将不会。
它会破坏使用XML渲染的页面(例如XHTML页面)。
最好的情况:一些浏览器会切换回HTML渲染,一切正常。
可能的情况:一些浏览器在XML渲染模式下禁用document.write()函数。
最糟糕的情况:一些浏览器在使用document.write()函数时会触发XML错误。
在某些情况下,Chrome可能会阻止使用document.write
插入脚本。当发生这种情况时,它将在控制台中显示以下警告:
通过document.write调用了一个解析器阻塞的跨源脚本...。如果设备网络连接差,则浏览器可能会阻止此操作。
document.write
,那么它们就会起作用。 - Izkata