DOM中的范围

JS 处理文档选择和范围创建【createRange | getSelection】 JS在光标、文本选择方面的应用 阅读详情

DOM2级遍历和范围模块定义了范围(range),通过范围可以选择文档中的一个区域,而不必考虑节点的界限。在常规的DOM操作不能有效地修改文档时,使用范围往往可以达到目的。

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

1.创建范围

const range = document.createRange();

每一个范围由一个Range类型的实例表示,Range拥有以下属性:

startContainer: 包含范围起点的节点(选中区第一个节点的父节点)

startOffset: 范围在startContainer中的偏移量

endContainer: 包含范围终点的节点(选中区最后一个节点的父节点)

endOffset: 范围在endContainer中的偏移量

commonAncestorContainer: startContainer和endContainer共同的祖先节点在文档树种位置最深的那个

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

使用范围选择文档中的一部分,最简单的方式就是使用selectNode或selectNodeContents,这两个方法接受一个DOM节点作为参数。selectNode方法会选择整个节点(包括子节点),selectNodeContents方法只选择节点的子节点。

const range1 = document.createRange();
const range2 = document.createRange();
const p1 = document.querySelector("#p1");

range1.selectNode(p1);                     // 选中<p id="p1"><b>Hello</b> world!</p>
range2.selectNodeContents(p1);             // 选中<b>Hello</b> world!

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

要创建复杂选择就需要用setStart和setEnd方法。这两个方法都接受两个参数:一个参照节点和一个偏移量。对于setStart来说,参照节点会变成startContainer,偏移量会变成startOffset。对于setEnd来说,参照节点会变成endCOntainer,偏移量会变成endOffset。

const p1 = document.querySelector("#p1");
const range = document.createRange();
const helloNode = p1.firstChild.firstChild;
const worldNode = p1.lastChild;

// 选区从"Hello"的"e"后面开始,到" world!"的"r"之前结束
range.setStart(helloNode, 2);
range.setEnd(worldNode, 3); 

4.删除DOM范围中的内容

想要从文档中删除范围所包含的内容就需要用到deleteContents方法。

const p1 = document.querySelector("#p1");
const range = document.createRange();
const helloNode = p1.firstChild.firstChild;
const worldNode = p1.lastChild;

// 选区从"Hello"的"e"后面开始,到" world!"的"r"之前结束
range.setStart(helloNode, 2);
range.setEnd(worldNode, 3); 

// 页面html会变成"<p id="p1"><b>He</b>rld!</p>"
range.deleteContents();

使用extractContents方法可以达到同样的效果,但区别在于它会返回删除的文档范围片段。利用这个返回值,可以将范围的内容插入到文档的其他地方。

const p1 = document.querySelector("#p1");
const range = document.createRange();
const helloNode = p1.firstChild.firstChild;
const worldNode = p1.lastChild;

// 选区从"Hello"的"e"后面开始,到" world!"的"r"之前结束
range.setStart(helloNode, 2);
range.setEnd(worldNode, 3); 

// 页面html会变成"<p id="p1"><b>He</b>rld!</p>"
const fragment = range.extractContents();
p1.parentNode.appendChild(fragment);

另外一种做法,使用cloneContents方法创建范围的一个副本,然后再文档的其他地方插入该副本。

const p1 = document.querySelector("#p1");
const range = document.createRange();
const helloNode = p1.firstChild.firstChild;
const worldNode = p1.lastChild;

// 选区从"Hello"的"e"后面开始,到" world!"的"r"之前结束
range.setStart(helloNode, 2);
range.setEnd(worldNode, 3); 

// 页面html会变成"<p id="p1"><b>He</b>rld!</p>"
const fragment = range.cloneContents();
p1.parentNode.appendChild(fragment);

 5.插入DOM范围中的内容

使用insertNode方法可以向范围选区的开始处插入一个节点。

const p1 = document.querySelector("#p1");
const range = document.createRange();
const helloNode = p1.firstChild.firstChild;
const worldNode = p1.lastChild;

// 选区从"Hello"的"e"后面开始,到" world!"的"r"之前结束
range.setStart(helloNode, 2);
range.setEnd(worldNode, 3); 

// 页面html会变成
// <p id="p1"><b>He<span style="color: red">Inserted text</span>llo</b> world!</p>"
const span = document.createElement("span");
span.style.color = "red";
span.appendChild(document.createTextNode("Inserted text"));
range.insertNode(span);

6. 折叠DOM范围

所谓折叠范围,就是指范围中未选择文档的任何部分。在折叠范围时,光标的位置会落在文档中的两个部分之间,可能是范围选区的开始位置,也可能是结束位置。

使用collapse方法来折叠范围,这个方法接受一个布尔值作为参数,表示折叠到范围的那一端,true表示折叠到范围的起点,false表示折叠到范围的终点。要确定范围是否已经折叠完毕,可以检查collapsed属性。

range.collapse(true);            // 折叠到起点
alert(range.collapsed);          // 输出true

检测某个范围是否处于折叠状态,可以帮助我们确定范围中的两个节点是否相邻。

<p id="p1">Paragraph 1</p><p id="p2">Paragraph 2</p>
const p1 = document.querySelector("#p1");
const p2 = document.querySelector("#p2");
const range = document.createRange();

range.setStartAfter(p1);
range.setEndBefore(p2);
alert(range.collapsed);                  // 输出true

7.比较DOM范围

在有多个范围的情况下,可以使用compareBoundaryPoints方法来确定这些范围是否有公共的边界。这个方法接受两个参数:表示比较方式的常量值和要比较的范围。表示比较方式的常量值如下:

Range.START_TO_START(0):比较第一个范围和第二个范围的起点

Range.START_TO_END(1):比较第一个范围的起点和第二个范围的终点

Range.END_TO_END(2):比较第一个范围和第二个范围的终点

Range.END_TO_START(3):比较第一个范围的终点和第二个范围的起点

compareBoundaryPoints方法可能的返回值如下:

如果第一个范围中的点位于第二个范围中的点之前,则返回-1

如果第一个范围中的点第二个范围中的点相等,则返回0

如果第一个范围中的点位于第二个范围中的点之后,则返回1

const p1 = document.querySelector("#p1");
const range1 = document.createRange();
cosnt range2 = document.createRange();

range1.selectNodeContents(p1);
range2.selectNodeContents(p1);
range2.setEndBefore(p1.lastChild);

alert(range1.compareBoundaryPoints(Range.START_TO_START, range2);        // 0
alert(range1.compareBoundaryPoints(Range.END_TO_END, range2);            // 1

8.清理DOM范围

在使用玩范围之后,最好调用detach方法,以便从创建范围的文档中分离该范围。调用detach方法后,就可以放心的解除对范围的引用,从而让垃圾回收机制回收其内存。

range.detach();         // 从文档中分离
range = null;           // 解除引用
手把手教你用89C52单片机驱动0.96寸OLED(IIC接口,附完整代码) 本文详细介绍了如何使用89C52单片机通过I2C接口驱动0.96寸OLED显示屏,包括硬件连接、I2C通信原理、SSD1306驱动芯片的初始化及显存管理技巧,并提供了完整的代码示例和常见问题排查方法,帮助电子爱好者快速掌握OLED显示技术。 阅读详情

相关推荐

【SAP中的框架协议】

在SAP中,框架协议(Framework Agreement) 是企业与供应商签订的长期采购约束文件,用于简化重复性采购流程、锁定交易条款并降低管理成本。

m0_73548864的博客 1298

selectNode、selectNodeContents 区别

SelectNode() range对象的SelectNode将用于range对象起点指定于某个节点的起点,将range对象的终点指定于该对象的终点,使range对象所代表的区域中包含该节点,该方法并不把该节点设为高亮选取状态。 **设置该方位的边界点,使它包含指定节点和它所有子孙节点 语法:selectNode(refNode) SelectNodeContents() r

Hello World ~ 7474

别再手动调参了!用Optuna+PyTorch搞定Transformer时序预测超参数(附完整代码)

本文详细介绍了如何利用Optuna和PyTorch实现Transformer时序预测模型的自动化超参数调优。通过贝叶斯优化技术,显著提升单变量时序预测的效率和准确性,并附有完整代码实现。文章涵盖模型架构设计、数据预处理、Optuna调参实战及生产环境部署建议,为开发者提供一站式解决方案。

weixin_33704234的博客 579

选中div内文本复制后会多一个换行符_javascript

选中div内文本复制后会多一个换行符_javascript

qq_38871503的博客 2370

PX4算法解析:L1制导律

一、前沿 从今天开始,会陆续为大家解读开源飞控软件px4中使用到的各种算法,今天要讲述的是L1制导律,这是固定翼飞机进行路径跟踪的重要算法之一。这个算法是由MIT的研究人员提出,因为具有比较好的路径跟踪效果而得到广泛应用。在这之前,无人机在进行路径跟踪时一般采用基于侧偏距的PD控制器方法,至于为什么使用PD而不使用PID算法,那是因为位置环响应较慢,所以一般在外环采用PD算法,而在内环采用PID算...

weixin_44616080的博客 8257

吉比特-笔试

1. 题一:打雷后下雨的概率是80%,而打闪电后下雨的概率是70%,那么即打雷又打闪电后下雨的概率是多少?   答:打雷后下雨和打闪电后下雨都是独立事件,P=1-又打雷又闪电但没下雨的概率= 1 - 0.2 *0.3 = 94%        题二:打雷后下雨的概率是80%,但是没打闪电后下雨的概率是20%,那么打雷了但没打闪电后下雨的概率是多少?答:P=0.8 *0.2 / ( 0.8 *0

naturism的专栏 2496

javascript基础学习系列二百五十九:简单选择和复杂选择

通过范围选择文档中某个部分最简单的方式,就是使用 selectNode()或 selectNodeContents() 方法。这两个方法都接收一个节点作为参数,并将该节点的信息添加到调用它的范围。selectNode()方 法选择整个节点,包括其后代节点,而 selectNodeContents()只选择节点的后代。例子中的这两个范围包含文档的不同部分。range1 包含元素及其所有后代,而 range2 包含元素、文本节点"Hello"和文本节点" world!

m0_68635815的博客 727

R语言基础之R语言入门

R语言最初是由新西兰奥克兰大学统计系的教授Ross Ihaka和Robert Gentleman在S语言基础上开发完成的。是一门解释性语言。在我看来R语言是一门数学性极强的语言,或者说这是一门为数学而生的语言,因为其具有极其出色的计算与统计分析能力...

weixin_46912400的博客 5万+

不规则图形精确点击策略

不规则colider :Ploygon Colider2D public class CustomImage : Image { private PolygonCollider2D _polygon; private PolygonCollider2D Polygon { get { if (_polygon == null) ...

weixin_45554040的博客 319

DeepSeek-V4 本地部署实战指南:4套方案从入门到企业级(附RTX 5090实测数据)

V4-Flash 便宜是便宜,输入 1 元/M token,输出 2 元/M token,但量大了还是肉疼。V4-Pro 更离谱,输入 12 元/M token,输出 24 元/M token,这价格要是天天调用,月账单轻松破万。用 4-bit 量化跑 V4-Flash,显存占用 ~22GB,延迟 ~80ms/token,并发能到 2-3 路。换句话说,同样的硬件,能跑更长的上下文、更大的并发。Flash 是「小而美」,一张 RTX 4090/5090 就能跑,门槛低,效果够用。

datayx的文章 9874

Bellhop海底地形仿真入门:从MATLAB数据导入到3D可视化(附避坑指南)

本文详细介绍了Bellhop海底地形仿真的完整工作流程,从MATLAB数据导入、清洗与坐标转换,到构建.bty输入文件,再到生成高质量3D可视化结果。文章重点解析了数据格式、深度值正负、单位统一及坐标投影等关键环节的避坑指南,并提供了可复用的代码片段,帮助用户高效完成从原始数据到仿真成果的转换。

weixin_29275257的博客 194

DOM 中的范围

为了让开发人员更方便控制页面,DOM2 级遍历和范围模块定义了 范围 (range) 接口。通过范围可以选择文档中的一个区域,而不必考虑节点的界限(选择在后台完成,对用户是不可见的)。 Firefox、Opera、Safari 和 Chrome 都支持 DOM 范围。IE 以专有方式实现了自己的范围特性。 DOM 中的范围 DOM2 级在 Document 类型中定义了 createRange()...

weixin_33834679的博客 337

美军利用MANET技术实现无人作战单元协同作战

本文首先介绍了移动自组织网络 (MANET)以及Wave Relay®波形中继技术,并探讨了波形中继MANET平台在美空军ABMS项目等军事方面的运用情况。

guanyifu9的博客 855

Dom中的范围

DOM2级在Document类型中定义了createRange()方法。在兼容DOM浏览器的浏览器中,这个方法属于document对象。使用hasFeature()或者直接检测该方法,都可以确定浏览器是否支持范围 var supportRange=document.implementation.hasFeature("Range","2.0"); 如果浏览器支持范围,那么就可以使用create

charlene0824的博客 936

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

DOM中的范围 createRange()

学习《JavaScript 高级程序设计》 12章dom范围的笔记 dom2级在Document类型中定义了 createRange()方法; 创建range对象很简单var range = document.createRange() 操作range对象,有两个步骤,1选择节点,2,操作节点 选择节点: 最简单的选择节点方法: selectNode():选择整个节点,包括子节...

weixin_30654583的博客 384

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

DOM范围

前面的话   为了让开发人员更方便地控制页面,DOM定义了“范围”(range)接口。通过范围可以选择文档中的一个区域,而不必考虑节点的界限(选择在后台完成,对用户是不可见的)。在常规的DOM操作不能更有效地修改文挡时,使用范围往往可以达到目的。本文将详细介绍DOM范围   创建范围   Document类型中定义了createRange()方法。在兼容DOM的浏览器中,这个方法属于doc

vnddtt3b的专栏 279

javascript基础从小白到高手系列一百三十七:范围折叠

在这段代码中,两个范围的起点是相等的,因为它们都是selectNodeContents()默认返回的值。折叠范围可以使用collapse()方法,这个方法接收一个参数:布尔值,表示折叠到范围哪一端。这时候,如果再单击鼠标,则选区会被移。在两个范围的边界点相等时返回0,在第一个范围的边界点位于第二个范围的边界点之后时返回1。 通过范围的选区可以在保持文档结构完好的同时从文档中移除内容,也可复制文档中相应的部分。 Range.END_TO_START(3),比较第一个范围的终点和第二个范围的起点。

wanmeijuhao的博客 700

DOM2级遍历和范围 P326

一、遍历 ‘DOM2级遍历和范围’模块定义了两个辅助完成顺利遍历DOM结构的类型:NodeIterator和TreeWalker; 这两个类型能够基于给定的起点对DOM结构执行深度优先的遍历操作。IE不支持DOM遍历。 使用下列代码可以检测浏览器对DOM2级遍历能力的支持情况: var supportsTraversals=document.implementation.hasFeatu...

weixin_33912246的博客 114

JavaScript DOM2和DOM3——“范围”的注意要点

“DOM2级遍历和范围”模块定义了“范围”接口。通过范围可以选择文档中的一个区域,而不必考虑节点的界限(选择在后台完成,对用户是不可见的)。 DOM中的范围 DOM2级在Document类型中定义了createRange()方法,可以用来创建DOM范围,如下所示: var range = document.createRange(); ...

weixin_34150503的博客 246

DOM2中的Range

DOM2 级在 Document 类型中定义了 createRange()方法。在兼容 DOM 的浏览器中,这个方法属于 document 对象。使用 hasFeature()或者直接检测该方法,都可以确定浏览器是否支持范围。 var supportsRange = document.implementation.hasFeature("Range", "2.0"); var alsoS...

惊蛰小鱼的博客 441

DOM2范围

DOM2范围 除了IE低版本(ie8-),其余主流浏览器都支持DOM2的范围,然而IE用其特有的方式实现了范围特性! Document类型中定义了createRange(),这个方法属于document对象,首先检测浏览器是否支持他: var supportRange=document.implementation.hasFe...

weixin_34389926的博客 189

DOM 之Range(范围)

-------《javascript高级程序设计》 12.4 范围 笔记------- DOM2级在Document类型中定义了createRange()方法,在兼容DOM的浏览器中,这个方法属于Document对象。可以使用HasFeature方法来检测浏览器是否支持范围 var supportsRange = document.implementation.hasFeature(‘R...

weixin_30735745的博客 460

前端重新学习(5)DOM与DOM2、DOM3区别以及DOM2新特性

------------摘抄自他人笔记(http://itbilu.com/javascript/js/Vyxodm_1g.html、https://blog.youkuaiyun.com/pxy_lele/article/details/49755071) 感谢分享---------------------- 目录 DOM0、DOM1、DOM2、DOM3的区别 DOM0 DOM0与DHTML ...

qq_16546829的博客 5396
上一篇: js数组相关操作
下一篇: 写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?
也无风雨丶
博客等级 码龄10年 52粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值