这是我的简短HTML文档。
为什么Chrome控制台会注意到此错误:
“未捕获的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>
答案 0 :(得分:146)
此时尚未确定身体。通常,您希望在执行使用这些元素的javascript之前创建所有元素。在这种情况下,您在使用head
的{{1}}部分中有一些javascript。不酷。
您希望将此代码包装在body
处理程序中,或将其放在<{strong> window.onload
标记之后(如e-bacho 2.0所述)。
<body>
答案 1 :(得分:23)
在body
元素加载之前,您的脚本正在执行。
有几种方法可以解决这个问题。
将您的逻辑包含在DOMContentLoaded
的事件监听器中。
这样做时,将在加载body
元素时执行回调。
document.addEventListener('DOMContentLoaded', function () {
// ...
// Place code here.
// ...
});
根据您的需要,您也可以将load
事件监听器附加到window
对象:
window.addEventListener('load', function () {
// ...
// Place code here.
// ...
});
对于DOMContentLoaded
和load
事件之间的差异,see this question。
<script>
元素的位置,最后加载JavaScript:现在,您的<script>
元素正在文档的<head>
元素中加载。这意味着它将在body
加载之前执行。 Google developers建议将<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>
答案 2 :(得分:8)
将您的代码添加到onload事件中。接受的答案正确地显示了这一点,但是在撰写本文时,答案以及所有其他答案也建议将脚本标记放在结束标记之后,。
这不是有效的HTML。但是它会导致你的代码工作,因为浏览器太友善了;)
有关详细信息,请参阅此答案 Is it wrong to place the <script> tag after the </body> tag?
出于这个原因,他们给出了其他答案。
答案 3 :(得分:4)
或添加此部分
<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>
答案 4 :(得分:1)
浏览器从上到下解析你的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>
答案 5 :(得分:0)
document.body
尚未可用。
你能做什么呢?
var docBody=document.getElementsByTagName("body")[0];
docBody.appendChild(mySpan);