You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

document.write()在<head>中异常,如何实现Text 11的完整输出?

问题分析与解决方案

你遇到的核心问题是页面加载完成后调用document.write()会覆盖整个文档,这也是为什么你只能看到11而看不到Text的原因——当你点击按钮触发myFunction时,页面已经完全加载完毕,浏览器已经关闭了初始的文档流,这时候调用document.write()会清空所有现有HTML内容,包括你原来的<p id="demo">元素,自然就看不到设置的Text了。

另外你提到在<head>里放脚本会有问题,这是因为脚本执行时<body>还没被解析,document.getElementById("demo")找不到对应的元素,不过这不是你当前输出问题的关键。

解决方法(推荐):用DOM操作替代document.write()

现代前端开发中几乎不会用document.write()来动态添加内容,更安全可靠的方式是直接操作DOM元素:

方案1:直接修改目标元素的innerHTML

把结果直接拼接到demo元素的内容里,最简单直接:

<html>
<head>
  <title>Output</title>
  <script>
    function myFunction() {
      // 直接把Text和计算结果合并到innerHTML中
      document.getElementById("demo").innerHTML = "Text " + (5 + 6);
    }
  </script>
</head>
<body>
  <p id="demo">
    <button onclick="myFunction()">Touch me</button>
  </p>
</body>
</html>

方案2:创建新元素追加到页面

如果需要分开添加内容(比如后续要对计算结果做样式处理),可以创建新元素再插入:

<html>
<head>
  <title>Output</title>
  <script>
    function myFunction() {
      const demoEl = document.getElementById("demo");
      // 设置Text内容
      demoEl.innerHTML = "Text";
      // 创建一个新的span元素存放计算结果
      const resultEl = document.createElement('span');
      resultEl.textContent = ' ' + (5 + 6);
      // 把结果元素追加到demo元素里
      demoEl.appendChild(resultEl);
    }
  </script>
</head>
<body>
  <p id="demo">
    <button onclick="myFunction()">Touch me</button>
  </p>
</body>
</html>

为什么document.write()会导致这个问题?

简单来说:

  • 当页面正在加载时(比如脚本放在<body>里执行),document.write()会把内容插入到当前文档流中,不会覆盖现有内容;
  • 但页面加载完成后,document.write()会自动调用document.open(),这会清空当前文档的所有内容,然后写入新内容,写完后还会调用document.close(),所以你原来的页面结构就没了。

所以除非是在页面初始化加载时动态写入内容,否则绝对不要用document.write()

内容的提问来源于stack exchange,提问作者B_man

火山引擎 最新活动