节点层次
节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。文档节点是每个文档的根节点,文档节点只有一个子节点,
即<html>元素:我们称之为文档元素。文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素中。每个文档只能有一个文档元素。在html页面中,文档元素始终都是<html>元素。
每一段标记都可以通过树中的一个节点来表示:HTML元素通过元素节点表示,特性通过特性节点表示,文档类型通过文档类型节点表示。
Node类型
每一个节点都有一个nodeType属性,用于表明节点的类型。
元素节点类型:1
特性节点类型:2
文本节点类型:3
注释节点类型:8
文档节点类型:9
通过比较常量,可以确定节点的类型。eg:
<script type="text/javascript">
if(someNode.nodeType == 1){
alert('Node is an element')
}
</script>
要了解节点的具体信息,可以使用nodeName和nodeValue。这两个属性的值完全取决于节点的类型。eg:<script type="text/javascript">
if (someNode.nodeType == 1){
value = someNode.nodeName //nodeName的值是元素的标签名
}
</script>
对于元素节点,nodeName中保存的始终都是元素的标签名,而nodeValue的值则始终为null。节点关系
<script type="text/javascript">
var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var count = someNodes.childNodes.length;
</script>
注意:length属性表示的是访问NodeList的那一刻,其中包含的节点数量。对arguments对象使用Array.protype.slice()方法可以将其转换为数组。而采用同样的方法,也可以将NodeList对象转换为数组。eg:var arrayofNodes = Array.prototype.slice.call(someNode.childNodes,0)
每个节点都有一个parentNodes属性,该属性指向文档树中的父节点。包含在childNodes列表中的所有节点都具有相同的父节点,因此它们的parentNodes都指向了同一个节点。此外,包含在childNodes列表中的每个节点相互之间都是同胞节点。通过使用列表中的每个节点的previousSibling属性和nextSibling属性,可以访问同一列表中的其他节点。列表中的第一个节点的previousSibling属性值为null,而列表中最后一个节点的nextSibling属性的值也为null。eg:<script type="text/javascript">
if (someNodes.nextSibling === null){
alert("Last node in the parent's chiladNodes list")
}else if(someNodes.previousSiblin ==- null){
alert("First node in the parent's childNodes list")
}
</script>
如果列表中只有一个节点,那么该节点的nextSibling和previousSibling都为null。父节点与其第一个和最后一个子节点之间也存在特殊关系。父节点的firstChild和lastChild属性分别指向其childNodes列表中的第一个和最后一个节点。其中,someNode.firstChild的值始终等于someNode.childNodes[0],而someNodes.lastChild始终等于someNodes.childNodes[someNode.childNodes.length-1].
操作节点
var returnNode = someNodes.appendChild(newNode);
alert(returnNode == newNode); //true
alert(someNode.lastChild == newNode); //true
如果需要把节点放在childNodes列表中某个特定的位置上,而不是放在末尾。可以使用insertBefor( )方法。这个方法接收两个参数:要插入的节点和作为参照物的节点。插入节点后,被插入的节点会变成参照节点的前一个同胞节点(previousSibling),同时被方法返回。如果参照节点是Null,则insertBefor( )与appendChild( 执行相同的操作。eg:<script type="text/javascript">
// 插入后成为最后一个子节点
returnedNode = someNode.insertBefore(newNode,null);
alert(newNode == someNode.lastChild); // true
// 插入后成为第一个子节点
returnNode = someNode.insertBefor(newNode,someNode.firstNode);
alert(returnNode == someNode.firstNode); // true
// 插入到最后一个子节点前面
returnNode == someNode.insertBefor(newNode,someNode.lastChild);
alert(returnNode == someNode.childNodes[someNode.childNodes.length-2]); // true
</script>
移除节点
// 替换第一个子节点
var returnedNode = someNode.replaceChild(newNode,someNode.firstChild);
// 替换最后一个子节点
returnedNode = someNode.replaceChild(newNode,someNode.lastChild);
在使用replaceChild( )插入一个节点时,该节点的所有关系指针都会从被它替换的节点复制过来。接管从技术上讲,被替换的节点仍然还在文档中,但它在文档中已经没有了自己的位置。// 移除第一个子节点
var returnNode = someNode.removeChild(someNode.firstNode);
// 移除最后一个子节点
var returnNode = someNode.removeChild(someNode.lastChild);
与只用repaceChild( )方法一样,通过removeChild( )方法移除的节点仍然为文档所有,只不过在文档中已经没有了自己的位置。
cloneNode( ),用于创建调用这个方法的节点的一个完全相同的副本。cloneNode( )方法接受一个布尔值
参数。在参数为true的情况下,执行深复制:赋值节点及其整个子节点树;在参数为false的情况下,执行浅复制,
即只复制节点本身。复制后返回的节点副本属于文档所有,但并没有为它指定指定父节点。因此,这个节点副本
就成为了一个孤儿,除非通过appenChild()、insertBefore()、replaceChild()将它添加到文档中去。
normalize( )方法唯一的作用就是处理文档树中的文本节点。
Document类型
查找元素
文档写入
Element类型
取得特性
设置特性
删除特性
创建元素
Text类型
DOM查找总结
querySelector()方法
var body = document.querySelector('body'); //取得body元素
var myDiv = document.querySelector('#myDiv');//取得id为'#myDiv'的元素
var selected = document.querySelector('.selected');//取得类为'selected'的第一个元素
var img = document.querySelector('img.button');//取得类为button的第一个图像元素
querySelectorAll()方法
该方法返回的是所有匹配的元素而不是仅仅是一个元素。这个方法返回的是一个NodeList的实例。具体来说,返回的值实际上是带有所有属性和方法的NodeList,而其底层实现则类似于一组元素的快照,而非不断对文档进行搜索的动态查询。//找到某DIV种的所有em元素
var ems = document.getElementById('myDiv').querySelectorAll('em')
//取得所有p元素中的所有strong元素
var strongs = document.querySelectorAll('p strong')
DocumentFragment
<script type="text/javascript">
var ul = document.createElement('ul');
document.body.appendChild(ul);
var osList = ['mac','win','linux'];
var frag = document.createDocumentFragment();
for(var i = 0,len = osList.length;i<len;i++){
var li = document.createElement('li');
var liText = document.createTextNode(osList[i]);
li.appendChild(liText);
frag.appendChild(li)
}
ul.appendChild(frag)
</script>