博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DOM2级遍历和范围 P326
阅读量:6540 次
发布时间:2019-06-24

本文共 3171 字,大约阅读时间需要 10 分钟。

一、遍历

‘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()

 

转载于:https://www.cnblogs.com/LiuMingfeng/p/7727653.html

你可能感兴趣的文章
某篇ctr预估ppt的链接
查看>>
在CentOS7中配置网络时常见的LSB加载失败问题
查看>>
Kafka 0.7.2 单机环境搭建
查看>>
经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;
查看>>
Dcloud课程6 php脚本如何在Linux下定时更新数据
查看>>
js进阶 14-7 jquery的ajax部分为什么需要对表单进行序列化
查看>>
ubuntu下msmtp+mutt的安装和配置
查看>>
利用sqoop对mysql执行DML操作
查看>>
hibernate中视图的映射
查看>>
Ionic3 UI组件之 ImageViewer
查看>>
flask框架----flask基础
查看>>
Oracle之RMAN备份及还原
查看>>
蓝桥杯-学校的第一次练习题
查看>>
spring中注解说明
查看>>
hdu 4135 -Co-prime
查看>>
二叉树的建立与先序、中序、后序遍历
查看>>
QLabel显示图片,图片可以自适应label的大小
查看>>
阅读下面程序,请回答如下问题:
查看>>
Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure
查看>>
BZOJ3994:[SDOI2015]约数个数和——题解
查看>>