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 面试官系列