在教程中,我学会了使用document.write
。现在,我了解到很多人对此表示反对。我已经尝试过了print()
,但是它确实将其发送到打印机。
那么我应该使用哪些替代方法,为什么不使用document.write
呢?w3schools和MDN都使用document.write
。
在教程中,我学会了使用document.write
。现在,我了解到很多人对此表示反对。我已经尝试过了print()
,但是它确实将其发送到打印机。
那么我应该使用哪些替代方法,为什么不使用document.write
呢?w3schools和MDN都使用document.write
。
print()
与PHP的不同print()
。JS从字面上将页面发送到打印机,而PHP仅输出代码。
Answers:
作为推荐的替代方法,document.write
您可以使用DOM操作直接查询节点元素并将其添加到DOM。
替换HTML的原因是由于JavaScript函数邪恶:document.write()
。
它绝对是“错误的形式”。仅当您在页面加载时使用它时,它才适用于网页。如果在运行时使用它,它将用输入替换整个文档。而且,如果您将其应用为严格的XHTML结构,那么它甚至不是有效的代码。
document.write
写入文档流。调用document.write
一个关闭(或加载)文件自动调用document.open
这将清除文件。
document.write()
有两个伴郎document.open()
,和document.close()
。加载HTML文档时,该文档为“打开”状态。 文档加载完成后,文档已“关闭”。此时使用document.write()
会擦除整个(关闭的)HTML文档,并用新的(打开的)文档替换。这意味着您的网页已被擦除,并开始从头开始编写新页面。
我相信document.write()
也会导致浏览器的性能下降(如果我错了,请纠正我)。
此示例在页面加载后将输出写入HTML文档。document.write()
当您按下“灭”按钮时,Watch的邪恶力量会清除整个文档:
I am an ordinary HTML page. I am innocent, and purely for informational purposes. Please do not <input type="button" onclick="document.write('This HTML page has been succesfully exterminated.')" value="exterminate"/>
me!
.innerHTML
这是一个很好的选择,但是必须将此属性附加到要放置文本的元素上。 例: document.getElementById('output1').innerHTML = 'Some text!';
.createTextNode()
是W3C推荐的替代方法。 例: var para = document.createElement('p');
para.appendChild(document.createTextNode('Hello, '));
注意:已知这会导致某些性能下降(慢于.innerHTML
)。我建议.innerHTML
改为使用。
.innerHTML
其他示例的示例:I am an ordinary HTML page.
I am innocent, and purely for informational purposes.
Please do not
<input type="button" onclick="document.getElementById('output1').innerHTML = 'There was an error exterminating this page. Please replace <code>.innerHTML</code> with <code>document.write()</code> to complete extermination.';" value="exterminate"/>
me!
<p id="output1"></p>
document.write()
可以在浏览器解析页面时在页面加载期间调用。解析/加载页面后,调用此函数还将调用document.open()
,这会擦除页面并从头开始。我想不出任何原因在页面加载期间不使用该功能,除了与您在其他时间向页面添加内容的方式保持一致之外。浏览器完成文档解析后,文档将立即关闭。
document.write()
是页面加载后使用起来较慢,因为它必须清除文档,然后在每次调用该函数时重新打开它。.innerHTML
不会执行任何操作,因此我可以肯定我读到它毕竟更快。我将寻找一个来源来支持这一点。我相信document.write()
如果您在页面已打开的情况下使用它会很快。
这是应该就地替换document.write的代码:
document.write=function(s){
var scripts = document.getElementsByTagName('script');
var lastScript = scripts[scripts.length-1];
lastScript.insertAdjacentHTML("beforebegin", s);
}
您可以结合使用insertAdjacentHTML方法和document.currentScript属性。
insertAdjacentHTML()
Element接口的方法将指定的文本解析为HTML或XML,并将结果节点插入DOM树中的指定位置:
'beforebegin'
:元素本身之前。'afterbegin'
:在元素内,在其第一个子元素之前。'beforeend'
:在元素的最后一个子元素之后。'afterend'
:元素本身之后。该document.currentScript
属性返回<script>
当前正在处理其脚本的元素。最佳位置是在开始之前-新的HTML会在<script>
其自身之前插入。为了匹配document.write
的本机行为,可以将文本放置在afterend后面,但是连续调用该函数的节点的放置顺序与您调用它们的顺序不同(就像document.write
这样),但是相反。HTML的显示顺序可能比它们相对于<script>
标记的放置位置更为重要,因此要使用beforebegin。
document.currentScript.insertAdjacentHTML(
'beforebegin',
'This is a document.write alternative'
)
问题取决于您实际要做什么。
通常,使用而不是document.write
可以使用someElement.innerHTML
或更佳document.createElement
的选择someElement.appendChild
。
您还可以考虑使用类似jQuery的库并在其中使用修改功能:http : //api.jquery.com/category/manipulation/
这可能是最正确,直接的替代方法:insertAdjacentHTML。
尝试使用getElementById()或getElementsByName()访问特定元素,然后使用innerHTML属性:
<html>
<body>
<div id="myDiv1"></div>
<div id="myDiv2"></div>
</body>
<script type="text/javascript">
var myDiv1 = document.getElementById("myDiv1");
var myDiv2 = document.getElementById("myDiv2");
myDiv1.innerHTML = "<b>Content of 1st DIV</b>";
myDiv2.innerHTML = "<i>Content of second DIV element</i>";
</script>
</html>
<\/b>
脚本中的<body>标签吗?
我看不到的问题document.write
。如果您想在onload
事件触发之前使用它(例如,大概是要从结构化数据中构建元素),则它是适合使用的工具。insertAdjacentHTML
在DOM构建之后使用或显式添加节点到DOM并没有性能优势。我只是用一个旧脚本对它进行了三种不同的测试,我曾经使用该脚本在4个调制解调器的银行中为24/7服务安排传入的调制解调器呼叫。
到完成时,此脚本将创建3000多个DOM节点,主要是表单元。在运行Vista的Firefox上使用7年的旧PC上,使用document.write
本地12kb源文件和三个1px GIF(可重复使用约2000次)的时间不到2秒。该页面会弹出,显示完整的状态,可以处理事件。
使用insertAdjacentHTML
不是直接替代方法,因为浏览器会关闭脚本需要保持打开状态的标签,并且最终需要花费两倍的时间来创建一个变形的页面。将所有片段insertAdjacentHTML
写成字符串,然后传递给它花费的时间甚至更长,但是至少您可以按设计获得页面。其他选项(例如一次手动重新构建一个节点的DOM)是如此荒谬,以至于我什至不去。
有时document.write
是要使用的东西。它是JavaScript中最古老的方法之一,这一事实并不是要反对它,而是要支持它-它是经过高度优化的代码,它完全符合其意图并自诞生以来就一直在做。
很高兴知道还有其他可供选择的后加载方法,但是必须理解,这些方法完全旨在用于不同的目的。即在创建DOM并为其分配内存后修改DOM。如果您的脚本旨在编写HTML,而浏览器首先从中创建DOM,则使用这些方法本质上会占用更多资源。
只需编写它,然后让浏览器和解释器完成工作即可。那就是他们的目的。
PS:我只是使用测试onload
在参数body
标签,甚至在这一点上的文档仍然是open
和document.write()
发挥预期的作用。另外,最新版本的Firefox中的各种方法之间也没有明显的性能差异。当然,在硬件/软件堆栈中的某处可能有大量的缓存,但这确实是要点-让机器完成工作。不过,这在廉价智能手机上可能会有所作为。干杯!
print()
决定解决window.print()
。