增加HTML元素
JavaScript脚本可以为DOM动态增加节点,程序为DOM树增加节点时,页面会动态地增加HTML元素。当需要为页面增加HTML元素时,应按如下两个步骤操作。
(1)创建或复制节点。
(2)添加节点。
创建或复制节点
创建节点通常借助于document对象的createElement方法来实现,语法如下。
➢ document.createElement(Tag):创建Tag标签对应的节点。
例子
<script type="text/javascript">
// 创建一个新节点
var a = document.createElement("div");
// 使用警告对话框输出节点
alert(a);
</script>
注意
调用document.createElement()方法时,传入的参数必须是一个合法的HTML标签。
创建一个节点的开销可能过大,实际上我们还可复制一个已有的节点,复制已有节点的系统开销略小。通过调用Node的cloneNode()方法即可复制一个已有节点,该方法的语法格式如下。
➢ Node cloneNode(boolean deep):复制当前节点。当deep为true时,表示在复制当前节点的同时,复制该节点的全部后代节点;当deep为false时,表示仅复制当前节点。
例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title> 复制节点 </title>
</head>
<body>
<ul id = "d">
<li>疯狂Java讲义</li>
</ul>
<script type="text/javascript">
// 获取ID为d的节点
var ul = document.getElementById("d");
// 复制ul的第二个子节点(不复制当前节点的后代节点)
var ajax = ul.firstChild.nextSibling.cloneNode(false);
// 修改被复制的节点
ajax.innerHTML = "疯狂Ajax讲义";
// 将复制的节点添加到页面中
ul.appendChild(ajax);
</script>
</body>
</html>
添加节点
当一个节点创建成功后,一定要将该节点添加到DOM中才行。对于普通的节点,可采用Node对象的如下方法来添加节点。
➢ appendChild(Node newNode):将newNode添加成当前节点的最后一个子节点。
➢ insertBefore(Node newNode, Node refNode):在refNode节点之前插入newNode节点。
➢ replaceChild(Node newChild, Node oldChild):将oldChild节点替换成newChild节点。
在前面已经看到了appendChild()方法的用法,下面仅对该代码进行简单修改,将原有的appendChild()修改成insertBefore(),修改后的关键代码如下。
例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title> 复制节点 </title>
</head>
<body>
<ul id = "d">
<li>疯狂Java讲义</li>
</ul>
<script type="text/javascript">
// 获取ID为d的节点
var ul = document.getElementById("d");
// 复制ul的第二个子节点(不复制当前节点的后代节点)
var ajax = ul.firstChild.nextSibling.cloneNode(false);
// 修改被复制的节点
ajax.innerHTML = "疯狂Ajax讲义";
// 将复制的节点添加到页面中
ul.insertBefore(ajax , ul.firstChild);
</script>
</body>
</html>
为列表框、下拉菜单添加选项
为列表框、下拉菜单添加子节点,也就是为列表框、下拉菜单添加选项。添加选项有两种方法:
➢ 调用HTMLSelectElement的add()方法添加选项。
➢ 直接为<select.../>
的指定选项赋值。
HTMLSelectElement包含如下方法用于添加新选项。
➢ add(HTMLOptionElement option, HTMLOptionElement before):在before选项之前添加option选项。如果想将option选项添加在最后,则将before指定为null即可;或者依然使用之前介绍的appendChild(option)添加亦可。
例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title> 添加选项 </title>
</head>
<body id="test">
<script type="text/javascript">
// 创建<select.../>对象
var a = document.createElement("select");
// 为<select.../>对象增加10个选项
for (var i = 0 ; i < 10 ; i++)
{
// 创建一个<option.../>元素
var op = document.createElement("option");
op.innerHTML = '新增的选项' + i;
// 将新的选项添加到列表框的最后
a.add(op , null);
}
// 设置列表框高度为5
a.size = 5;
// 将列表框增加成body元素的子节点
document.getElementById("test").appendChild(a);
</script>
</body>
</html>
注意
上面的页面程序在Internet Explorer 8中将出现错误,主要是因为它不允许调用add()方法时指定最后一个参数为null。为了避免这种情况,我们可使用直接为指定选项赋值的方法来添加选项。
为指定选项赋值所支持的值必须是一个有效的选项,创建选项除了可使用前面所示的createElement()方法之外,还可使用如下构造器。
new Option(text, value, defaultSelected, selected)
该构造器有4个参数,这4个参数说明如下。
➢ text:该选项的文本,即该选项所呈现的“内容”。
➢ value:选中该选项的值。
➢ defaultSelected:设置默认是否选中该选项。
➢ selected:设置该选项当前是否被选中。
并不是每次构造该选项都需要指定4个参数,也可以只指定一个参数或者两个参数。如果构造Option对象时只指定了一个参数,则该参数是Option的text值;如果指定了两个参数,则第一个参数是text,第二个参数是value。
例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title> 添加选项 </title>
</head>
<body id="test">
<script type="text/javascript">
// 创建<select.../>对象
var a = document.createElement("select");
// 为<select.../>对象增加10个选项
for (var i = 0 ; i < 10 ; i++)
{
// 创建一个<option.../>元素
var op = new Option('新增的选项' + i , i);
// 直接为指定选项赋值
a.options[i] = op;
}
// 设置列表框高度为5
a.size = 5;
// 将列表框增加成body元素的子节点
document.getElementById("test").appendChild(a);
</script>
</body>
</html>
动态添加表格内容
表格元素、表格行则另有添加子元素的方法。实际上,它们可以在添加子元素的同时创建这些子元素。也就是说,添加表格子元素时,往往无须使用document的createElement()方法来创建节点。
HTMLTableElement对象有如下方法。
➢ insertRow(index):在index处插入一行。返回新创建的HTMLTableRowElement。
➢ createCaption():为该表格创建标题。返回新创建的HTMLTableCaptionElement。如果该表格已有标题,则返回已有的标题对象。
➢ createTFoot():为该表格创建
➢ createTHead():为该表格创建
HTMLTableRowElement对象代表表格行,该对象包含如下方法用于插入单元格。
➢ insertCell(long index):在index处创建一个单元格,返回新创建的单元格。
例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title> 添加表格 </title>
</head>
<body id="test">
<script type="text/javascript">
// 创建一个表格对象
var a = document.createElement("table");
// 设置表格的边框为1
a.border=1;
var caption = a.createCaption();
caption.innerHTML = "表格标题";
// 为表格循环插入5行
for (var i = 0 ; i < 5 ; i++)
{
// 插入行
var tr = a.insertRow(i);
// 为每行循环插入7列
for (var j = 0 ; j < 7 ; j++)
{
// 循环插入7列
var td = tr.insertCell(j);
// 设置每个单元格的内容
td.innerHTML = "单元格内容 " + i + j;
}
}
//将表格元素添加到HTML文档内
document.getElementById("test").appendChild(a);
</script>
</body>
</html>
注:本博客内容节选自李刚编著的疯狂HTML 5/CSS 3/JavaScript讲义 ,详细内容请参阅书籍。