为什么document.body null在我的JavaScript?

这是我简短的HTML文档。

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

“Uncaught TypeError:不能调用方法' null '的方法'appendChild'?

 <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> 

目前还没有确定机构的定义。 一般来说,在执行使用这些元素的javascript之前,您需要创build所有元素。 在这种情况下,您在使用bodyhead部分有一些javascript。 不爽。

你想把这个代码包装在一个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> 

看演示 。

body元素甚至被加载之前,脚本正在被执行。

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

  • 将代码包装在DOM Loadcallback中:

    将您的逻辑DOMContentLoadedDOMContentLoaded的事件侦听器中。

    这样做,callback将在body元素加载时执行。

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

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

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

    有关DOMContentLoadedload事件之间的区别, 请参阅此问题 。

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

    现在,你的<script>元素被加载到文档的<head>元素中。 这意味着它将在body加载之前执行。 Google开发人员build议将<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> 

将您的代码添加到onload事件。 被接受的答案正确地表明了这一点,但是在撰写本文的时候,这个答案以及所有其他答案也build议把脚本标签放在closures的身体标签之后。

这是无效的HTML。 但是,它会导致你的代码工作,因为浏览器太仁慈了;)

请参阅此答案以获取更多信息将<script>标记放在</ body>标记之后是错误的吗?

由于这个原因downvoted其他答案。

或者添加这个部分

 <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> 

浏览器从上到下parsing你的html,你的脚本在body加载之前运行。 修正放在身后的脚本。

  <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> 

代码运行时, document.body还不可用。

你可以做什么,而不是:

 var docBody=document.getElementsByTagName("body")[0]; docBody.appendChild(mySpan);