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

JavaScript中innerHTML无法赋值:如何在body内将随机色码显示到SPAN

问题原因与解决方案

你遇到的核心问题很明确:当你的JavaScript代码执行时,目标<span>元素还没被浏览器解析出来。浏览器是从上到下逐行解析HTML的,你的脚本写在<span>前面,运行时DOM里还没有这个元素,document.getElementById自然返回null,也就没法设置它的内容了。

下面是几种能让脚本留在<body>内同时正常工作的方法:

方法1:把脚本移到<span>元素之后

这是最简单直接的方式,让浏览器先解析完目标元素再执行脚本:

<body>
  <div class="container">
    <span id="hexRandomColor"></span>
  </div>
  <script type="text/javascript">
    var randomColor = Math.floor(Math.random() * 16777215).toString(16);
    randomColor = "#" + ("000000" + randomColor).slice(-6);
    document.bgColor = randomColor;
    document.getElementById("hexRandomColor").innerHTML = randomColor;
  </script>
</body>

方法2:监听DOMContentLoaded事件

通过这个事件,让脚本等整个DOM结构加载完成后再执行,这样不管脚本放在<body>的哪个位置都能正常工作:

<body>
  <script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function() {
      var randomColor = Math.floor(Math.random() * 16777215).toString(16);
      randomColor = "#" + ("000000" + randomColor).slice(-6);
      document.bgColor = randomColor;
      document.getElementById("hexRandomColor").innerHTML = randomColor;
    });
  </script>
  <div class="container">
    <span id="hexRandomColor"></span>
  </div>
</body>

DOMContentLoaded事件会在浏览器完成所有HTML解析、构建好DOM树后触发,此时所有元素都已经可以被JavaScript访问了。

方法3:给<script>标签添加defer属性

defer属性会告诉浏览器:先继续解析HTML,等DOM构建完成后再执行这个脚本。脚本的加载是异步的,但执行顺序会保持和它们在HTML中的顺序一致:

<body>
  <script type="text/javascript" defer>
    var randomColor = Math.floor(Math.random() * 16777215).toString(16);
    randomColor = "#" + ("000000" + randomColor).slice(-6);
    document.bgColor = randomColor;
    document.getElementById("hexRandomColor").innerHTML = randomColor;
  </script>
  <div class="container">
    <span id="hexRandomColor"></span>
  </div>
</body>

这三种方法都能解决你的问题,你可以根据自己的需求选择最适合的方式~

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

火山引擎 最新活动