TreeWalker
TreeWalker是NodeIterator的更高级的版本,除了包括nextNode()和previousNode()在内的相同功能外,这个类型还提供了用于不同方向上遍历DOM结构的方法
parentNode():遍历到当前节点的父节点
firstChild():遍历到当前节点的第一个子节点
lastChild():遍历到当前节点的最后一个子节点
nextSibling():遍历到当前节点的下一个同胞节点
previoussibling():遍历到当前节点的上一个同胞节点
创建TreeWalker对象要使用document.createTreeWalker()方法,接收4个参数,与document.createNodeIterator()方法相同:作为遍历起点的根节点、要显示的节点类型、过滤器和一个表示是否扩展实体引用的布尔值,可以用document.createTreeWalker()方法代替document.createNodeIterator()方法
filter可以返回的值有所不同,除了NodeFilter.FILTER_ACCEPT和NodeFilter.FILTER_SKIP之外,还可以使用NodeFilter.FILTER_REJECT,在使用NodeIterator对象时,NodeFilter.FILTER_SKIP和NodeFilter.FILTER_REJECT作用相同就是跳过指定节点,在使用TreeWalker对象时NodeFilter.FILTER_SKIP会跳过子树的相应节点前往下一个节点,NodeFilter.FILTER_REJECT会跳过该节点包括其子树节点
TreeWalker可以在DOM结构中沿任何方向移动
...
walker.firstChild();
walker.nextSibling();
...
TreeWalker类型还有一个属性,currentNode,表示任何遍历方法在上一次遍历中返回的节点,通过设置这个属性可以修改遍历继续的起点
var node=walker.nextNode();
alert(node===walker.currentNode); //true
walker.currentNode=document.body; //修改起点
由于IE中没有对应的类型和方法,使用遍历的跨浏览器解决方案非常少见
范围
“DOM2级遍历和范围”模块定义了“范围”(range)接口。通过范围可以选择文档中一个区域,而不必考虑节点的界限,IE以专有方式实现了自己的范围特性
DOM中的范围
DOM2级在document类型中定义了createRange()方法,在兼容DOM的浏览器中,这个方法属于document对象,使用hasFeature()或者直接检测该方法,确定浏览器是否支持范围
var supportsRange=document.implementation.hasFeature("Range","2.0");
var alsoSupportsRange=(typeof document.createRange=="function");
创建DOM范围
var range=document.createRange();
每个范围由一个Range类型的实例表示,拥有很多的属性和方法
startContainer:包含范围起点的节点(即选区中第一个节点的父节点)
startOffset:范围在startContainer中起点的偏移量,如果startContainer是文本节点、注释节点或CDATA节点,那么startOffset就是范围起点之前跳过的字符数量。否则,startOffset就是范围中第一个子节点的索引
endContainer:包含范围终点的节点(即选区中最后一个节点的父节点)
endoffset:范围在endContainer中终点的偏移量(与startOffset遵循相同的取值规则)
commonAncestorContainer:startContainer和endContainer共同的祖先节点在文档树中位置最深的那个
在把范围放到文档中特定的位置时,这些属性都会被赋值