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文件时的行为。
- 窗口文档打开写入。 想象一下打开一个文本文件。
- 浏览器将内容写入文档。 在这一步发生了很多魔术 – 对象被创build,html呈现为框。
- 窗口文档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文件后执行以下操作。
- 打开文档进行写作。
- 开始将html内容写入文档。
- 当JavaScript引擎遇到它时,它将执行
document.write()
,然后在文档的特定行中写入"<p>holla</p>"
,就好像string已经是html文件的一部分! 由于document.write()
在parsinghtml文件的过程中被调用,它只是作为页面的一部分被parsing。
- 当JavaScript引擎遇到它时,它将执行
- closures要写入的文档。 parsing完成。
如果这是你如何使用document.write()
,那就不会有什么意外了。 而是在htmlparsing之后调用document.write()
。
那么你认为应该发生什么?
正如我之前提到的, 一个文件在写入之前需要打开才能写入 。 理论上,我们可以追加到现有的内容或只是覆盖它。 那么,如果我们追加内容,我们将最终得到一个无效的HTML页面,因为新值将出现在结束标记之后。 所以更明智的行为是覆盖内容,这正是发生的事情。