在JavaScript中,我们可以使用createElement()来创建一个元素节点,也可以使用createTextNode()来创建一个文本节点,然后可以将元素节点与文本节点“组装”成为我们平常所看到的“有文本内容的元素”。
这种方式又被称为“动态DOM操作”。所谓的“动态DOM”,指的是使用JavaScript创建的元素,这个元素一开始在HTML中是不存在的。
语法:
var e1 = document.createElement("元素名"); //创建元素节点
var txt = document.createTextNode("文本内容"); //创建文本节点
e1.appendChild(txt); //把文本节点插入元素节点中
e2.appendChild(e1); //把组装好的元素插入已存在的元素中
说明:
e1表示JavaScript动态创建的元素节点,txt表示JavaScript动态创建的文本节点,e2表示HTML中已经存在的元素节点。
A.appendChild(B)表示把B插入到A内部中去,也就是使得B成为A的子节点。
举例:创建简单元素(不带属性)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
window.onload = function ()
{
var oDiv = document.getElementById("content");
var oStrong = document.createElement("strong");
var oTxt = document.createTextNode("绿叶学习网");
//将文本节点插入strong元素
oStrong.appendChild(oTxt);
//将strong元素插入div元素(这个div在HTML已经存在)
oDiv.appendChild(oStrong);
}
</script>
</head>
<body>
<div id="content"></div>
</body>
</html>
默认情况下,预览效果如下图所示
而例子的分析如下图所示。
分析:
这里使用document.createElement(“strong”)动态创建了一个strong元素,不过此时strong元素是没有内容的。然后我们使用document.createTextNode()创建了一个文本节点,并且使用appendChild()方法(我们在下一节会介绍)把这个文本节点插入到strong元素中去。最后再使用appendChild()方法把已经创建好的“有内容的strong元素(即< strong>绿叶学习网</strong>)插入到div元素中,这时才会显示出内容来。
有小伙伴就会想,添加一个元素有必要那么麻烦吗?直接像下面这样,在HTML加上不就得了吗?效果都是一样的啊!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div id="content"><strong>绿叶学习网</strong></div>
</body>
</html>
之所以有这个疑问,那是因为小伙伴们还没有真正理解动态创建DOM的意义。其实在HTML中直接添加元素,这是静态方法。而使用JavaScript添加元素,这是动态方法。在实际开发中,使用静态方法是实现不了动画效果的。
绿叶学习网首页中(如下图所示),这些雪花效果就是动态创建的img元素。雪花会不断生成、然后消失,也就是说你要实现img元素的生成和消失。此时,你不可能手动在HTML中直接添加元素,然后删除元素吧?正确的方法就是使用动态DOM,也就是使用JavaScript不断创建元素和删除元素来实现。
操作动态DOM,在实际开发用得非常多。这一章,我们先学一下语法,至于怎么用,后面会慢慢接触。上面例子创建的是一个简单的节点,如果想要创建下面这种带有属性的复杂节点,该怎么做呢?
<input id="submit" type="button" value="提交"/>
举例:创建复杂元素(带属性)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
window.onload = function ()
{
var oInput = document.createElement("input");
oInput.id = "submit";
oInput.type = "button";
oInput.value = "提交";
document.body.appendChild(oInput);
}
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如下图所示。
分析:
在“9.1 DOM是什么”这一节中给大家说过:在DOM中,每一个元素节点都被看成是一个对象。既然是对象,我们就可以像给对象属性赋值那样,给元素的属性进行赋值。例如想给添加一个id属性,就可以这样写:oInput.id = “submit”。想要添加一个type属性,就可以这样写:oInput.type=“button”,以此类推。
下面我们尝试来动态创建一个图片,HTML结构如下:
<img class="pic" src="img/haizei.png" style="border:1px solid silver"/>
举例:动态创建图片
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
window.onload = function ()
{
var oImg = document.createElement("img");
oImg.className = "pic";
oImg.src = "img/haizei.png";
oImg.style.border = "1px solid silver";
document.body.appendChild(oImg);
}
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如下图所示。
分析:
在操作动态DOM时,设置元素class用的是className而不是class,这是初学者最容易忽略的地方。为什么JavaScript不用class,而是用className呢?其实我们在“2.2 常量与变量”这一节讲过,JavaScript有很多关键字和保留字,其中class已经作为保留字(可以回去翻一下),所以就另外起了一个className来用。了解这个背后的故事,以后我们也不容易犯错。
上面创建的都是一个元素,如果想要创建表格这种多个元素的,该怎么办呢?这时我们可以使用循环语句来实现。
举例:创建多个元素
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
table {border-collapse:collapse;}
tr,td
{
width:80px;
height:20px;
border:1px solid gray;
}
</style>
<script>
window.onload = function ()
{
//动态创建表格
var oTable = document.createElement("table");
for (var i = 0; i < 3; i++)
{
var oTr = document.createElement("tr");
for (var j = 0; j < 3; j++)
{
var oTd = document.createElement("td");
oTr.appendChild(oTd);
}
oTable.appendChild(oTr);
}
//添加到body中去
document.body.appendChild(oTable);
}
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如下图所示。
从上面几个例子,我们可以总结一下,如果想要创建一个元素,需要以下4步。
① 创建元素节点:createElement()
② 创建文本节点:createTextNode()
③ 把文本节点插入元素节点:appendChild()
④ 把组装好的元素插入到已有元素中:appendChild()