JS 处理文档选择和范围创建【createRange | getSelection】

介绍

1、const selection = window.getSelection();

说明:
1、用于获取用户当前文档选择的对象;
2、它返回一个 Selection 对象,该对象代表了用户选择的文本范围(可以包含一个或多个范围,因为用户可以同时选择多个不相邻的文本部分);
在这里插入图片描述

基本属性:

  • anchorNode:表示选择范围的起始节点;
  • anchorOffset:表示选择范围的起始偏移量(字符数或子元素的索引);
  • focusNode:表示选择范围的结束节点;
  • focusOffset:表示选择范围的结束偏移量;
  • baseNode:表示选择范围的起始节点。这通常是一个 DOM 元素或文本节点;
  • baseOffset:表示选择范围的起始偏移量。它表示从 baseNode 的开始位置(0)开始的字符偏移量或子元素的索引;
  • extentNode:表示选择范围的结束节点。这也通常是一个 DOM 元素或文本节点;
  • extentOffset:表示选择范围的结束偏移量。它表示从 extentNode 的开始位置(0)开始的字符偏移量或子元素的索引;
  • isCollapsed:: 一个布尔值,指示选择范围是否是折叠的(即起点和终点相同);

说明:
1、折叠的情况:在折叠的选择范围中,起点和终点的节点是相同的,偏移量也相同,因为用户只是设置了插入点(光标)而没有选择文本范围。
2、非折叠的情况:在非折叠的选择范围中,起点和终点的节点可以相同,也可以不同,但偏移量一定不同。这表示用户已经选择了一段文本范围,起点和终点指向所选择文本范围的开始和结束位置。

  • rangeCount:表示当前选择中的范围数量;
  • type: 属性是只读的,表示选择范围的类型,可以是 “Caret”(插入符号,即折叠的选择范围),“Range”(实际的文本选择范围)或其他类型,具体取决于用户的选择操作,“None”(还没有选择范围,即没有任何焦点信息);

基本方法:

  • addRange(range): 向选择中添加一个范围对象。可以使用这个方法将自定义的范围添加到用户的文本选择中。
  • removeRange(range): 从选择中移除一个范围对象。如果您需要删除之前添加的范围,可以使用这个方法。
  • removeAllRanges(): 从选择中移除所有范围对象。这将清空当前选择中的所有范围,将选择重置为空。
  • getRangeAt(index): 获取指定索引位置的范围对象。如果用户的选择包含多个不相邻的范围,您可以使用这个方法来访问它们。
  • toString(): 返回选择范围中的文本内容。这是一个便捷的方法,用于获取用户选择的文本。(相当于所有选中范围是一段dom,然后获取dom的innerText)
  • selectAllChildren(container): 选择指定容器元素的所有子元素。这将把选择范围设置为指定容器的所有内容。
  • collapse(node, offset): 折叠选择范围到指定节点的指定偏移量。这用于创建折叠的选择(插入符号)。【即移动光标位置,offset从0开始,没传就是0】
  • extend(node, offset): 扩展选择范围到指定节点的指定偏移量。这用于扩展文本范围选择。

2、const range = document.createRange()

说明:
1、是用于创建新的文本范围(Range)对象的方法,它是 Document Object Model (DOM) 的一部分,通常用于处理文档中的文本和元素选择。通过调用 document.createRange(),可以创建一个新的、空的文本范围对象 range。然后,您可以使用该范围对象来定义其起始点和终点,以便操作文档中的文本和元素。
2、使用 Range 对象,您可以执行各种操作,如高亮文本、插入新文本、删除文本等。它对于富文本编辑器、文本操作和选择性处理非常有用
在这里插入图片描述

基本属性:

  • startContainer:范围的起始节点(通常是一个 DOM 元素或文本节点);
  • startOffset:起始节点内的偏移量,表示从起始节点的开头(通常是字符或子元素的索引);
  • endContainer:范围的终点节点;
  • endOffset:终点节点内的偏移量;

基本方法:

  • setStart(node, offset):设置范围的起始点;
  • setEnd(node, offset):设置范围的终点;
  • selectNode(node):选择一个特定的节点及其所有子节点;
  • selectNodeContents(node):选择一个节点的所有子节点;
  • deleteContents():用于删除文本范围内的内容,包括文本节点、元素节点等。它会从文档中移除所选择的内容,但不会删除文档结构;
  • insertNode(node):用于在文本范围的起始位置插入节点,可以是文本节点、元素节点或其他类型的节点;
  • collapse(toStart):用于将文本范围折叠到起始点或终点,取决于 toStart 参数的值。如果 toStart 为 true,则折叠到起始点,如果为 false,则折叠到终点;
  • cloneRange():用于创建当前文本范围的副本。这是一个非常有用的方法,允许您在不影响原始范围的情况下创建一个新范围,以便进行独立的操作;
  • setStartAfter(refNode):用于设置文本范围的起始点为 refNode 元素之后。这是一个很有用的方法,可以在文档中定位文本范围的起始位置;

运用

1、JS选中一段文本或节点或元素。

const selection = window.selection();
const range = document.createRange();// 其中node为具体的元素
range.selectNodeContents(node);
selection.removeAllRanges();
selection.addRange(range);

2、聚焦在节点的首部

const selection = window.selection();
const range = document.createRange();// 其中node为具体的元素
range.selectNode(node);
selection.removeAllRanges();
selection.addRange(range);node.focus();

3、聚焦在节点的尾部

const selection = window.selection();
const range = document.createRange();
let len = temp1.childNodes.length;// 其中node为具体的元素
range.selectNode(temp1);
range.setStart(temp1, len);
range.setEnd(temp1, len);selection.removeAllRanges();
selection.addRange(range);node.focus();

4、控制输入长度(比如:可编辑DIV的输入框;注意:这里的长度是指文本长度)

  • 场景1:input键盘输入
// 获取光标所在节点
const selection = window.selection();
// 获取当前聚焦节点的range
const range = selection.getRangeAt(0);
// 获取range的开始节点
const startDom = range.startContainer;
const endDom = range.endContainer;
let endOffset = range.endOffset;
// 输入框的当前内容长度:10
let contentLen = 10;
// 最大输入长度
let maxLength = 10;if (contentLen > maxLength) {let startOffset = endOffset - (contentLen - maxLength);startOffset = startOffset < 0 ? 0 : startOffset;// 改变选取范围range.setStart(startDom, startOffset);range.setEnd(endDom, endOffset);range.deleteContents();
}
  • 场景2:复制黏贴
    思路:监听paste事件,获取其中的copy内容,然后在手动插入其中的内容,阻断事件的默认事件执行。
    代码:
// 黏贴事件
function pasteEvent(event) {// 获取剪切对象const clipboardData =event.clipboardData || event.originalEvent.clipboardData;// 判断剪切对象是否存在if (!clipboardData) {return false;}// 获取剪贴板的内容,通过text获取纯文本,通过text/html获取html结构let html = "";let copytext = "";// 根据需要判断是获取纯文本还是富文本,此处以获取富文本为例// copytext = clipboardData.getData("text");copytext = clipboardData.getData("text/html") || clipboardData.getData("text");// 判断剪贴板内容的结构,是否为纯文本if (copytext.indexOf("<!--StartFragment-->") >= 0) {// htmlcopytext = copytext.split("<!--StartFragment-->")[1].split("<!--EndFragment-->")[0];}html = copytext;// 插入元素节点insertHtml(html);// Prevent the default behavior of the paste eventevent.preventDefault();return false;
}// 将富文本转换为节点数据并插入
function insertHtml(html) {// 将修改后的富文本内容转换为元素节点数据const dom = new DOMParser().parseFromString(html, "text/html");const eleNodes = [...dom.body.childNodes];// 获取当前选择文本的长度(指选中内容的文本长度)const selectedContentLen = getSelectedTextLength();// 记录一下当前的光标位置信息// ...// 遍历循环元素节点信息,一一插入for (let i = 0; i < eleNodes.length; i++) {// ...}
}

5、获取选中内容的文本长度

function getSelectedRangeTextLength() {let selectedText = "";let selectedTextLength = 0;const selection = window.getSelection();if (selection.rangeCount > 0) {const selectedRange = selection.getRangeAt(0);selectedText = selectedRange.toString();selectedTextLength = selectedText.length;}return selectedTextLength;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/185388.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 工程师平均薪酬 92.5 万美元;SpaceX 明年将每两天发射一次丨 RTE 开发者日报 Vol.81

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Spring Boot 中自动装配机制的原理

&#xff08;摘自mic老师面试题&#xff09; 最近一个粉丝说&#xff0c;他面试了 4 个公司&#xff0c;有三个公司问他&#xff1a;“Spring Boot 中自动装配 机制的原理” 他回答了&#xff0c;感觉没回答错误&#xff0c;但是怎么就没给 offer 呢&#xff1f; 对于这个问题…

CRM系统中的客户保留是什么意思?有多少客户可以留下来?

一家企业&#xff0c;在销售过程中有多少客户是有效的&#xff1f;又有多少客户可以留下来&#xff1f;如果企业只顾着开发新客户&#xff0c;而忽略了客户保留&#xff0c;那么将会造成资源的浪费。那么CRM系统中的客户保留是什么意思&#xff1f; 什么是客户保留&#xff1f…

Web自动化测试入门篇详解

一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&…

【广州华锐互动】影视制作VR在线学习:身临其境,提高学习效率

随着科技的不断发展&#xff0c;影视后期制作技术也在日新月异。然而&#xff0c;传统的教学方式往往难以满足学员的学习需求&#xff0c;无法充分展现影视后期制作的魅力和潜力。近年来&#xff0c;虚拟现实(VR)技术的崛起为教学领域带来了新的机遇。通过VR教学课件&#xff0…

【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存

目录 1.前言2.引入依赖3.启动类加入注解EnableCaching4.常用注解4.1CacheConfig4.2Cacheable4.3CacheEvict4.4CachePut4.5Caching 5.总结6.参考 文章所属专区 日积月累 1.前言 Spring在3.1版本&#xff0c;就提供了一条基于注解的缓存策略&#xff0c;实际使用起来还是很丝滑…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

2023软件测试必问的100个面试题【含答案】

一、测试理论 1.什么是软件测试&#xff1f; 答&#xff1a;软件测试是通过执行预定的步骤和使用指定的数据&#xff0c;以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发&#xff08;TDD&#xff09;是什么&#xff1f; 答&#xff1a;测试驱动开发是一种开…

C# 查询腾讯云直播流是否存在的API实现

应用场景 在云考试中&#xff0c;为防止作弊行为的发生&#xff0c;会在考生端部署音视频监控系统&#xff0c;当然还有考官方监控墙系统。在实际应用中&#xff0c;考生一方至少包括两路直播流&#xff1a; &#xff08;1&#xff09;前置摄像头&#xff1a;答题的设备要求使…

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…

机器人阻抗与导纳控制的区别

机器人自身的非线性动力学&#xff08;由柔软性引起的&#xff09;导致控制精度下降&#xff0c;因此难以描述准确的动力学。 导纳控制和阻抗控制都是基于位置与力关系的模式&#xff0c;被认为具有鲁棒性和安全性。然而&#xff0c;当机器人与刚体接触时&#xff0c;导纳控制常…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

农产品展示预约小程序的内容是什么

农产品可以分为多个类目&#xff0c;对农场、农产品经销商家来说&#xff0c;除了线下开店外&#xff0c;线上也同样不能放松经营&#xff0c;面对线下多种困境&#xff0c;运用线上发展可以节约人力物力成本&#xff0c;提升整体经营效率。 1、品牌传播展示难 农产品种类较多…

CentOS 7 双网卡绑定热备 —— 筑梦之路

为什么需要&#xff1f; 1. 增强网络的可靠性 2. 保障服务的可持续性 3. 降低网卡故障带来的不良影响 有哪些模式&#xff1f; 模式0&#xff1a;轮询策略&#xff08;round robin&#xff09;&#xff0c;mode0&#xff0c;优点&#xff1a;流量提高一倍缺点&#xff1a;需要接…

9种跨境电商独立站模式的特点分析和总结

在上一篇文章《什么是跨境电商独立站&#xff1f;》里&#xff0c;我们知道了什么是跨境电商独立站&#xff0c;并且知道了独立站的优势和难点&#xff0c;那么这一篇文章里面&#xff0c;我会列举出一些常见的独立站运营模式&#xff0c;分类并不严谨&#xff0c;但目的是为了…

lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别

lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别 介绍for循环参数ipairs和pairs whilerepeat until总结 介绍 这里我用while、for、repeat until分别输出1-20之间的奇数 &#xff0c;具体的语法可以看下面的代码 for循环 参数 定义一个初始值为start…

Bytebase:让数据库管理和协作变得无缝

背景 在团队规模较小的时候&#xff0c;往往部门数量有限&#xff0c;沟通协作成本较低&#xff0c;暂时可以通过某几个人管理数据库的方式让独轮车跑起来。但是&#xff0c;随着团队规模的扩大&#xff0c;部门及人员数量的增长&#xff0c;部门间沟通协作成本增加&#xff0c…

【Proteus仿真】【Arduino单片机】数码管显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用TM1637、共阳数码管等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示数字、字符。 二、软件设计 /* 作者&#xff1a;嗨小易&am…

VSCode使用插件Github Copilot进行AI编程

演示示例 函数封装 根据上下文 根据注释 详情请看GitHub Copilot 安装插件 在VS Code中安装插件 GitHub Copilot 登录账号 点击VS code左下角账户图标&#xff0c;点击【Sign in】&#xff0c;会自动在浏览器打开Github登录页&#xff0c;登录具有 Github Copilot 服务的…

《国产服务器操作系统发展报告(2023)》重磅发布

11月1日&#xff0c;《国产服务器操作系统发展报告&#xff08;2023&#xff09;》&#xff08;以下简称“报告”&#xff09;在 2023 云栖大会上正式发布&#xff0c;开放原子开源基金会理事长孙文龙、中国信息通信研究院副总工程师石友康、阿里云基础软件部副总裁马涛、浪潮信…