2019-01-14

12.4 范围

为了让开发人员更方便的控制页面,“DOM2级遍历和范围”模块定义了“范围”(range)接口。通过范围可以选择文档中的一个区域,而不必考虑节点的界限(选择在后台完成,对用户是不可见的。)在常规的DOM操作不能更有效的修改文档时,使用范围往往可以达到目的。

12.4.1 DOM中的范围

DOM2级在Document类型中定义了createRange()方法。在兼容DOM的浏览器中,这个方法属于document对象。使用hasFeature()或者直接检测该方法都可以确定浏览器是否支持范围。
如果支持就可以使用createRang()来创建DOM范围:

var range = document.createRange();

与节点类似,新创建的范围也应该与创建它的文档关联在一起,不能用于其他文档。创建了范围之后,接下来就可以使用它在后台选择文档中的特定部分。
而创建范围并设置了其位置之后,还可以针对范围的内容执行很多种操作,从而实现对底层DOM树的更精细的控制。
每个范围由一个Range类型的实例标识,这个实例拥有很多属性和方法。在把范围放到文档中特定的位置时,这些属性都会被赋值:

1、用DOM范围实现简单选择

要使用范围来选择文档中的一部分,最简单的方式就是使用selectNode()或selectNodeContents()。这两个方法都接受一个参数,即一个DOM节点,然后使用该节点中的信息来填充范围。
◆ selectNode()方法选择整个节点,包含其子节点
◆ selectNodeContents()方法则只选择节点的子节点

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

    <script type="text/javascript">
        var range1 = document.createRange();//rang1包含<p/>元素及其所有子元素
              range2 = document.createRange();//rang2包含<br/>元素、文本节点“Hello”和文本节点"world"
              p1 = document.getElementById("p1");
        range1.selectNode(p1);
        range2.selectNodeCounts(p1);
    </script>

</html>

image.png
2、用DOM范围实现复杂选择

要创建复杂的范围就得使用setStart()和setEnd()方法。
这两个方法都接受两个参数:一个参照节点和一个偏移量值。
◆ setStart():参照节点会变成startContainer,而偏移量值会变成startOffset
◆ setEnd():参照节点会变成endContainer,而偏移量值会变成endOffset。

3、操作DOM范围中的内容

◆ deleteContents():这个方法能够从文档中删除范围所包含的内容
◆ extractContents():与deleteContents方法相似,也会从文档中移除范围选取。但这两个方法的区别在于,extractContents()会返回范围的文档片段。利用这个返回的值,可以将范围的内容插入到文档中的其他地方。
◆ cloneContents():使用此方法创建范围对象的一个副本,然后在文档的其他地方出入该副本。与extractContents()类似,都返回文档片段。主要的区别在于,cloneContents返回的文档片段包含的是范围中节点的副本,而不是实际的节点。

4、插入DOM范围中的内容

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

5、折叠DOM范围

所谓折叠范围,就是指范围中未选择文档的任何部分。可以用文本框来描述折叠范围的过程。
使用collapse()方法来折叠范围,这个方法接收一个参数,一个布尔值,表示要折叠到范围的哪一端。参数true表示折叠范围的起点,false表示终点。要确定范围已经折叠完毕,可以检查collapsed属性。

range.collapse(true);//折叠到起点
alert(range.collapsed);//输出true
6、比较DOM范围

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

7、复制DOM范围

使用cloneRange()方法复制范围。这个方法会创建调用它的范围的一个副本

var newRange=range.cloneRange();
//新创建的范围与原来的范围包含相同的属性,而修改它的端点不会影响到原来的范围
8、清理DOM范围

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

range.detach();//从文档中分离
range=null;//解除引用。
//一旦分离范围,就不能再恢复使用了。

————————————————————————————————

global对象

ES5的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的。

◆ 浏览器里面,顶层对象是window,但Node和Web Worker没有window。
◆ 浏览器和Web Worker里面,self也指向顶层对象,但是Node没有self。
◆ Node里面,顶层对象是global,但其他环境都不支持。

为了能在各种环境中,同段代码能取到顶层对象,一般使用this变量,但是有局限性。

◆ 全局环境中,this会返回顶层对象。但是,Node模块和ES6模块中,this返回的是当前模块
◆ 函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined
◆ 不管是严格模式,还是普通模式,new Function(‘return this’)(),总是会返回全局对象。但是,如果浏览器使用了CSP(Content Security Policy,内容安全策略。),那么eval、new Function这些方法都可能无法使用。

综上所述,很难找到一种方法,可以在所有情况下,都取到顶层对象。
有一提案,在语言标准的层面,引入global作为顶层对象。也就是说,在所有环境下,global都是存在的,都可以从它拿到顶层对象。

//CommonJS的写法
var global = require('system.global')();

//ES6 模块的写法
import getGlobal from 'system.global';
const global=getGlobal();

//上面代码将顶层对象放入变量global
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,527评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,687评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,640评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,957评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,682评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,011评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,009评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,183评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,714评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,435评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,665评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,148评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,838评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,251评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,588评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,379评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,627评论 2 380

推荐阅读更多精彩内容

  •   DOM 1 级主要定义的是 HTML 和 XML 文档的底层结构。   DOM2 和 DOM3 级则在这个结构...
    霜天晓阅读 1,474评论 1 3
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,149评论 0 21
  • 很迷茫。很害怕。很紧张。 不知道从何说起,就是感觉自己越来越无法掌控自己,对一个人情感的收放也好,对未来的规划也好...
    爱喝酸奶的猫阅读 172评论 0 0
  • 总之,无论是好时代还是坏时代,总有这么一些人努力了拼搏了成功了,乘风破浪,梦为航,梦想就是成功的导航。
    SENSO阅读 236评论 0 0
  • 不知该如何说,我这几天心脏间歇犯了,可我没说,所以没人知道,今天因为两句口角家人都知道了,可依然没人过问。 ...
    子关阅读 217评论 0 0