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

news2024/11/26 23:43:12

介绍

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) {
        // html
        copytext = copytext
            .split("<!--StartFragment-->")[1]
            .split("<!--EndFragment-->")[0];
    }

    html = copytext;

    // 插入元素节点
    insertHtml(html);

    // Prevent the default behavior of the paste event
    event.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.coloradmin.cn/o/1188548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu LTS 坚持 10 年更新不动摇

导读Linux 内核开发者 Jonathan Corbet 此前在欧洲开源峰会上宣布&#xff0c;LTS 内核的支持时间将从六年缩短至两年&#xff0c;原因在于缺乏使用和缺乏支持。稳定版内核维护者 Greg Kroah-Hartman 也表示 “没人用 LTS 内核”。 近日&#xff0c;Ubuntu 开发商 Canonical 发…

mybatis嵌套查询子集合只有一条数据

我们再用mybatis做嵌套查询时&#xff0c;有时会遇到子集合只有1条数据的情况&#xff0c;例如下这样&#xff1a; 数据库查询结果 xml <resultMap id"userMap" type"com.springboot.demo.test.entity.User"><id column"uid" property…

拓展认知边界:如何给大语言模型添加额外的知识

Integrating Knowledge in Language Models P.s.这篇文章大部分内容来自Stanford CS224N这门课Integrating Knowledge in Language Models这一节&#x1f601; 为什么需要给语言模型添加额外的知识 1.语言模型会输出看似make sense但实际上不符合事实的内容 语言模型在生成…

抓包工具fiddler的基础知识详解

一、简介 fiddler是位于客户端和服务端之间的http代理 1、作用 监控浏览器所有的http/https流量查看、分析请求内容细节伪造客户端请求和服务器请求测试网站的性能解密https的web会话全局、局部断电功能第三方插件 2、使用场景 接口调试、接口测试、线上环境调试、web性能分…

Git的简介以及基本使用

目录 一.Git的简介 拓展&#xff1a;Git与SVN的区别&#xff08;各自的优点与缺点&#xff09; 二.Git文件的4种状态 三.Git的常用命令 搭建完成之后&#xff0c;将项目文件也上传之后&#xff0c;现在模拟其他人来下载这个代码 今天就分享到这啦&#xff01;&#xff01;…

XX公司数字化项目管理办法

XX公司数字化项目管理办法 Ver2.0 第一章 总则 为规范XX公司项目从立项到结项的过程管理&#xff0c;明确各阶段建设主要工作及交付标准&#xff0c;提升数字化项目总体交付质量&#xff0c;特制定本管理制度。 本制度适用于数字化项目范围内咨询服务类、软硬件实施类项目。…

Power Apps-组件属性

图片组件兼容性 可以选择右侧属性面板中的图像位置&#xff0c;更改为匹配度&#xff0c;兼容性更好 按钮点击事件 Navigate(屏幕名)//跳转到某个页面 Back()//返回上一个页面

GZ038 物联网应用开发赛题第1套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第1套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员…

4.Swin Transformer目标检测——训练数据集

1.centos7 安装显卡驱动、cuda、cudnn-CSDN博客 2.安装conda python库-CSDN博客 3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 步骤1&#xff1a;准备待训练的coco数据集 下载地址&#xff1a;https://download.csdn.net/download/malingyu/88519420 htt…

基于GoogleNet深度学习网络的花朵类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. GoogleNet网络结构 4.2. 基于GoogleNet的花朵类型识别 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .............................…

PostgreSql中解析JSON字段和解析TEXT中的JSON字段

初始化操作 创建表 CREATE TABLE orders ( "ID" int8 NOT NULL,"info_j" json NOT NULL,"info_t" text NOT NULL );初始化表 INSERT INTO orders("ID", "info_j","info_t") VALUES (1, {"name":&qu…

基于公共业务提取的架构演进——外部依赖防腐篇

背景 有了前两篇的帐号权限提取和功能设置提取的架构演进后&#xff0c;有一个问题就紧接着诞生了&#xff0c;对于诸多业务方来说&#xff0c;关键数据源的迁移如何在各个产品落地&#xff1f; 要知道这些数据都很关键&#xff1a; - 对于帐号&#xff0c;获取不到帐号信息是…

番外篇:Linux中好玩的指令(Ubuntu环境)

前言 我知道&#xff0c;Linux的学习总是枯燥乏味的&#xff0c;今天给大家带来一些好玩的指令&#xff0c;供大家娱乐开心&#xff0c;整理不易&#xff0c;希望大家能够多多支持一下。 1. lolcat指令 输入以下命令即可安装lolcat&#xff1a; sudo apt-get install lolcat 安…

sql注入学习笔记

sql注入原理 掌握sql注入漏洞的原理掌握sql注入漏洞的分类 万能用户名 777 or 11 #原句 select userid from cms_users where username ".$username." and password".md5 ( $password ) ."输入过后为 select userid from cms_users where username …

8-1、T型加减速控制【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍步进电机T型加减速的控制方法&#xff0c;本小节主要内容为该控制方法的推导与计算。目前各平台对该控制方法介绍的文章目前较多&#xff0c;但部分关键参数并未给出推导过程&#xff0c;例如误差系数0.676的推导等&#xff0c;本节在现有文章框架下&a…

【算法练习Day43】最佳买卖股票时机含冷冻期买卖股票的最佳时机含手续费

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 最佳买卖股票时机含冷冻期买…

银行转账截图p图制作,电子回执单,建设的,用易语言开发的,分享源码

闲着很无聊&#xff0c;刚好网上找到了一个默认&#xff0c;当然这个模版图我加了水印&#xff0c;只能是娱乐用&#xff0c;做不了啥坏事哈&#xff0c;然后软件是用易语言开发的&#xff0c;一个画板一些标签编辑框快照生成功能实现了这个软件&#xff0c;下面看下我的界面。…

软件安全测试怎么做?如何确保软件授权安全

在数字化不断演进的今天&#xff0c;软件安全测试变得至关重要。它验证了软件是否容易受到网络攻击&#xff0c;并检验恶意或意外输入对操作的影响。安全测试的目标是保障系统和信息的安全性和可靠性&#xff0c;确保它们不接受未授权的输入。 一、安全测试准备 开发者必须认识…

报名开启丨2023 SpeechHome 语音技术研讨会

2023 SpeechHome 语音技术研讨会将于11月18日—11月19日&#xff0c;在北京举办&#xff0c;同时举行开源语音技术交流会和第八届Kaldi技术交流会。 欢迎大家报名参加&#xff08;报名链接在文末&#xff09;&#xff01; 本届研讨会覆盖5大主题&#xff0c;包括语音前沿技术…

Hadoop 视频分析系统

视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…