为什么我的 javascript 中的 document.body 为 null?

IT技术 javascript google-chrome
2021-02-17 12:48:30

这是我的简短 HTML 文档。

为什么 Chrome 控制台会注意到这个错误:

“未捕获的类型错误:无法调用“的方法‘appendChild’ null

<html>
<head>
    <title>Javascript Tests</title>

    <script type="text/javascript">

        var mySpan = document.createElement("span");
        mySpan.innerHTML = "This is my span!";

        mySpan.style.color = "red";
        document.body.appendChild(mySpan);

        alert("Why does the span change after this alert? Not before?");

    </script>
</head>
<body>

</body>
</html>
6个回答

此时身体还没有被定义。通常,您希望在执行使用这些元素的 javascript 之前创建所有元素。在这种情况下,您在head使用body. 不酷。

你想在一个包装这个代码window.onload处理程序或将其放置<body>标签(如提到的e-bacho 2.0)。

<head>
    <title>Javascript Tests</title>

    <script type="text/javascript">
      window.onload = function() {
        var mySpan = document.createElement("span");
        mySpan.innerHTML = "This is my span!";

        mySpan.style.color = "red";
        document.body.appendChild(mySpan);

        alert("Why does the span change after this alert? Not before?");
      }

    </script>
</head>

见演示

如果您不想覆盖另一个文件中定义的现有加载怎么办?
2021-04-21 12:48:30
页面从上到下读取,并在此过程中执行 javascript。您在head正在执行部分中有一些 javascript 但是body部分 html 可能还没有下载。或者它已下载,但此时仍未评估。所以它不存在于 DOM 中。
2021-04-23 12:48:30
@TomBrito:“还是把它之后<body>标签”
2021-04-26 12:48:30
有点晚了,但也可以使用 addEventListener 将侦听器附加到窗口,而不替换现有的。
2021-05-03 12:48:30
谢谢,什么意思?我没有身体标签吗?
2021-05-05 12:48:30

您的脚本在body元素加载之前正在执行

有几种方法可以解决此问题。

  • 将您的代码包装在 DOM Load 回调中:

    将您的逻辑包装在事件侦听器中DOMContentLoaded

    这样做时,回调将在body元素加载时执行

    document.addEventListener('DOMContentLoaded', function () {
        // ...
        // Place code here.
        // ...
    });
    

    根据您的需要,您也可以将load事件侦听器附加window对象:

    window.addEventListener('load', function () {
        // ...
        // Place code here.
        // ...
    });
    

    有关 theDOMContentLoadedloadevents之间的区别请参阅此问题

  • 移动<script>元素的位置,最后加载 JavaScript:

    现在,您的<script>元素正在加载到<head>文档元素中。这意味着它将在body加载之前执行Google 开发人员建议将<script>标记移至页面末尾,以便在处理 JavaScript 之前呈现所有 HTML 内容。

    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
      <p>Some paragraph</p>
      <!-- End of HTML content in the body tag -->
    
      <script>
        <!-- Place your script tags here. -->
      </script>
    </body>
    </html>
    
我认为这比公认的答案更彻底和最新。
2021-05-05 12:48:30

将您的代码添加到 onload 事件。接受的答案正确地显示了这一点,但是该答案以及撰写本文时的所有其他答案也建议将 script 标签放在结束正文标签之后。

这不是有效的 html。但是它会导致您的代码工作,因为浏览器太友好了 ;)

有关详细信息,请参阅此答案 将 <script> 标记放在 </body> 标记之后是否错误?

出于这个原因,对其他答案投了反对票。

或者添加这部分

<script type="text/javascript">

    var mySpan = document.createElement("span");
    mySpan.innerHTML = "This is my span!";

    mySpan.style.color = "red";
    document.body.appendChild(mySpan);

    alert("Why does the span change after this alert? Not before?");

</script>

在 HTML 之后,例如:

    <html>
    <head>...</head>
    <body>...</body>
   <script type="text/javascript">
        var mySpan = document.createElement("span");
        mySpan.innerHTML = "This is my span!";

        mySpan.style.color = "red";
        document.body.appendChild(mySpan);

        alert("Why does the span change after this alert? Not before?");

    </script>

    </html>

浏览器自上而下解析您的 html,您的脚本在加载正文之前运行。修复将脚本放在正文之后。

  <html>
  <head>
       <title> Javascript Tests </title> 
  </head>
 <body>
 </body>
  <script type="text/javascript">

    var mySpan = document.createElement("span");
    mySpan.innerHTML = "This is my span!";

    mySpan.style.color = "red";
    document.body.appendChild(mySpan);

    alert("Why does the span change after this alert? Not before?");

</script>
</html>