document.write()方法可以向HTML输出流中插入你传入的内容,浏览器会按着HTML元素依次顺序依次解析它们,并显示出来。
需要注意的是,如果在文档加载完成后(即HTML输出已完成),再使用document.write()方法来要求浏览器来解析你的内容,
则浏览器就会重写整个document,导致最后的这个document.write()方法输出的内容会覆盖之前所有的内容。
不信你试试下面这行代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
document.write('我被写入了HTML输出流,但被下面的覆盖了');
window.onload = function(){
document.write('是的,被我覆盖了');
}
</script>
</body>
</html>
这是因为当页面加载完成后,就会触发window.onload事件,然后调用document.write()方法,使之前的内容被覆盖。(原笔记此处附有一张运行截图,已不可用)
补充
补充:document.write() 在文档加载阶段(DOM 未构造完)调用时,会把字符串当作 HTML 插入到当前位置;在文档加载完成后再调用,会清空整个文档并写入新内容(隐式调用 document.open())。常见用途与注意事项:
- 仅适合演示、调试或某些同步 SSR 场景;
- 在现代 SPA 中几乎不用,因为它会阻塞解析、无法与框架配合;
- 第三方脚本如果同步调用,会显著拖慢首屏渲染;
- 等价物:
el.insertAdjacentHTML('beforeend', html)或操作 DOM API 更可控。
<!-- 推荐做法:使用 DOM API 动态插入 -->
<div id="container"></div>
<script>
document.getElementById('container').insertAdjacentHTML('beforeend', '<p>Hello</p>')
</script>
来源整理自:vue3js.cn 面试官系列



