document.write()覆盖文档?

时间:2013-11-12 23:09:13

标签: javascript html xmlhttprequest document.write

此:

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

在html中调用如:

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

将字符串sup添加到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中运行时,它只显示字符串sup(这是页面的全部内容),但页面似乎仍在加载(FF的加载图标仍然存在动画,显然是无限的)。 / p>

首先,这将仅在本地,离线使用,作为一种快速而方便的数据呈现方式(使用html + js和web浏览器而不是播放文本文件)。我想要的是加载本地文本文件,然后将其一些内容作为html页面的一部分。与我的第一个示例相同,但首先加载文本文件。

2 个答案:

答案 0 :(得分:25)

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

您要做的是设置特定元素的innerHtml,例如:

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

答案 1 :(得分:20)

让我们回顾一下浏览器在收到html文件时所做的事情。

  1. 打开窗口文档进行写入。想象一下打开一个文本文件。
  2. 浏览器将内容写入文档。在这一步中发生了很多魔法 - 对象被创建并且html呈现为框。
  3. 窗口文档关闭文档。有点像保存文本文件。
  4. 现在,现代浏览器还公开了一个文档API,允许您使用javascript完成这些任务。

    您可以使用document.open()打开要写入的文档。您还可以使用document.write()开始将内容写入文档。最后,您可以使用document.close()关闭文档以进行编写。由于在您编写之前始终需要打开文档来编写,因此调用document.write()始终会导致隐式document.open()

    在整个html体内散布document.write()次调用是一种常用的技术,用于将字符串内容动态插入到html页面中。

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

    1. 打开文档进行编写。
    2. 开始将html内容写入文档。
      • JavaScript引擎在遇到它时会执行document.write(),然后将"<p>holla</p>"写入文档中的特定行,就像字符串已经是html文件的一部分一样!由于document.write()在解析html文件期间被称为,因此它只会被解析为页面的一部分。
    3. 关闭要写入的文档。解析完成。
    4. 如果您使用document.write()的方式,那就不足为奇了。相反,您在解析html 之后调用document.write()

      那么您认为应该怎么做?

      正如我之前提到的,需要在将文档写入之前打开文档进行写入。理论上,我们可以附加到现有内容或仅覆盖它。好吧,如果我们附加到内容,我们最终会得到一个无效的html页面,因为新值会出现在结束标记之后。因此,更明智的行为是覆盖内容,而这正是发生的事情。