编辑器开发之 Selection 对象的学习

上一篇,介绍了 range 对象的一些属性和方法,了解了一些基本操作,现在来介绍另外一个重要的对象:selection 对象;

MDN 的解释是:Selection 对象表示用户选择的文本范围或插入符号的当前位置。它代表页面中的文本选区,可能横跨多个元素。文本选区由用户拖拽鼠标经过文字而产生;

先来写一个基本的 HTML 结构:

  1 <div id="box" class="box" contenteditable="true">abcd<span>efghi</span>jk<p>mnop</p><span>qrstwvu</span>xyz</div>

选中:

看下 selection 对象的信息:

  1 function getSel() {
  2   var sel = window.getSelection();
  3   // 如果有 range
  4   if (sel.rangeCount > 0) {
  5     var range = sel.getRangeAt(0);
  6     console.log(range.cloneContents());
  7   }
  8   console.log(sel);
  9 }
 10 

这里主要关注的有这几个属性:

anchorNode:返回选区的开始位置所在的节点,这里是最外面的 div;

anchorOffset:返回选区开始位置在开始节点中的位置;

focusNode:返回选区的结束位置所在的节点,这里是 span 标签;

focusOffset:返回选区的结束位置在结束节点中的位置;

isCollapsed:返回选区的开始位置和结束位置是否相同,检测选区是否折叠;

rangeCount:返回 range 对象的数量;

注意:这个 rangeCount 总是存在的,无论页面有没有可变的区域,只要鼠标点击了任何位置,它都会变成 1;

baseNode,baseOffset属性和 ahchorNode,anchorOffset相同;

extentNode,extentOffset属性和 focusNode,focusOffset相同;

 

Selection 对象的一些重要方法:

getRangeAt(index):根据索引返回 range 对象,需要注意的一点是:其他浏览器都是只有一个选区,但是在 firefox下,可以有多个选区,操作是按住 shift 多选;

collapse(parentNode, offset):折叠选区到某个位置,光标会在此处闪烁;

现在把光标移动到 p 标签的第三个字符前面:

  1 function setCollapse() {
  2     var sel = window.getSelection();
  3     box.focus();
  4     var p = box.querySelector(‘p‘).firstChild;
  5     sel.collapse(p, 2); // 设置光标的位置在 p 标签的第三个字符前面
  6
  7     if (sel.rangeCount > 0) {
  8       var range = sel.getRangeAt(0);
  9       console.log(range);
 10     }
 11   }

可以看到光标在字符 o 的前面闪烁;

collapseToStart:将光标设置到选区的起点,这个没什么好说的;

collapseToStart:将光标设置到选区的结束位置,这个也没啥好说的;

selectAllChildren(node):将节点的所有子节点加入选区;

  1 function setSelectAllChildren() {
  2     var sel = window.getSelection();
  3     sel.selectAllChildren(box); // 把可编辑区的所有子节点纳入选区
  4
  5     if (sel.rangeCount > 0) {
  6       var range = sel.getRangeAt(0);
  7       console.log(range.cloneContents());
  8     }
  9   }

可以看到所有的内容都放到选区内了;

addRange(range):将选区加入到 selection:

  1 function addRange() {
  2     var sel = window.getSelection();
  3     sel.removeAllRanges();
  4     box.focus();
  5
  6     // 将所有的子节点放到选区中
  7     var children = box.children;
  8     for(var i = 0; i < children.length; i++) {
  9       var range = document.createRange();
 10
 11       console.log(children[i]);
 12       range.selectNode(children[i]);
 13       sel.addRange(range);
 14     }
 15
 16     console.log(sel); // 打印 range 的数量
 17   }

这里是把所有的子节点放到选区中,但是好像只有 firefox 支持,其他的浏览器不支持多个 range;

removeRange(range):删除指定的选区,只有 firefox 支持;

removeAllRanges:删除所有的选区;

deleteFromDocument:从页面中删除选区中的内容;

selectionLanguageChange:当键盘的朝向发生改变后修改指针的Bidi优先级;

toString:返回当前选区的纯文本内容;

containsNode:判断某一个node是否为当前选区的一部分;

原文地址:https://www.cnblogs.com/zhangmao/p/10747111.html

时间: 2024-12-30 03:56:24

编辑器开发之 Selection 对象的学习的相关文章

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

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

j2ee开发之Spring2.5框架学习笔记

Spring 2.5框架学习笔记 1.是一个开源的控制反转IOC和面向切面AOP的容器框架 2.IOC控制反转 public class PersonServiceBean { private PersonDao personDao = new PersonDao(); publiv void save(Person person){ personDao.save(person); } } 控制反转:应用本身不负责依赖对象personDao的创建以及维护,依赖对象的创建以及维护是由外部容器负责的

Android开发之App Widget的学习及使用

(以下为本人对于官方文档的理解,能力有限,有错还望指出) 1.首先,我们先阅读下官方文档,后面活给出Demo程序 App Widgets(小工具,窗口小部件) App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic(周期的,定期的) updates. These views are re

jquery开发之jQuery对象和DOM对象的相互转换

如果获取的对象是jQuery对象,那么在变量前加上$,如下: var $variable = jQuery 对象 如果获取的是DOM对象,定义如下: var variable = DOM对象 1,jQuery对象转换成DOM对象 jQuery 提供了两种方法将一个jQuery对象转换为DOM对象,即[index] 和get(index) (1) jQuery 对象是一个类似数组的对象,可以通过[index] 的方法得到相应的DOM对象.jQuery 代码如下: var $cr = $("#cr&

物联网的全栈开发之路

本文由嵌入式企鹅圈原创团队成员-华南师范大学物联网创新中心黄鑫执笔. 两年前我还一直专注在android系统定制领域的研究,对物联网关注比较少,尽管我个人对智能家居的概念和场景体验也比较熟悉.真正引起我注意的是有一次在车上,听到电视广播说打开蓝牙,用手机摇一摇就可以摇到红包,我就觉得这个场景很棒,然后就知道了ibeacon和微信摇一摇周边,知道了微信硬件平台和物联网的发展已经深入渗透到我们的生活了.尽管我觉得自己进入物联网不算早,但是考虑到传统电子行业都有升级到物联的需求,加上自身在嵌入式和AP

ios开发之OC基础-类和对象

本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再将零散的知识点整理出来.这样的学习方法会带来更多的收获,同时要多做练习,按照思路,默写.改写代码.在这里,感谢欧阳坚老师,学习你的课程使我走上了ios的开发之路. 一定要明确一个要从事的方向,要不然就会感到迷茫.学习ios开发,并且从事ios开发这个行业,这就是我的选择.看到我的博客系列文章,其中大

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 博主曾经自己使用NDK编译出了libSDL2.so,然后使用共享库的方式来调用libSDL2中的函数,结果发现SDL\src\core\android\SDL_android.c 这个jni函数写的实在是不够自己另外做

Cocos2d-x游戏开发之lua编辑器 subime 搭建,集成cocos2dLuaApi和自有类

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示,同时叠加一张图作为背景图. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 在前面两篇文章我们知道了如何移植SDL2.0到android上面来,并且可以在Android上面来显示一张图片,这篇