欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

编辑器开发之 Range 范围对象的学习

程序员文章站 2022-05-31 10:23:28
写在前面: 网上有各种富文本编辑器,微博分享等操作,这些功能非常实用,他们就是使用 range,selection 对象来实现的,这两个对象偏冷门,不涉及编辑器一般用不到,range 对象是对选区的操作,选区是鼠标在页面上按下,然后拖动选择的内容,range 对象就是对这个选区的操作;selecti ......

写在前面:

网上有各种富文本编辑器,微博分享等操作,这些功能非常实用,他们就是使用 range,selection 对象来实现的,这两个对象偏冷门,不涉及编辑器一般用不到,range 对象是对选区的操作,选区是鼠标在页面上按下,然后拖动选择的内容,range 对象就是对这个选区的操作;selection 是当前活动区的操作对象,selection 对象下面可以有多个 range 对象;这篇文章写的是标准的 selection和 range,小于 ie 9 的旧版本不在讨论范围内;

先来看一下 w3c 文档上的 range 对象的基本属性:

collapsed:返回一个用于判断 range 起始位置和终止位置是否相同的布尔值。

commonancestorcontainer:返回包含 startcontainer 和 endcontainer 的最深的节点。

endcontainer:返回包含 range 终点的节点。

endoffset:返回 endcontainer 中表示range终点位置的数字。

startcontainer:返回包含 range 开始的节点。

startoffset:返回 startcontainer 中表示 range 起始位置的数字。

注意:range 的这些属性都是只读的,看下面这张图,就明白这些属性是怎么回事了:

编辑器开发之 Range 范围对象的学习

collapsed 为 flase,说明起始点和终点不在同一个位置,startoffset 是从0开始的,d 的索引是2,表示鼠标按下的位置,也就是 div 元素的字符开始算的,endoffset 是 4,是从 span 标签开始算的,i 字符在 span 标签立面的索引是4;

注意,他们总是从包裹字符的节点的开始字符计算的;

再来看下 range 的方法和解释:

setstart(node, index):设置 range 的起点。
setend(node, index):设置 range 的终点。
setstartbefore(node):以其它节点( node)为基准,设置 range 的起点。
setstartafter():以其它节点为基准,设置 range 的始点。
setendbefore():以其它节点为基准,设置 range 的终点。
setendafter():以其它节点为基准,设置 range 的终点。
selectnode():设定一个包含节点和节点内容的 range。
selectnodecontents():设定一个包含某个节点内容的 range。
collapse():向指定端点折叠该 range。

这个解释看了之后一脸蒙圈,我的感受是讲的不清楚,还是上图,加上我们的理解更直观:

setstart setend 方法:

js 操作:

 1 // 创建新的 range 对象,设置 setstart setend
 2   function setstartend() {
 3     var box = document.getelementbyid('box');
 4     if (document.createrange) {
 5       var range = document.createrange();
 6       var start = box.queryselector('p').firstchild;
 7       var end = box.queryselector('span').firstchild;
 8 
 9       range.setstart(start, 2); // p 标签的第 2 个字符
10       range.setstart(end, 3); // span 标签的 第 3 个字符
11       console.log(range.clonecontents()); // 打印 range 的内容
12       console.log(range); // 打印 range
13     }
14   }

选区的内容和打印 range 的结果:

编辑器开发之 Range 范围对象的学习

这个例子可以看出来,range 基本上操作任何你想选择的内容;

其他的几个方法类似,都是操作 range 选区的,collapse 方法是设置折叠选区的,开始位置和结束位置相同,这么解释就清楚多了,作用是多用来设置光标的;

下一篇看一下 selection 对象的基本属性和用法;