-------《javascript高级程序设计》 12.4 范围 笔记-------javascript
DOM2级在Document类型中定义了createRange()方法,在兼容DOM的浏览器中,这个方法属于Document对象。能够使用HasFeature方法来检测浏览器是否支持范围html
var supportsRange = document.implementation.hasFeature(‘Range’, ‘2.0’)java
var alsoSupportsRange = (typeof document.createRange == ‘function’);浏览器
var range = documemt.createRange(); 字体
新建立的范围直接与建立它的文档关联在一块儿,不用用于其余文档。每个范围由一个Range类型的实例表示。 它有不少属性及方法this
1. startContainer: 包含范围起点的节点(即选区中第一个节点的父节点) spa
2. startOffset: 范围在startComtainer中起点的偏移量,若是startContainer是文本节点、注释节点或CDATA节点,那么startOffset就是范围起点以前的跳过的字符数量,不然,startOffset就是范围中第一个子节点的索引。 设计
3. endContainer 包含范围终点的节点(即选区中最后一个节点的父节点) code
4. endOffset: 范围在endContainer中节点的偏移量(与startOffset遵循相同的取值规则) htm
5. commonAncestorContainer: startContainer和endContainer共同的祖先节点在文档树中位置最深的那个
2、用DOM范围实现简单选择
选用的方法 selectNode() 或者selectNodeContents()
1.这两个方法都接受一个参数,即一个DOM节点。但selectNode()方法选择整个节点,包括其子节点,而selectNodeContents()方法只是选择节点的子节点,
range
range
------为了更精细的控制将哪些节点包含在范围中,还能够使用下列方法 ------
1. setStartBefore(refNode) 将范围的起点设置在refNode以前,所以refNode也就是范围选区中的第一个子节点,同时会将startContainer属性设置为refNode.parentNode,将startOffset属性设置为refNode在其父节点的childNodes集合中的索引
2. setStartAfter(refNode) 将范围的起点设置在refNode以后,所以refNode也就不在范围以内了,其下一个同辈节点才是选区中的第一个子节点,同时会将startContainer属性设置为refNode.aprentNode,将startOffset属性设置为refNode在其父节点的childNodes集合中的索引加1;
3. setEndBefore(refNode): 将范围的终点设置在refNode以前,所以refNode也就不在范围以内了,其上一个同辈节点才是范围选区中的最后一个子节点。同时会将endContainer属性设置为refNode.parentNode,将endOffset属性设置为refNode在其父节点的childNodes集合中的索引;
4. setEndAfter(refNode) 将范围的终点设置 在refNode以后,所以refNode也就是范围选区中的最后一个子节点。同时会将endContainer属性设置为refNode.parentNode,将endOffset属性设置为refNode在其父节点的childNodes集合中的索引加1
---- 用DOM范围实现复杂选择 -----
要实复杂的范围就使用setStart() 和setEnd() 方法,这两个方法都接受两个参数: 一个参照节点和一个偏移量值
setStart() 参照节点会变成startContainer,而偏移量值会变成startOffset
setEnd() 参照节点会变成endContainer,偏移量会变成endOffset
用这两个方法重写前面selectNode()与selectNodeContents()方法
range
setStart() 与setEnd()方法的运用
range
-----操做DOM范围中的内容-----
在建立范围时,内部会为这个范围建立一个文档片断.范围所属的所有节点都被添加到了这个文档片断中,范围知道自身缺乏哪些开标签和闭标签,它可以从新构建有效的DOM结构以便咱们对其进行操做
针对上面的例子,选区变为了 ‘llo’</b>wo 不是一个有效的DOM结构,但范围会自动添加缺乏的,最终变成了
<p><b>he</b><b>llo</b> wo rld</p> 范围内的文档片断是
1. deleteContents() 从文档中删除范围所包含的内容,没有返回值
2.extractContents() 也会从文档中移除范围选区,但会返回范围的文档片断,能够进行其余做用
3.cloneContents() 建立范围对象的一个副本,而后在文档的其余地方插入该副本; 在调用方法以前,拆分的节点并不会产生格式良好的文档片断,换句话说,原始的HTMl在DOM被修改以前会始终保持不变
4.insertNode(Node) 向范围选区的开始处插入一个节点
5. surroundContents() 环绕范围内容插入内容, 接受一个参数,即环绕范围插入的节点
在环绕范围插入内容时,后台会执行下列步骤
1) 提取出范围中的内容(相似执行extractContent());
2) 将给定节点插入到文档中原来范围所在的位置上;
3) 将文档片断的内容添加到给定节点中;
6. 折叠DOM范围
就是范围中未选择文档的任何部分;collapse()方法来折叠范围,这个方法接受一个参数(布尔值) true 表示折叠到范围的起点,false表示折叠到范围的终点。要检测范围已经折叠完毕,能够检查collapsed属性
检测某个范围否处于折叠状态,能够帮咱们肯定范围中的两个节点是否紧密相邻。 将一个范围设置第一个节点的终点,另外一个范围设置为第二个节点的起点,若是两个节点是相邻了 这个范围就折叠完毕,
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
range
8.cloneRange() 复制范围
9. detach() 从建立范围文档中分离出该范围。从而让垃圾回收机制回收其内存
range.detach();
range = null
IE专有的文本范围(text range) 文本范围处理的主要是文本(不必定是DOM节点),经过<body>,<button>.<input>.<textarea> 等这几个元素能够调用createTextRange()方法来建立文本范围
1.findText() 会找到第一次出现的给定文本,并将范围移过来环绕该文本。若是没找到文本,返回false,不然返回true
textRange
文本'hello’就被包含在范围以内。能够检测范围的text属性,来确认(这个属性返回范围中包含的文本),或者能够检查findText()的返回值
还能够为findText()传入另外一个参数,即表示向哪一个方向继续搜索的数值,负值表示应该从当前位置向后搜索,正值表示从当前位置向前搜索
2.moveToElementText() 接受一个DOM元素,并选择该元素的全部文本,包含HTML标签,(与selectNode相似)
能够使用range的htmlText属性来取得范围的所有内容。包含HTMl和文本
3. parentElement() (与commonAncestorContainer属性相似)
-----使用IE范围实现复杂的选择---
1. move() moveStart() moveEnd() expend() 这四个方法都接受两个参数,移动单位和移动单位的数量
移动单位是下列的一种字符串值
‘character’ 逐个字符地移动
'word’ 逐个单词(一系列非空字符)地移动
'sentence’ 逐个句子(一系列以句号、问号或叹号结尾的字符)地移动
'textedit’ 移动到当前范围选区的开始或结束位置
moveStart() moveEnd() 能够移动范围的起点和终点,移动的副度同单位数量指定 (正值表示缩小范围,负值表示增大范围)
expand() 能够将范围规范化。(将任何部分选择的文本所有选中)
move() 方法会首先折叠当前范围(让起点和终点相等),而后再将移动指定的单位数量
调用move()以后,范围的起点与终点相同,所以必须再使用moveStart() 或moveEnd()建立新的选区
2.操做范围中的内容能够使用text属性或pasteHTML()方法,
text属性是可读写的 ,能够获取范围内的文本,也能够设置范围内的文本
pasteHTMl() 方法能够设置范围内的HTMl,插入HTMl时可能会致使格式不正确的HTMl存在(范围选取时截取了标签)
3. 折叠范围
collapse() 参数为布尔值,true 折叠到起点。false折叠到终点
IE没有collapsed属性来检测是否折叠完毕,但能够使用boundingWidth属性。该属性返回范围的宽度(以像素为单位),折叠完毕后boundingWidth返回值为0 (boundingTop,boundingHeight,boundingWidth,boundingLeft
4. 比较IE范围
compareEndPoints() 方法 (与DOM范围中的compareBoundaryPoints()方法相似) 接受两个参数:比较的类型和要比较的范围。比较类型的取值范围是下列几个字体串
'startToStart’ , ‘startToEnd’ ‘EndtoEnd’ ‘EndToStart’
compareEndPoints()方法返回值(与DOM的compareBoundaryPoints()方法同样)
若是第一个范围的边界位于第二个范围的边界前面,返回-1;
若是两个边界相同,返回0;
若是第一个范围的边界位于第二个边界的后面,返回1
IE中还有两个方法,用于比较范围
isEqual() 肯定两个范围是否相等
inRange() 用于肯定一个范围是否包含另外一个范围
5.复制IE范围
duplicate()方法能够复制文本范围