原文来自TextRange object。
textRange对象表明document中一个连续的部分。javascript
TextRange对象为实现一些实用功能提供了几个属性和方法。利用TextRange对象,你能够取得并修改文档的任意部分;你能够获得文档中的一个连续部分的定位以及一些其它的几何属性;你能够取得并修改文档中已选中的内容。php
Internet Explorer以及部分Opera浏览器支持TextRange对象。html
在火狐、Opera、Google Chrome以及Safari中,Range对象提供了简单的功能。Internet Explorer 9.0之后的版本一样支持Range对象。java
由于全部的现代浏览器都支持Range对象,只有在Range对象不被支持的状况下才使用TextRange对象。本文后面的内容将一块儿介绍这两个对象。浏览器
在Internet Explorer中,有三种不一样类型的选区(selection):编辑器
利用selection对象的type属性能够获得选区的类型。当选区包含文本或者没有选中的内容时,用selection对象的createRange方法能够取得一个TextRange对象。返回的TextRange对象的边界点与选区的内容对齐。性能
为了获得选区的内容,selection对象还支持其它的方法,好比说createRangeCollection方法,它返回一个TextRanges集合,包含了若干个TextRange对象。每一个TextRange对象表明这个选区的一个连续部分。该createRangeCollection方法对多重选区来讲颇有用。可是Internet Explorer不支持它。因此使用createRange方法就足够了。字体
使用selectionRange对象的getRangeAt方法能够取得一个表明当前选区的Range对象。selectRange对象能够包含超过一个Range对象。每一个Range对象表明选区的一个连续部分。code
在Internet Explorer、Opera、Google Chrome、Safari以及低于3.0版本的火狐浏览器中,至少有一个Range对象属于selectionRange对象,由于文本选区永远是一个DOM层次结构的连续部分。htm
在3.0版之后的火狐浏览器中,鼠标选网页内容时按住Ctrl键,能够选中多个文本域。若是你想选中离散的文本块,请使用addRange方法。
使用duplicate方法能够复制出一个已有的TextRange对象的副本。返回的对象与原始对象彻底相同。
若是你想把一个TextRange对象的边界点与一个元素的内容对齐,并且这个元素支持createTextRange方法,请在这个元素上使用createTextRange方法。对其它元素,请使用body.createTextRange方法来建立一个TExtRange对象,并对这个必要的元素使用moveToElementText方法。
若是你想把一个Range对象的边界点与一个元素或元素的内容对齐,请使用selectNode或selectNodeContents方法。
使用moveStart方法和moveEnd方法能够移动一个TextRange对象的开始点的结束点。若是你想把一个TextRange对象的开始点和结束点与另外一个TextRange对象的开始点和结束点对齐,请使用setEndPoint方法。
若是你想分别地修改一个Range的开始点和结束点,请使用setStart方法、setStartBefore方法、setStartAfter方法,以及setEnd方法、setEndBefore方法、setEndAfter方法。
利用collapse方法,你能够移动开始点或者结束点,反之亦然。TextRange对象和Range对象均可以用这个方法。
扩展TextRange对象的内容,请使用expand方法以实现它。
利用offsetLeftc以及offsetTop属性,能够获得该TextRange对象的坐标。不能取得该元素以及一个TextRamge对象用开始点和结束点定义的偏移。
若是你要取得一个TextRange对象的矩形边界,请使用boundingLeft、boundingTop、boundWidth以及boundingHeight属性。
若是你要取得一个TextRange对象的准确形状,请使用getClientRects方法。它将取得一个TextRectangles集合,包含了几个TextRectangle对象。每一个TextRectangle对象表明属于这个TextRange对象的一行文本。
上面的提到全部的坐标都是相对于浏览器窗口的左上角的。
document.elementFromPoint方法能够帮助你取得位于指定坐标上的元素。
这个包含了整个TextRange对象的元素,若是你想要取得它在DOM层次结构中元素的深度,请使用parentElement方法。
一个Range对象是用开始点和结束点定义的。一个元素以及一个位置定义了一个点。若是这个元素只有文本内容(TextNode、CDATASection或者CommentNode),这个位置指定了元素中的一个字符位置;若是这个元素并不是只有文本内容,这个位置指定了元素中一个子元素的序号索引。
和(endContainer,endOffset)属性指定了一个Range对象的开始点和结束点。startOffset属性指定在这个startContainer元素中Range开始的位置。endOffset属性指定了在这个endContainer元素中Range结束的位置。
若是你想取得包含了整个Range对象的元素在DOM层次结构中节点的深度,请使用commonAncestorContainer属性。
当一个TextRange的开始点和结束点是同一个位置的时候,这个TextRange对象就是收缩的。你能够用多种方法来检测它是否处于收缩状态。好比说,用TextRange对象的文本内容来检测。用text属性可取得一个TextRange对象的文本内容,并做为字符串来对待。若是这个text属性表明的字符串的长度返回0,则TextRange对象是收缩的。
使用collapsed方法能够检测Range对象是否处于收缩状态。
比较两个TextRange对象的定位,可使用compareEndPoints方法。它比较了这些对象的边界点。
要想检测一个TextRange对象是否包含另外一个TextRange对象,能够用inRange方法。isEqual方法检测两个TextRange对象是不是彻底相同的。
两个Range对象的定位能够经过compareboundaryPoint方法来比较。它比较了这些对象的边界,相似于TextRange对象中的compareEndPoints方法。
请注意,虽然compareboundaryPoints方法和compareEndPoints方法的语法是类似的,可是一样的案例,在不一样的浏览器中,它们的行为是不一样的。请阅读这两个方法的页面以了解详细区别。
若是你想检测一个点(一个(element,position)对,其中position指定了element内部的一个索引或者说一个字符位置)是否位于一个Range内部,请使用comparePoint或者isPointInRange方法。
text属性可以设置或取得一个TextRange对象的文本内容,做为一个字符串。
若是你须要HTML格式的内容,请使用htmlText属性。
若是要替换一个带有HTML格式文本的TextRange对象的内容,请使用pasteHTML方法。你还能够用这个方法来删除这些内容(只须要在调用pasteHTML时用空字符串做为参数。)
toString方法取得一个Range对象的文本内容,做为一个字符串。
- 若是你须要以层次结构DOM的形式取得一个Range对象的内容,请使用cloneContents方法和extractContents方法。这两个方法会从Range内容中创建一个DocumentFragment对象。
- 要想从document中移除一个Range对象的内容,请使用deleteContents方法。
- 要想向Range对象中插入一个新元素,请使用insertNode方法。
能够用execCommand方法编辑一个TextRange对象的内容,就像在富文本编辑器中那样。你能够修改背景色或者前景色,你可使字体变成粗体、斜体,你能够用剪贴板剪切、复制以及粘贴内容,它提供了一些其它的功能。
用getBookmark方法,能够把一个TextRange对象保存为bookmark。以后能够用moveToBookmark方法建立一个TextRange对象。该bookmark,以及这个用moveToBookmark方法建立的TextRange对象与被保存的那个TextRange对象是彻底相同的。
用下面的方法能够访问textRange对象:
属性名 | 说明 |
---|---|
boundingHeight | 返回一个整型值,指定了当前的TextRange对象的边界矩形的高度,以像素为单位。 |
boundingLeft | 返回一个整型数,指定了当前的TextRange对象的边界矩形的左边缘坐标,以像素为单位。 |
boundingTop | 返回一个整型数,指定了当前的TextRange对象的边界矩形的上边缘坐标,以像素为单位。 |
boundingWidth | 返回一个整型数,指定了当前TextRange对象的边界矩形的宽度,以像素为单位。 |
htmlText | 返回属于一个TextRange对象的HTML源码,做为一个字符串。 |
offsetLeft | 返回一个对象相对于它的定位父元素 [1]的左边缘的左坐标位置,以像素为单位。 |
offsetTop | 返回一个对象相对于它的定位父元素 [1]的顶边缘的顶坐标位置,以像素为单位。 |
text | 用一个字符串设置一个TextRange对象内部的文本,或者返回一个TextRange对象内部的文本,做为一个字符串。 |
方法名 | 说明 |
---|---|
collapse | 把一个range对象的开始点移动到它的结束点,或者相反。 |
compareEndPoints | 比较两个textRange对象的开始点和结束点的位置。 |
duplicate | 返回当前TextRange对象的一个精确的复制副本。 |
execCommand | 在某个对象上运行commands |
expand | 用一个字符、句子或者词语,在插入点扩展TextRange对象的内容。 |
findText | 在document中查找指定的文本,并关联到一个TextRange对象。 |
getBookmark | 把当前的TextRange对象保存到一个字符串中,以后能够用moveToBookmark方法返回原始的TextRange对象。 |
getBoundingClientRect | 返回一个TextRectangle对象,指定当前元素或者TextRange对象的边界矩形,以像素为单位,相对于浏览器窗口的左上角。 |
getClientRects | 返回一个TextRectangles集合,指定当前元素或者TextRange对象的精确形状。 |
inRange | 返回当前TextRange对象是否包含了指定的TextRange对象。 |
isEqual | 返回当前的TextRange对象是否与指定的TextRange对象彻底相同。 |
move | 把当前的TextRange对象的结束点移到它的开始点,并把这个收缩的TextRange对象移动指定的字距。 |
moveEnd | 把当前的TextRange对象的结束点移动指定字距。 |
moveStart | 把当前的TextRange对象的开始点移动指定字距。 |
moveToBookmark | 把当前的TextRange对象的开始点和结束点移到指定bookmark表明的位置。 |
moveToElementText | 把当前的TextRange对象的开始点和结束点对齐到指定的元素的文本内容。 |
moveToPoint | 把当前的TextRange对象的开始点和结束点移动到指定的位置。 |
parentElement | 返回在DOM层次结构中包含了整个TextRange对象的最深的节点的引用。 |
pasteHTML | 把当前TextRange对象的内容替换为指定的HTML格式的文本。 |
queryCommandEnabled | 用execCommand方法,返回这个指定的command是否能被执行成功。 |
queryCommandIndeterm | 返回指定的command是否在一个不肯定的状态中。 |
queryCommandState | 返回指定的command当前的状态 |
queryCommandSupported | 返回当前的对象是否支持指定的command。 |
queryCommandText | 返回指定的command的说明描述。 |
queryCommandValue | 返回指定的command的实际的值。 |
scrollIntoView | 把指定的元素滚致到文档的可见区域。 |
select | 选择包含在当前TextRange或者controlRange对象中的全部的文本或控件。 |
setEndPoint | 把当前TextRange对象的开始点和结束点对齐到指定的TextRange对象的开始点和结束点。 |
[1]定位父元素(offsetParent):定位父元素并不是是DOM层次结构中的parentElement,而是离该元素最近的一个position属性为relative、absolute、static的上层级元素。若是上层级元素中没有这样的元素,则定位父元素就是document.body。
这个示例演示了一个在document中取得选中内容的跨浏览器解决方案。
HTML<head> <script type="text/javascript"> function TestSelection () { if (window.getSelection) { // all browsers, except IE before version 9 var selectionRange = window.getSelection (); alert ("The text content of the selection:\n" + selectionRange.toString ()); } else { if (document.selection.type == 'None') { alert ("No content is selected, or the selected content is not available!"); } else { var textRange = document.selection.createRange (); alert ("The text content of the selection:\n" + textRange.text); } } } </script> </head> <body> Select some text or <button>element</button>, or do not select anything, before you click on the button below. <br /><br /> <button onclick="TestSelection ();">Test the selection!</button> </body>
这个跨浏览器解示例演示了如何用range对象删除一个元素中的内容:
HTML<head> <script type="text/javascript"> function RemoveContent () { var srcObj = document.getElementById ("src"); if (document.createRange) { // all browsers, except IE before version 9 var rangeObj = document.createRange (); rangeObj.selectNodeContents (srcObj); rangeObj.deleteContents (); } else { // Internet Explorer before version 9 var rangeObj = document.body.createTextRange (); rangeObj.moveToElementText (srcObj); rangeObj.select (); rangeObj.execCommand ('cut'); } } </script> </head> <body> <div id="src" style="background-color:#e0a0b0; width:300px; height:50px;">The <b>contents</b> of the <i>source</i> element.</div> <br /><br /> <button onclick="RemoveContent ();">Remove the contents of the source element!</button> </body>