document.write()覆盖文档?

这个:

function myFunction() { document.write("sup"); } 

在html中调用如下所示:

 <div id="myDiv"> <script>myFunction();</script> </div>t 

将一个stringsup添加到myDiv div元素。 这正是我想要的。 但是,这个:

 function loadFile(uri) { var r = new XMLHttpRequest(); document.write("trying to open: " + uri); r.open('GET', uri, true); r.send(null); r.onreadystatechange = function() { if (r.readyState == 4) { myFunction(); } } } function myFunction() { document.write("sup"); } 

这样调用:

 <div id="myDiv"> <script>loadFile("filename.txt");</script> </div> 

似乎是覆盖我的整个HTML文件。 也就是说,当我在Firefox中运行时,它只显示stringsup (这是页面的全部内容),但页面似乎仍在加载(FF的加载图标仍然存在animation,显然是无限的)。

首先,这只能在本地,离线使用,作为呈现数据(使用html + js和web浏览器代替文本文件)的快捷方式。 我想要的是加载本地文本文件,然后把它的一些内容作为html页面的一部分。 与我的第一个示例相同,但首先加载文本文件。

问题是,当文档加载后运行document.write时,它会覆盖整个文档。 如果在此之前运行,它不覆盖它。

你想要做的是设置一个特定元素的innerHtml,如下所示:

 document.getElementById("myDiv").innerHTML="Sup"; 

让我们看看浏览器在接收到一个html文件时的行为。

  1. 窗口文档打开写入。 想象一下打开一个文本文件。
  2. 浏览器将内容写入文档。 在这一步发生了很多魔术 – 对象被创build,html呈现为框。
  3. 窗口文档closures文档。 有点像保存文本文件。

现在,现代浏览器还公开了一个文档API,允许您使用JavaScript完成这些任务。

您可以使用document.open()打开文档进行书写。 您也可以使用document.write()开始将内容写入document.write() 。 最后,您可以closures文档以使用document.close()进行书写。 由于文档在编写之前总是需要打开才能写入,所以调用document.write()总是会产生一个隐式的document.open()

在整个HTML体内分散document.write()调用是一种常用的技术,用于将string内容dynamic插入html页面。

例如,如果您在html文件的主体中执行document.write("<p>holla</p>") ,则浏览器将在接收到html文件后执行以下操作。

  1. 打开文档进行写作。
  2. 开始将html内容写入文档。
    • 当JavaScript引擎遇到它时,它将执行document.write() ,然后在文档的特定行中写入"<p>holla</p>" ,就好像string已经是html文件的一部分! 由于document.write() parsinghtml文件的过程中被调用,它只是作为页面的一部分被parsing。
  3. closures要写入的文档。 parsing完成。

如果这是你如何使用document.write() ,那就不会有什么意外了。 而是在htmlparsing之后调用document.write()

那么你认为应该发生什么?

正如我之前提到的, 一个文件在写入之前需要打开才能写入 。 理论上,我们可以追加到现有的内容或只是覆盖它。 那么,如果我们追加内容,我们将最终得到一个无效的HTML页面,因为新值将出现在结束标记之后。 所以更明智的行为是覆盖内容,这正是发生的事情。