范围

为了让开发人员更加方便地控制页面“DOM2级遍历和范围”模块定义了“范围”接口

通过该接口开发人员可以选择文档中的一个区域,而不必考虑元素的界限

在常规操作不能有效地修改文档时,使用范围往往可以达到目的

DOM中的范围

DOM2级在Document类型中定义了 createRange()方法

在兼容该接口的浏览器中,该方法属于document对象

可以使用以下代码,检测浏览器对其的兼容

var supportsRange = document.implementation.hasFeature("Range","2.0");
var alsoSupportsRange = (typeof document.createRange ==="function");

如果浏览器支持范围,那么就可以使用createRange()来创建范围

var range = document.createRange();

与节点类似,创建的范围也会和文档关联,不能用于其它文档

每个范围由一个Range类型的实例表示

下列属性提供了范围在文档中的位置信息

  • startContainer:包含范围起点的节点(即选区中第一个节点的父节点)
  • startOffset:范围起点在startContainer 中的偏移量
  • endContainer:包含范围终点的节点(即选区中最后一个节点的父节点)
  • endOffset:范围终点在endContainer中的偏移量
  • commonAncestorContainer:距离起点和终点最近的公共祖先节点

用DOM范围实现简单选择

使用范围来选择文档中的一部分,最简单的方式就是通过

selectNode() 和 selectNodeContents()方法

这两个方法都接收一个参数,即一个DOM节点

selectNode 是将传入节点的整个节点作为范围

selectNodeContents则是将传入节点的所有子节点作为范围

例如:

<p id = "p1"><b>hello</b>world!</p>

对于以上HTML代码

使用以下代码创建范围

var range1 = document.createRange();
var range2 = document.createRange();
var p1 = document.getElementById('p1'); range1 = range1.selectNode(p1);
range2 = range2.selectNodeContents(p1);

对于上述代码

range1包含的文档内容如下:

<p id = "p1"><b>hello</b>world!</p>

range2包含的文档内容如下:

<b>hello</b>world!

此外,为了更加精细地控制将哪些节点包含在范围中,还可以使用以下方法

  • setStartBefore(refNode):将范围起点设置在 refNode 之前(也就是refNode作为范围的第一个子节点)
  • setStartAfter(refNode):将范围起点设置在 refNode 之后(即refNode的下一个同辈节点作为范围的第一个子节点)
  • setEndBefore(refNode):将范围终点设置在 refNode 之前
  • setEndAfter(refNode):将范围终点设置在 refNode 之后

使用这里提到的方法会自动设置范围属性,当然也可以通过设置范围属性来改变选区的范围

即startContainer、startOffset、endContainer、endOffset、commonAncestorContainer这些选区属性

用DOM范围实现复杂选择

当我们需要更加复杂的选区,比如我们需要选择某个节点的一部分时

要创建这样复杂的节点,则需要使用 setStart()和 setEnd()来分别设置范围的起止位置

这两个方法都接收两个参数:

1.DOM节点

2.开始/结束位置在节点中的偏移量

同样下方的HTML代码为例

<p id = "p1"><b>hello</b>world!</p>

这里我们使用setStart()和 setEnd()来实现之前的range1、range2

即如下方代码所示:

var range1 = document.createRange();
var range2 = document.createRange();
var p1 = document.getElementById('p1');
var Index = -1;//用于表示p1在其父节点中的偏移 for(let i = 0,len = p1.parentNode.childNodes.length;i<len;i++){
if(p1.parentNode.childNodes[i] === p1){
Index = i;
break;
}
} range1.setStart(p1.parentNode, Index);
range1.setEnd(p1.parentNode, Index+1);
range2.setStart(p1, 0);
range2.setEnd(p1, p1.childNodes.length);

Javascript高级编程学习笔记(54)—— DOM2和DOM3(6)范围选择的更多相关文章

  1. Javascript高级编程学习笔记(49)—— DOM2和DOM3(1)DOM变化

    DOM变化 我们知道DOM有许多的版本,其中DOM0和DOM2这两个级别以对事件的纳入标准而为人所知 但是呢,这里不讲事件,在后面会有专门和事件有关的部分作为详细讲解 这里就只讲一下DOM2和DOM3 ...

  2. Javascript高级编程学习笔记(1)—— JS简介

    此系列文章,用于记录所学,如有错误欢迎指出. Javascript组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 1.核心(ECMAScript) E ...

  3. Javascript高级编程学习笔记(53)—— DOM2和DOM3(5)遍历

    遍历 “DOM2级遍历和范围” 定义了两个用于辅助完成顺序遍历的DOM结构类型 NodeIterator 和 TreeWalk 上述两种类型可以基于给定起点的DOM结构执行深度优先的遍历操作 对于检测 ...

  4. Javascript高级编程学习笔记(52)—— DOM2和DOM3(4)元素大小

    在日常实践中,我们在使用JS的时候难免会需要获取元素的大小及位置 首先要声明的是,这一部分的内容并不属于DOM2样式规范,因为DOM中并没有对我们如何获取元素大小的相关信息做出规范 偏移量 偏移量及元 ...

  5. Javascript高级编程学习笔记(50)—— DOM2和DOM3(2)样式

    样式 在HTML中定义元素的方式有以下三种: 1.link标签引入外部样式表 2.style标签定义嵌入样式 3.通过JS中对style特性定义元素样式(行内样式) “DOM2级样式”围绕上述样式机制 ...

  6. Javascript高级编程学习笔记(56)—— DOM2和DOM3(8)低版本IE范围

    虽然IE9支持了DOM范围,但是IE8及更早版本并不支持DOM范围 所以IE8以下的更早版本的IE提出了与之类似的概念以供大家使用 也就是 文本范围 var range = document.body ...

  7. Javascript高级编程学习笔记(55)—— DOM2和DOM3(7)操作范围

    操作范围中的内容 在创建范围时,内部会为这个范围创建一个文档片段 范围所属的全部节点都会被添加到这个片段中 虽然选取范围可以不是完整的.良好的DOM结构 但是在这个为范围创建的文档片段中,会自己完缺少 ...

  8. Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表

    操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...

  9. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

随机推荐

  1. mycat使用之MySQL单库分表及均分数据

    转载自 https://blog.csdn.net/smilefyx/article/details/72810531 1.首先在Mycat官网下载安装包,这里就以最新的1.6版本为例,下载地址为:  ...

  2. NoteBook学习(二)-------- Zeppelin简介与安装

    Zeppelin官网地址: http://zeppelin.apache.org/ Github地址: https://github.com/apache/zeppelin (参照官网) 1.什么是z ...

  3. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

  4. 第二期,问道PC端游戏免安装,下载即可体验

    最近 迷恋游戏搭建不能自拔.搭建过 手游梦幻诛仙,传奇等等. 今天还是推荐PC端的问道这款游戏,原因是个人投入修改的时间太多了.基本完善了好多.这还得感谢这都是论坛的各位大佬体验的结果. 原来这个游戏 ...

  5. spring微服务架构-脑图

    spring团队对新一代软件开发的思索.为什么软件开发是spring boot?为什么软件开发是spring cloud?如何使用spring cloud搭建微服务. 清晰脑图查看

  6. grunt压缩js代码

    安装node.js的环境和grunt插件在上一篇已经将过,点击这里跳到上一篇 所以我们直接从压缩插件的安装开始讲 起 1.安装uglify插件 目录结构如下: 命令行:npm install grun ...

  7. python 数据可视化 -- 清理异常值

    中位数绝对偏差(Median Absolute Deviation, MAD)用来描述单变量(包含一个变量)样本在定量数据中可变性的一种标准.常用来度量统计分布,因为它会落在一组稳健的统计数据中,因此 ...

  8. thinkpadE系列重装系统:u盘启动

    一.下载深度装机大师,制作启动u盘. 二.重启电脑:按F1;进入bios设置:     thinkpad e430c笔记本使用u盘装系统时无法使用u盘启动,这是由于thinkpad e430c笔记本u ...

  9. 【Selenium】【BugList6】调用IE,未启用保护模式,报:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones.

    >>> driver = webdriver.Ie() 解决方法: 1.打开Ie浏览器 , 工具 ->Internet选项 ->安全 2.去掉4个区域的安全保护模式

  10. 51Nod - 1046 (附关于快速幂的讨论)

    题意: 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. 分析: 快速幂模板题. 快速幂: 1.自然数的拆分 对于任何的自然数, 可以把它用形如1001 ...