12.4 范围

一、DOM 中的范围

使用 document.createRange() 方法创建范围
Range 类型的实例包含下列属性

属性 说明
startContainer 包含范围起点的节点(起点的父节点)
startOffset 范围在 startContainer 中起点的偏移量,如果 startContainer 是文本节点、注释节点或 CDATA 节点,为起点之前跳过的字符数,否则,为范围中第一个子节点的索引
endContainer 包含范围终点的节点(终点的父节点)
endOffset 范围在 startContainer 中终点的偏移量
commonAncestorContainer startContainer 与 endContainer 共同的祖先节点(在文档树种位置最深的那个)

1.用 DOM 范围实现简单选择

range.selectNode():选择整个节点,包括其子节点
range.selectNodeContents():选择节点的子节点

<body>
    <p id="p1"><b>Hello</b> world!</p>
</body>

在这里插入图片描述
为了更精细地控制将哪些节点包含在范围内,可以使用下列方法

方法 说明
setStartBefore(refNode) 范围起点在 refNode 之前,refNode 是范围的起点,startContainer 为 refNode.parentNode,startOffset 为 refNode 在其父节点中的索引值
setStartAfter(refNode) 范围起点在 refNode 之后,refNode 不在范围内,startContainer 为 refNode.parentNode,startOffset 为 refNode 在其父节点中的索引值 +1
setEndBefore(refNode) 范围终点在 refNode 之前,refNode 不在范围内,endContainer 为 refNode.parentNode,endOffset 为 refNode 在其父节点中的索引值
setEndAfter(refNode) 范围终点在 refNode 之后,refNode 是范围的终点,endContainer 为 refNode.parentNode,endOffset 为 refNode 在其父节点中的索引值 +1

2.用 DOM 范围实现复杂选择

使用 setStart() 和 setEnd() 方法,二者均接收两个参数:参照节点(start/endContainer )和偏移量值(start/endOffset)

3.操作 DOM 范围中的内容

方法 说明
range.deleteContents() 删除范围中的节点
range.extractContents() 删除范围中的节点,同时返回该范围的文档片段
range.cloneContents() 创建范围的一个副本,返回该范围的文档片段,返回的是一个副本不是实际节点

4.插入 DOM 范围中的内容

方法 说明
range.insertNode() 在范围起点之前插入内容
range.surroundContents() 环绕范围插入内容

5.折叠 DOM 范围

方法 说明
range.collapse() 折叠范围,接收一个布尔参数,为 true 折叠到起点,false 折叠到终点

可以使用 range.collapsed 判断是否处于折叠状态,是为 true

6.比较 DOM 范围
使用 compareBoundaryPoints() 方法来比较范围,接收两个参数:表示比较方式的常量值和要比较的范围,其中第一个参数的取值如下

扫描二维码关注公众号,回复: 8817893 查看本文章
常量值 说明
Range.START_TO_START(0) 比较二者起点
Range.START_TO_END(1) 比较第一个范围的起点和第二个范围的终点
Range.END_TO_END(2) 比较二者终点
Range.END_TO_START(3) 比较第一个范围的终点和第二个范围的起点

返回的值如下

返回值 说明
-1 第一个范围中的点在第二个范围中的点之前
0 两个点相等
1 第一个范围中的点在第二个范围中的点之后

在这里插入图片描述
7.复制 DOM 范围

var newRange = range.cloneRange();

8.清理 DOM 范围

range.detach(); //从文档中分离
range = null; //解除引用

二、IE8 及更早版本中的范围

下面介绍的方法仅在 IE 中支持
对应于 document.createRange(),IE 中有创建文本范围的方法 createTextRange()

1.用 IE 范围实现简单的选择
range.findText() 方法用于第一次出现的给定文本,并将范围环绕文本,若没有找到则返回 false,否则返回 true

var range = document.body.createTextRange();
var found = range.findText('Hello');

该方法还接收第二个参数,表示搜索的方向,负值表示向后搜索,正值反之

对应于 selectNode() 方法的是 moveToElementText(),该方法接收一个 DOM 元素,选择该元素的所有文本,包括 HTML 标签

range.moveToElementText(p1);

对应于 commonAncestorContainer 属性的是 parentElement() 方法

var ancestor = range.parentElement();

2.使用 IE 范围实现复杂的选择

IE 提供给了4个方法以特定的增量向四周移动范围

方法 说明
range.move() 折叠范围再移动
range.moveStart() 移动起点
range.moveEnd() 移动终点
range.expand() 将范围扩展到包含所有选中区域

上述方法均接收两个参数:移动单位和移动单位的数量,移动单位有

移动单位 说明
‘character’ 逐个字符
‘word’ 逐个单词
‘sentence’ 逐个句子
‘textedit’ 移动到起点或终点

3.操作 IE 范围中的内容

属性和方法 说明
range.text 获取范围中的文本
range.htmlText 获取范围中的 HTML 和文本
range.pasteHTML() 插入 HTML 代码

4.折叠 IE 范围

同样为 collapse 方法,只是没有 collapsed 属性判断是否折叠,而是使用 boundingWidth,为0则处于折叠状态

5.比较 IE 范围

与 compareBoundaryPoints() 对应的是 compareEndPoints(),第一个参数有所不同,取值分别为:
StartToStart、StartToEnd、EndToEnd、EndToStart

IE 中还有另外两个方法:isEqual() 和 inRange(),前者用于判断是否相等,后者用于判断是否包含(range2 是否包含在 range1 内)

6.复制 IE 范围

var newRange = range.duplicate();
发布了52 篇原创文章 · 获赞 0 · 访问量 695

猜你喜欢

转载自blog.csdn.net/weixin_44774877/article/details/104076141