DOM节点常用方法介绍02
1.替换节点
replaceChild()
把一个给定父元素里的一个子节点替换为另外一个子节点
var reference = element.replaceChild(newChild,oldChild);
返回值是一个指向已被替换的那个子节点的引用指针。
如果被插入的子节点还有子节点,则那些子节点也被插入到目标节点中
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
您喜欢的城市:<br>
<ul>
<li id="bj" value="beijing">北京</li>
<li id="sh" value="shanghai">上海</li>
<li id="cq" value="chongqing"> 重庆</li>
</ul>
您喜欢的游戏:<br>
<ul>
<li id="fk" value="fangkong">反恐<p>xxx</p></li>
<li id="ms" value="moshou">魔兽</li>
<li id="cq" value="chuanqi">传奇</li>
</ul>
<script language="javascript">
//点击北京节点,将被反恐节点替换
//改写北京节点的onclick方法
document.getElementById("bj").οnclick=function(){
//获取反恐节点
var fkElement=document.getElementById("fk");
//获取北京节点的父节点
var bjParentElement=this.parentNode;
//替换(反恐的子节点xxx也过去)
var oldElement=bjParentElement.replaceChild(fkElement,this);
//测试
alert(oldElement.getAttribute("value"));
}
</script>
</body>
</html>
2.查找属性节点
getAttribute()
返回一个给定元素的一个给定属性节点的值
var attributeValue = element.getAttribute(attributeName);
给定属性的名字必须以字符串的形式传递给该方法。
给定属性的值将以字符串的形式返回,如果给定属性不存在,getAttribute() 将返回一个空字符串.
通过属性获取属性节点
getAttributeNode(属性的名称)--Node
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
您喜欢的城市:<br>
<ul>
<li id="bj" value="beijing">北京</li>
<li id="sh" value="shanghai">上海</li>
<li id="cq" value="chongqing">重庆</li>
</ul>
您喜欢的游戏:<br>
<ul>
<li id="fk" value="fangkong">反恐</li>
<li id="ms" value="moshou">魔兽</li>
<li id="xj" value="xingji">星际争霸</li>
</ul>
<script language="javascript">
//获取"星际争霸"节点的value值
var xjElement=document.getElementById("xj");
alert(xjElement.getAttribute("value"));
</script>
</body>
</html>
3.设置属性节点
setAttribute()
将给定元素节点添加一个新的属性值或改变它的现有属性的值。
element.setAttribute(attributeName,attributeValue);
属性的名字和值必须以字符串的形式传递给此方法
如果这个属性已经存在,它的值将被刷新;
如果不存在,setAttribute()方法将先创建它再为其赋值。
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
您喜欢的城市:<br>
<ul>
<li id="bj" value="beijing">北京</li>
<li id="sh" value="shanghai">上海</li>
<li id="cq" value="chongqing">重庆</li>
</ul>
您喜欢的游戏:<br>
<ul>
<li id="fk" value="fangkong">反恐</li>
<li id="ms" value="moshou">魔兽</li>
<li id="xj" value="xingji">星际争霸</li>
</ul>
<script language="javascript">
//获取"星际争霸"节点,并增加一个name属性
var xjElement=document.getElementById("xj");
//获取当前属性
alert(xjElement.getAttribute("name"));
//增加属性
xjElement.setAttribute("name","xingjizhengba");
//获取增加后的属性
alert(xjElement.getAttribute("name"));
</script>
</body>
</html>
4.创建新元素节点
createElement()
按照给定的标签名创建一个新的元素节点。方法只有一个参数:将被创建的元素的名字,是一个字符串.
var reference = document.createElement(element);
方法的返回值:是一个指向新建节点的引用指针。返回值是一个元素节点,所以它的 nodeType 属性值等于 1。
新元素节点不会自动添加到文档里,新节点没有 nodeParent 属性,它只是一个存在于 JavaScript 上下文的对象.
var pElement = document.createElement("p");
5.创建文本节点
createTextNode()
创建一个包含着给定文本的新文本节点。这个方法的返回值是一个指向新建文本节点引用指针。
var textNode = document.createTextNode(text);
方法只有一个参数:新建文本节点所包含的文本字符串
方法的返回值:是一个指向新建节点的引用指针。它是一个文本节点,所以它的 nodeType 属性等于 3.
新元素节点不会自动添加到文档里,新节点没有 nodeParent 属性
var pElementText=document.createElement("li");
var textElement=document.createTextNode("南京");
pElementText.appendChild(textElement);
6.插入节点1
appendChild()
为给定元素增加一个子节点:
var newreference = element.appendChild(newChild).
给定子节点 newChild 将成为给定元素节点 element 的最后一个子节点。
方法的返回值是一个指向新增子节点的引用指针。
该方法通常与 createElement() createTextNode() 配合使用
新节点可以被追加给文档中的任何一个元素
4和5、6综合例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
您喜欢的城市:<br>
<ul id="city">
<li id="bj" value="beijing">北京</li>
<li id="sh" value="shanghai">上海</li>
<li id="cq" value="chongqing">重庆</li>
</ul>
您喜欢的游戏:<br>
<ul>
<li id="fk" value="fangkong">反恐</li>
<li id="ms" value="moshou">魔兽</li>
<li id="xj" value="xingji">星际争霸</li>
</ul>
<script language="javascript">
//增加城市节点<li id="tj" value="tianjing">天津</li>
//<li></li>
var liElement=document.createElement("li");
//设置属性<li id="tj" value="tianjing"></li>
liElement.setAttribute("id","tj");
liElement.setAttribute("value","tianjing");
//创建文本节点"天津"
var textElement=document.createTextNode("天津");
//增加文本节点"天津"到<li id="tj" value="tianjing"></li>形成<li id="tj" value="tianjing">天津</li>
liElement.appendChild(textElement);
//获取父节点
var cityElement=document.getElementById("city");
//添加<li id="tj" value="tianjing">天津</li>到父节点下
cityElement.appendChild(liElement);
</script>
</body>
</html>
刷新界面后多出了一个"天津"节点,但是我们查看源代码,发现没有"天津"节点,原因是因为我们用过js动态添加的代码通过浏览器的源码查看器是查看不出来的。如果是jsp转过来的是可以看到的。
4和5、6例子2:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<select name="edu" id="edu">
<option value="博士">博士^^^^^</option>
<option value="硕士">硕士^^^^^</option>
<option value="本科">本科^^^^^</option>
<option value="幼儿园">幼儿园^^^^^</option>
</select>
<script language="javascript">
//增加节点<option value="大专">大专^^^^^</option>
//创建<option value="大专">大专^^^^^</option>
var optionElement=document.createElement("option");
optionElement.setAttribute("value","大专");
var textElement=document.createTextNode("大专^^^^^");
optionElement.appendChild(textElement);
//获取id="edu"节点
var eduElement=document.getElementById("edu");
//添加
eduElement.appendChild(optionElement);
</script>
</body>
</html>
7.插入节点2
insertBefore()
把一个给定节点插入到一个给定元素节点的给定子节点的前面
var reference = element.insertBefore(newNode,targetNode);
节点 newNode 将被插入到元素节点 element 中并出现在节点 targetNode 的前面.
节点 targetNode 必须是 element 元素的一个子节点。
该方法通常与 createElement() 和 createTextNode() 配合使用
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<ul>
<li id="bj" name="beijing">北京</li>
<li id="sh" name="shanghai">上海</li>
<li id="cq" name="chongqing">重庆</li>
</ul>
<script language="javascript">
// 插入新的节点 <li id="tj" name="tianjin">天津</li>
// 在 <li id="cq" name="chongqing">重庆</li>的前面
//创建 <li id="tj" name="tianjin">天津</li>
var tjElement=document.createElement("li");
tjElement.setAttribute("id","tj");
tjElement.setAttribute("value","tianjing");
var textElement=document.createTextNode("天津");
tjElement.appendChild(textElement);
//获取重庆 <li id="cq" name="chongqing">重庆</li>
var cqElement=document.getElementById("cq");
//获取重庆节点的父节点
var ulElement=cqElement.parentNode;
//插入到重庆前
ulElement.insertBefore(tjElement,cqElement);
</script>
</body>
</html>
8.插入节点3
DOM 没有提供 insertAfter() 方法
我们用自己的实现方式去实现类似于insertAfter() 的方法
例子1:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<ul>
<li id="bj" name="beijing">北京</li>
<li id="sh" name="shanghai">上海</li>
<li id="cq" name="chongqing">重庆</li>
</ul>
<script language="javascript">
// 插入新的节点 <li id="tj" name="tianjin">天津</li>
// 在 <li id="cq" name="chongqing">上海</li>的后面
//创建 <li id="tj" name="tianjin">天津</li>
var tjElement=document.createElement("li");
tjElement.setAttribute("id","tj");
tjElement.setAttribute("value","tianjing");
var textElement=document.createTextNode("天津");
tjElement.appendChild(textElement);
//获取上海 <li id="cq" name="chongqing">重庆</li>
var shElement=document.getElementById("sh");
//获取上海节点的下一个兄弟节点重庆
var nextElement=shElement.nextSibling;
//获取上海节点的父亲节点
var shParentElement=shElement.parentNode;
//添加到上海节点的下一个兄弟节点重庆的前面
shParentElement.insertBefore(tjElement,nextElement);
</script>
</body>
</html>
例子2:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<ul>
<li id="cq" name="chongqing">重庆</li>
<li id="bj" name="beijing">北京</li>
<li id="sh" name="shanghai">上海</li>
</ul>
<script language="javascript">
// 插入新的节点 <li id="tj" name="tianjin">天津</li> 到<li id="sh" name="shanghai">上海</li>这个节点
// 如上海节点是最后一个节点插入到该节点的<li id="sh" name="shanghai">上海</li>的后面,
// 否则插入到该节点的前面
//创建<li id="tj" name="tianjin">上海</li>节点
var liElement=document.createElement("li");
liElement.setAttribute("id","tj");
liElement.setAttribute("name","tianjin");
var textElement=document.createTextNode("天津");
liElement.appendChild(textElement);
//获取上海节点
var shElement=document.getElementById("sh");
//获取上海节点的父节点
var shParentElement=shElement.parentNode;
//获取上海节点的父节点中的最后一个子节点
var lastChildParentElement=shParentElement.childNodes[5];
//比对上海节点和上海节点的父节点中的最后一个子节点
if(shElement == lastChildParentElement){
//如果相等,表示上海节点是最后一个节点,此时插入上海节点的后面
shParentElement.appendChild(liElement);
}else{
//如果不相等,表示上海节点不是最后一个节点,此时插入上海节点的前面
shParentElement.insertBefore(liElement,shElement);
}
</script>
</body>
</html>
9.删除节点
removeChild()
从一个给定元素里删除一个子节点
var reference = element.removeChild(node);
返回值是一个指向已被删除的子节点的引用指针。
某个节点被removeChild()方法删除时,这个节点所包含的所有子节点将同时被删除。
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<ul>
<li id="cq" name="chongqing">重庆</li>
<li id="bj" name="beijing">北京</li>
<li id="sh" name="shanghai">上海</li>
</ul>
<script language="javascript">
//删除<ul id="city"> 下<li id="bj" name="beijing">北京</li>这个节点</ul>
//获取子节点
var bjElement=document.getElementById("bj");
//获取父节点
var cityElement=bjElement.parentNode;
//删除
var oldElement=cityElement.removeChild(bjElement);
//测试
alert("被删除的节点的id是:"+oldElement.getAttribute("id"));
</script>
</body>
</html>
10.遍历节点树
(1)遍历
ChildNodes:返回一个数组,这个数组由给定元素节点的子节点构成:
var nodeList = node.childNodes;
文本节点和属性节点都不可能再包含任何子节点,所以它们的 ChildNodes 属性永远会返回一个空数组。
如果想知道某个元素有没有子节点,可以用 hasChildNodes 方法。
如果想知道某个元素有多少个子节点,可以用 childNodes 数组的 length 属性。
childNodes 属性是一个只读属性。
(2)获取第一个子节点
firstChild:该属性返回一个给定元素节点的第一个子节点,返回这个节点对象的指针。
var reference = node.firstChild;
文本节点和属性节点都不可能包含任何子节点,所以它们的 firstChild 属性永远会返回 null。
某个元素的 firstChild 属性等价于这个元素的 childNodes 节点集合中的第一个节点,即:
var reference = node.ChildNodes[0];
firstChild 属性是一个只读属性。
(2)获取最后一个子节点
lastChild:对应 firstChild 的一个属性。
nextSibling: 返回一个给定节点的下一个兄弟节点。
parentNode:返回一个给定节点的父节点。
parentNode 属性返回的节点永远是一个元素节点,因为只有元素节点才有可能包含子节点。
document 节点的没有父节点。
previousSibling:返回一个给定节点的上一个兄弟节点
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<ul>
<li id="cq" name="chongqing">重庆</li>
<li id="bj" name="beijing">北京</li>
<li id="sh" name="shanghai">上海</li>
</ul>
<script language="javascript">
//遍历节点树并输出每个节点的名称
//获取ul节点
var ulELement=document.getElementsByTagName("ul");
//获取ul节点的节点树
var ulChildNodes=ulELement[0].childNodes;
//遍历
for(var i=0;i< ulChildNodes.length;i++){
alert(ulChildNodes[i].nodeName);
}
</script>
</body>
</html>
11.innerHTML属性
浏览器几乎都支持该属性,但不是 DOM 标准的组成部分。
innerHTML 属性可以用来读,写某给定元素里的 HTML 内容。
例子:(在div层中插入 <h1>今天</h1>)
老方法:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<div id="city"></div>
<script language="javascript">
//在div层中插入 <h1>今天</h1>
//创建<h1>今天</h1>
var jintianElement=document.createElement("h1");
var textElement=document.createTextNode("今天");
jintianElement.appendChild(textElement);
//获取div节点
var divElement=document.getElementById("city");
//添加
divElement.appendChild(jintianElement);
</script>
</body>
</html>
使用innerHTML的方法
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>js测试</title>
</head>
<body>
<div id="city"></div>
<script language="javascript">
//在div层中插入 <h1>今天</h1>
document.getElementById("city").innerHTML="<h1>今天</h1>";
</script>
</body>
</html>