0

我正在从 w3schools 学习 JavaScript,它谈到“如果在文档加载完成后执行 document.write,整个 HTML 页面将被覆盖”,我从示例中看到这确实发生了,但是“我不明白到底发生了什么,网站似乎跳过了解释。我已经移动了部分脚本(

<h1>My First Web Page</h1>

<p>My First Paragraph</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction()
{
document.write("Oops! The document disappeared!");
}
</script>

</body>
</html>

)

看看从脚本的不同点加载不同的部分会不会改变效果,结果什么也没发生。

在我继续上课之前,我想知道到底发生了什么,所以如果有人能简单地给我一个关于它是如何工作的简要总结,我将不胜感激。

4

2 回答 2

1

如果您对一般编程很熟悉,那么您就会知道streams,它表示您可以以连续方式读取或写入的内容,并且(通常)缺乏随机访问。

想象一下,该document对象包含一个隐藏在其中的流,该流表示来自网络服务器的原始文本响应,该响应由 HTML 文本组成。该方法document.open()授予对此流的访问权限。

当页面被加载时(当来自服务器的字节到达您的浏览器时)文档流已经打开并且正在被读取/写入。当文档完成加载(即 HTML 本身,而不是外部资源<img />)时,流将关闭。

...这就是为什么在document.write页面加载时使用 when (即,因为<script>document.write("foo");</script>它将文本“foo”直接插入到文档流中,而在文档加载document.write 调用会导致流从头开始(隐式)重新打开,这会导致它被覆盖。

于 2013-08-29T00:26:05.593 回答
0

会发生什么取决于您使用的浏览器。直到最近,您的代码将在所有浏览器中用文本替换页面,但最近在某些浏览器中实现已更改为简单地忽略调用,而不是在尚未调用时先document.write隐式调用。document.open

您仍然可以document.write在页面加载后在所有浏览器中替换页面,但是您必须以正确的方式进行操作,即document.open先调用。

于 2013-08-29T00:24:29.043 回答