一、遍历
‘DOM2级遍历和范围’模块定义了两个辅助完成顺利遍历DOM结构的类型:NodeIterator和TreeWalker;
这两个类型能够基于给定的起点对DOM结构执行深度优先的遍历操作。IE不支持DOM遍历。
使用下列代码可以检测浏览器对DOM2级遍历能力的支持情况:
var supportsTraversals=document.implementation.hasFeature('Traversal','2.0');
var supportNodeIterator=(typeof document.createNodeIterator=='function');
var supportsTreeWalker=(typeof document.createTreeWalker=='function');
DOM遍历是深度优先的DOM结构遍历。
任何节点都可以作为遍历的根节点。
NodeIterator类型:
document.createNodeIterator()
接受4个参数:
root:想要作为搜索起点的树中的节点;
whatToShow:表示访问哪些节点的数字代码;
filter:是一个NodeFilter对象,或者一个表示应该接受还是拒绝某种特定节点的函数;
entityReferenceExpansion:布尔值,表示是否要扩展实体引用。这个参数在HTML页面中没有用,因为其中的实体引用不能扩展。
其中whatToShow是一个位掩码,通过应用一或多个过滤器(filter)来确定要访问哪些节点。这个参数的值以常量形式在NodeFilter类型中定义,详见P328页。
每个NodeFilter对象只有一个方法,即acceptNode();如果应该访问给定的节点,该方法返回NodeFilter.FILTER_ACCEPT,如果不应该访问给定的节点,该方法返回NodeFilter.FILTER_SKIP.
NodeIterator类型的主要方法是nextNode()和previousNode()。
nextNode():向前前进一步。
previousNode():想后后退一步。
TreeWalker类型:
TreeWalker是NodeIterator的一个更高级的版本。除了包括nextNode()和previousNode()在内的相同功能之外,这个类型还提供了下列在不同方向遍历DOM结构的方法。详见P330页。
document.createTreeWalker()
接受4个参数,同NodeIterator
另外有个NodeFiter.FILTER_REJECT
在使用NodeIterator对象时,NodeFilter.FILTER_SKIP与NodeFiter.FILTER_REJECT的作用相同:跳过指定的节点。
而在使用TreeWalker对象时,NodeFilter.FILTER_SKIP会跳过相应节点继续前进到子树中的下一个节点,而NodeFiter.FILTER_REJECT则会跳过相应节点及该节点的整个子树。
TreeWalker真正强大的地方在于能够在DOM结构中沿任何方向移动。使用TreeWalker遍历DOM树,即使不使用过滤器,也可以取得所有所需元素。
TreeWalker类型还有一个属性,名叫currentNode,表示任何遍历方法在上一次遍历中返回的节点。通过这个属性也可以修改遍历继续进行的起点。
二、范围
1、DOM中的范围
createRange()
检测确定浏览器是否支持范围:
var supportsRange=document.implementation.hasFeature('Range','2.0');
var alsoSupportsRange=(typeof document.createRange=='function');
如果浏览器支持范围,那么就使用createRange()来创建DOM范围,如下所示:
var range=document.createRange();
startContaitartOffset、endContainer、endOffset、commonAncestorContainer。详见P332页。
a、用DOM范围实现简单选择
selectNode() :选择整个节点,包括其子节点。
selectNodeContents():只选择节点的子节点。
此外,为了更精细地控制将哪些节点包含在范围中,还可以使用以下方法:
setStartBefore(refNode)
setStartAfter(refNode)
setEndBefore(refNode)
setEndAfter(refNode)
b、用DOM范围实现复杂选择
setStart() setEnd()
这两个方法接受两个参数:一个参照节点和一个偏移量。
c、操作DOM范围中的内容
删除范围所包含的内容:deleteContents()
删除范围所包含的内容,并返回范围的文档片段:extractContents()
d、插入DOM范围中的内容:
insertNode():向范围选区的开始出插入一节点
e、折叠DOM范围:collapse():返回一个布尔值,true表示折叠到范围的起点;false表示折叠到范围的终点
f、比较DOM范围
compareBoundaryPoints():接受两个参数:表示比较方式的常量值和要比较的范围。
表示比较方式的常量值:
1、Range.START_TO_START(0):比较第一个范围起点和第二个范围起点。
2、Range.START_TO_END(1):比较第一个范围起点和第二个范围终点。
3、Range.END_TO_END(2):比较第一个范围终点和第二个范围终点。
4、Range.END_TO_START(3):比较第一个范围终点和第二个范围起点。
compareBoundaryPoints()方法可能返回的值如下:如果第一个范围中的点位于第二个范围中的点之前,返回-1;如果两个点相等,返回0;如果第一个范围中的点位于第二个范围中的点之后,返回1。
g、复制DOM范围:cloneRange()
h、清理DOM范围:detach()
例:range.detach();//从文档中分离
range=null;//解除引用
在使用范围的最后再执行这两个步骤使我们推荐的方式。一旦分离范围,就不能再恢复使用了。
2、IE8及更早版本的范围
IE8及更早版本不支持DOM范围,但支持文本范围。文本范围是IE专有的特性,其它浏览器都不支持。
创建文本范围:createTextRange()
a、用IE范围实现简单的选择
findText()
b、用IE范围实现复杂的选择
move()、moveStart()、moveEnd()、expand()
这些方法接受两个参数:移动单位和移动单位的数量
移动单位:
character:逐个字符地移动;
word:逐个单词地移动;
sentence:逐个句子的移动;
textedit:移动到当前范围选区的开始或结束位置
c、操作IE范围中的内容
text:取得范围中的内容文本,也可以设置范围中的内容文本
pasteHTML():向范围中插入HTML代码
d、折叠IE范围:collapse()
e、比较IE范围:compareEndPoints()
f、复制IE范围:duplicate()