Range对象的概念

Range对象代表页面上一段间断的区域,通过Range对象能够获取或者批改页面上任何区域的内容。也能够通过Range的办法进行复制和挪动页面任何区域的元素,甚至能够通过Range对象获取并管制光标地位

获取页面Range对象

var  selection = window.getSelection();   var  range = selection.getRangeAt(0);//getRangeAt办法获取range,参数为range下标

每一个selection对象都有一个或者多个Range对象,每一个range对象代表用户鼠标所选取范畴内的一段间断区域,在firefox中,能够通过ctrl键能够选取多个间断的区域,因而在firefox中一个selection对象有多个range对象,在其余浏览器中,用户只能选取一段间断的区域,因而只有一个range对象。

创立Range对象

var range = document.createRange();

Range对象的属性和办法

(1)属性

startContainer
蕴含“终点”的节点。“蕴含”的意思是终点所属的节点。
endContainer
蕴含“完结点”的节点
startOffset
“终点”在startContainer中的偏移量。
如果startContainer是文本节点、正文节点或CDATA节点,则返回“终点”在startContainer中字符偏移量。
如果startContainer是元素节点,则返回“终点”在startContainer.childNodes中的秩序。
collapsed
终点和完结点在一起时为true;Range对象为空(刚createRange()时)也为true。
commonAncestorContainer
第一个蕴含Range的节点,即同时蕴含Range的终点和完结点。

(2)定位(设置“终点”和“完结点”)的一些办法

setStart(node, offset)和setEnd(node, offset)
setStart:设置终点的地位,node是对startContainer的援用,偏移则是startOffset;
setEnd:设置完结点的地位,node是对endContainer的援用,偏移则是startOffset;
代码如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>range3</title> <script>  function deleteChar() {      var div = document.getElementById("myDiv");      var textNode = div.firstChild;      var rangeObj = document.createRange();      rangeObj.setStart(textNode,1);     rangeObj.setEnd(textNode,4);     rangeObj.deleteContents();}</script></head><body>     <div id="myDiv" style="color:red">这段文字是用来删除的</div>     <button onclick="deleteChar()">删除文字</button></body></html>

setStartBefore(referenceNode)、setStartAfter(referenceNode)
setEndBefore(referenceNode)、setEndAfter(referenceNode)
setStartBefore:将“终点”设置到referenceNode前
setStartAfter:将“终点”设置到referenceNode后
setEndBefore:将“完结点”设置到referenceNode前
setEndAfter:将“完结点”设置到referenceNode后
留神:应用这四个办法设置的“终点”或“完结点”的父节点与referenceNode的父节点是同一个元素。
代码如下:

<!DOCTYPE html><html>    <head>        <meta charset="utf-8">        <title></title>        <script type="application/javascript">            function delrow(){                var table=document.getElementById("mytable");                if(table.rows.length>0){                    var row=table.rows[0];                    var rangeObj=document.createRange();                    rangeObj.setStartBefore(row);                    rangeObj.setEndAfter(row);                    rangeObj.deleteContents();                }            }        </script>    </head>    <body>        <table id="mytable" border="1">            <tr>                <td>内容1</td>                <td>内容2</td>            </tr>            <tr>                <td>内容3</td>                <td>内容4</td>            </tr>        </table>        <button onclick="delrow()">删除第一行</button>    </body></html>

selectNode(referenceNode)和selectNodeContents(referenceNode)
selectNode:设置Range的范畴,包含referenceNode和它的所有后辈(子孙)节点。
selectNodeContents:设置Range的范畴,包含它的所有后辈节点。

(3)批改范畴的办法

cloneRange()
cloneRange()办法将返回一个以后Range的正本,它也是Range对象。
cloneContents()
能够克隆选中Range的fragment并返回改fragment。这个办法相似extractContents(),但不是删除,而是克隆
deleteContents()
从Dom中删除Range选中的fragment。留神该函数没有返回值(实际上为undefined)。
extractContents()
将选中的Range从DOM树中移到一个fragment中,并返回此fragment
insertNode
insertNode办法能够插入一个节点到Range中,留神会插入到Range的“终点”
collapse()
Range.collapse() 办法向边界点折叠该 Range 。

range.collapse(toStart);//toStart 可选,一个布尔值: true 折叠到 Range 的 start 节点,false 折叠到 end 节点。如果省略,则默认为 false .

(4)比拟

compareBoundaryPoints()

var compare = comparerange.compareBoundaryPoints(how, sourceRange);

compare:返回1, 0, -1.(0为相等,1为时,comparerange在sourceRange之后,-1为comparerange在sourceRange之前)。
how:比拟哪些边界点,为常数。
Range.START_TO_START - 比拟两个 Range 节点的开始点
Range.END_TO_END - 比拟两个 Range 节点的完结点
Range.START_TO_END - 用 sourceRange 的开始点与以后范畴的完结点比拟
Range.END_TO_START - 用 sourceRange 的完结点与以后范畴的开始点比拟
sourceRange:个Range对象的边界。

(5)其它

detach()
尽管GC(垃圾收集器)会将其收集,但用detach()开释range对象是一个好习惯。语法为:oRange.detach();

toString()
返回该范畴示意的文档区域的纯文本内容,不蕴含任何标签;

留神点

除了火狐浏览器外。如果section中曾经存在一个range了,再通过addRange增加range是有效