为什么document.body在我的javascript中为null
Why is document.body null in my javascript?
这是我简短的HTML文档。
为什么Chrome控制台注意到这个错误:
"未捕获的类型错误:无法调用
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之前,您需要创建所有元素。在本例中,head
部分中有一些使用body
的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 Load回调中包装代码:
在
DOMContentLoaded
的事件监听器中封装您的逻辑。这样,回调将在加载
body
元素时执行。document.addEventListener('DOMContentLoaded', function () { // ... // Place code here. // ... });
根据您的需要,您也可以将
load
事件侦听器附加到window
对象:window.addEventListener('load', function () { // ... // Place code here. // ... });
有关
DOMContentLoaded
和load
事件之间的差异,请参阅此问题。 -
移动
<script>
元素的位置,最后加载JavaScript:现在,您的
<script>
元素正在文档的<head>
元素中加载。这意味着它将在body
加载之前执行。谷歌开发人员建议将<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事件中。接受的答案正确地显示了这一点,然而,该答案以及撰写本文时的所有其他答案也建议将脚本标记放在结束正文标记之后。
这不是有效的html。然而,它会导致您的代码工作,因为浏览器太善良了;)
查看此答案了解更多信息将<脚本>标记在<身体>标签
因此否决了其他答案。
或添加此部分
<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>
您需要将文件的<script src="...">...</script>
放在body标签的末尾处:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>you can see this</title>
//-------------------------*** not here ***---------------------
</head>
<body>
<div class="container">
<div class="no">this is my dummy div1</div>
<div class="no">this is my dummy div2</div>
<div class="no">this is my dummy div2</div>
<div class="no">this is my dummy div2</div>
</div>
//-------------------------*** here ***---------------------
<script src="...js">...</script>
</body>
</html>
Browser从上到下解析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>
document.body
在代码运行时还不可用。
你可以做什么:
var docBody=document.getElementsByTagName("body")[0];
docBody.appendChild(mySpan);
- 正则表达式,用于在 JavaScript 中为电话号码添加短划线
- 在Javascript中为if/else语句添加OR
- 无法设置属性'innerHTML'在javascript中为null
- 如何在javascript中为全局变量赋值
- 在JavaScript中为true==1和false==0
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- JavaScript中为负零
- 在JavaScript中为表单元素生成键值对
- 如何在Javascript中为不同的页面访问存储变量
- 如何在 javascript 中为字符串中的数字添加下划线
- 在 JavaScript 中为其添加动画效果时更改图像颜色
- 如何在 javascript 中为没有值的标签选择属性
- 为什么不't空字符串==在JavaScript中为null
- 如何在JavaScript中为ENTER事件充值
- 如何在JavaScript中为Google闭包编译器设置参数类型
- 如何在JavaScript中为任何对象实现事件侦听器
- 如何在javascript中为动画制作一个ease函数
- 如何在javascript中为两个数组的每个循环使用一个
- 有没有一种方法可以在javascript中为文本节点添加属性
- 为什么{}=={}在JavaScript中为false