为什么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所有元素。 在这种情况下,您在使用body
的head
部分有一些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中:
将您的逻辑
DOMContentLoaded
在DOMContentLoaded
的事件侦听器中。这样做,callback将在
body
元素加载时执行。document.addEventListener('DOMContentLoaded', function () { // ... // Place code here. // ... });
根据您的需要,您可以select将
load
事件侦听器附加到window
对象:window.addEventListener('load', function () { // ... // Place code here. // ... });
有关
DOMContentLoaded
与load
事件之间的区别, 请参阅此问题 。 -
移动
<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);