我正在从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>
)
要查看从脚本中的不同点加载不同的部分是否会改变效果,并且没有任何反应。
我想知道在继续上课之前究竟发生了什么,所以如果有人能够简单地给我一个如何运作的简要总结,我会很感激。
答案 0 :(得分:1)
如果您熟悉一般编程,那么您将了解stream
,它代表您可以连续阅读或写入的内容,并且(通常)缺少随机访问。
想象一下,document
对象包含一个隐藏在其中的流,该流表示来自Web服务器的原始文本响应,该响应由HTML文本组成。方法document.open()
授予对此流的访问权。
当加载页面时(正如服务器中的字节到达浏览器一样),文档流已经打开并正在读取/写入。当文档加载完毕(即HTML本身,而不是<img />
等外部资源)时,流将被关闭。
...这就是为什么在页面加载时使用document.write
的原因(即<script>document.write("foo");</script>
它将文本“foo”直接插入到文档流中,而调用document.write
< em>在文件加载后导致流(从内部)重新打开(隐式),导致它被覆盖。
答案 1 :(得分:0)
取决于您使用的浏览器,会发生什么。直到最近,您的代码将在所有浏览器中使用文本替换页面,但最近在某些浏览器中实现已更改为忽略document.write
调用,而不是先隐式调用document.open
如果尚未调用document.write
已经打电话了。
您可以在加载页面后使用document.open
替换所有浏览器中的页面,但是您必须以正确的方式执行此操作,即首先调用{{1}}。