聊聊开发富文本编辑器:range对象
- Range对象
- Range对象的属性和方法
- selection对象
- 常见案例代码
getCurrentRange = function() {
var sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0);
}
},
saveSelection = function() {
selectedRange = getCurrentRange();
},
restoreSelection = function() {
var selection = window.getSelection();
if (selectedRange) {
try {
selection.removeAllRanges();
} catch (ex) {
document.body.createTextRange().select();
document.selection.empty();
}
selection.addRange(selectedRange);
}
}
Range属于
selection
对象(表示range范围),而在IE下,Range属于
textRange
对象(表示文本范围)。selection
对象为主,同时会加上textRange
对象的兼容代码。window.getSelection()
方法来获取:var selectedRange;
function saveSelection(){
if(window.getSelection){
/*主流的浏览器,包括chrome、Mozilla、Safari*/
return window.getSelection();
}else if(document.selection){
/*IE下的处理*/
return document.selection.createRange();
}
return null;
};
selection
对象有可能不是只有一个Range
对象,有可能有多个,每一个Range
对象代表用户鼠标所选取范围内的一段连续区域。(在Firefox中,可以通过 ctrl键可以选取多个连续的区域,因此在Firefox中一个selection
对象有多个range
对象,在其他浏览器中,用户只能选取一段连续的区 域,因此只有一个range对象。)range = window.getSelection().getRangeAt(index)
Range
对象的序列号,也可以说你拖动选择的顺序号,它的值有如下几种情况:当用户没有按下鼠标时候,该参数的值为0.
当用户按下鼠标的时候,该参数值为1.
当用户使用鼠标同时按住ctrl键时选取了一个或者多个区域时候,该参数值代表用户选取区域的数量。
当用户取消区域的选取时,该属性值为1,代表页面上存在一个空的Range对象;
Range
对象,一般我们会判断是否有Range
对象,我们可以通过selection
对象的rangeCount
属性(类似数组的length,返回Range对象的数量)来判断是否有多个Range对象,然后再去调用getRangeAt()
方法。function saveSelection(){
if(window.getSelection){
/*主流的浏览器,包括chrome、Mozilla、Safari*/
var sel = window.getSelection();
if(sel.rangeCount > 0){
return sel.getRangeAt(0);
}
}else if(document.selection){
/*IE下的处理*/
return document.selection.createRange();
}
return null;
};
document.createRange():用于创建一个Range对象(范围)
document.body.createTextRange():用于创建一个textRange对象
endContainer:返回范围的结束点的Document节点,通常是文本节点。
endOffset:返回endContainer中的结束点位置。
startContainer: 返回范围的开始点中的Document节点,通常是文本节点。
startOffset:返回startContainer中的开始点位置。
collapsed:用于判断范围的开始点与结束点是否处于相同的位置,如果相同,该属性值返回true,即范围是空的或折叠的。
commonAncestorContainer:范围的开始点和结束点的(即它们的祖先节点)、嵌套最深的 Document 节点。
selectNode(node):设置该范围的边界点,使它包含指定节点和指定节点的所有子孙节点。
selectNodeContents(node):设置该范围的边界点,使它包含指定节点的子孙节点,但不包含指定节点本身。
deleteContents():将Range对象中所包含的内容从页面中删除
setStart(node,index):将指定节点中的某处位置指定为Range对象所代表区域的起点位置
setEnd(node,index):将指定节点中的某处位置指定Range对象所代表区域的结束位置
setStartBefore(node):将指定节点的起点位置指定为Range对象所代表区域的起点位置。
setStartAfter():将指定节点的终点位置指定为Range对象所代表区域的起点位置。
setEndBefore():将指定节点的起点位置指定为Range对象所代表区域的终点位置。
setEndAfter(): 将指定节点的终点位置指定为Range对象所代表区域的终点位置。
cloneRange():对当前的Range对象进行复制,该方法返回一个复制的Range对象
cloneContents():复制当前Range对象所代表区域中的HTML代码并返回新的DocumentFragment对象。
extractContents():将Range对象所代表区域中的html代码克隆到一个DocumentFragment对象中,然后从页面中删除这段HTML代码
detach():释放Range对象。
insertNode(node):将指定的节点插入到某个Range对象所代表的区域中,插入位置为Range对象所代表区域的起点位置,如果该节点已经存在于页面中,该节点将被移动到Range对象代表的区域的起点处。
collpase(boolean) 用于使范围的边界点重合。当为true时,将范围的结束点设为与开始点相同的值;当为false时,将范围的开始点设为与结束点相同的值。
compareBoundaryPoints(how,sourceRange):用来比较两个Range对象,返回1,0,-1(0表示相等,等于1时,当前范围在sourceRange之后,等于-1时,当前范围在sourceRange之前)
toString():返回该范围表示的文档区域的纯文本内容。
START_TO_START 用指定范围的开始点与当前范围的开始点进行比较。
START_TO_END 用指定范围的开始点与当前范围的结束点进行比较。
END_TO_END 用指定范围的结束点与当前范围的结束点进行比较。
END_TO_START 用指定范围的结束点与当前范围的开始点进行比较。
Range
对象的集合,包含一个或多个Range
对象。anchorNode:返回范围的开始点的Document节点,和range对象的endContainer作用一样。
anchorOffset:返回startContainer中的开始点位置,和range对象的startOffset作用一样。
focusNode:返回范围的结束点的Document节点,和range对象的endContainer作用一样。
focusOffset:返回endContainer中的结束点位置,和range对象的endOffset作用一样。
isCollapsed:范围的开始点与结束点是否重叠
selection
的属性,通过这些属性,我们省却了先获取range
对象再获取偏移量和节点的繁琐。removeAllRanges():删除selection中原有的所有range
addRange(range):将新的range添加到selection中
htmlText:返回字符串,为textRange的HTML内容,与innerHTML作用一样,只读
text:返回字符串,为textRange的文本内容,相当于innerText,可读写。
moveStart("character",index):选定范围的开始点向后移动index个字符
moveEnd("character",index):选定范围的结束点向后移动index个字符
pasterHTML():黏贴HTML到一个文本节点时,该文本节点自动分隔。
selectionStart:获取范围的开始点,可读写
selectionEnd:获取范围的结束点,可读写
selectionDiraction
select():在焦点状态下,移动光标至第一个字符后面
setSelectionRange(start,end):设置范围的开始点和结束点。
selectionStart
和selectionEnd
会记录元素最后一次selection的相关属性,意思就是当元素失去焦点后,使用selectionStart
和selectionEnd
仍能够获取到元素失去焦点时的值。如果textbox没有selection时,selectionStart和selectionEnd相等,都是焦点的位置。
在使用setSelectionRange()时
如果end小于start,会讲selectionStart和selectionEnd都设置为end;
如果start和end参数大于textbox内容的长度(textbox.value.length),start和end都会设置为value属性的长度。
function saveSelection(){
if(window.getSelection){
/*主流的浏览器,包括chrome、Mozilla、Safari*/
var sel = window.getSelection();
if(sel.rangeCount > 0){
return sel.getRangeAt(0);
}
}else if(document.selection){
/*IE下的处理*/
return document.selection.createRange();
}
return null;
};
var selectedRange = saveSelection(); // 保存获取到的Range对象
selection.text
来获取。function restoreSelection() {
var selection = window.getSelection();
if (selectedRange) {
try {
selection.removeAllRanges(); /*清空所有Range对象*/
} catch (ex) {
/*IE*/
document.body.createTextRange().select();
document.selection.empty();
};
/*恢复保存的范围*/
selection.addRange(selectedRange);
}
}
function selectAllText(elem){
if(window.getSelection){
elem.focus();
var range = window.getSelection();
range.selectAllChildren(elem);
range.collapseToEnd();
}else if(document.selection){
var range = document.selection.createTextRange();
range.moveToElementText(elem);
range.collapse(false);
range.select(); /*避免产生空格*/
}
}
(1) 将光标置于表单元素的最后
function toTextEnd(elem){
if(window.getSelection){
elem.setSelectionRange(elem.value.length,elem.value,length);
elem.focus()
}else if(document.selection){
/*IE下*/
var range = elem.createTextRange();
range.moveStart('character',elem.value.length);
range.collapse(true);
range.select();
}
}
实例(点击里面的按钮btn10):Demo
(2) 选中所有文字
function selectAllText(elem){
if(window.getSelection){
elem.setSelectionRange(0,elem.value.length);
elem.focus();
}else if(document.selection){
var range = elem.createTextRange();
range.select();
}
}
实例(点击里面的按钮btn11):Demo
(3)获取光标位置
function getCursorPosition(elem){
if(window.getSelection){
return elem.selectionStart;
}else if(document.selection){
elem.focus();
var range = document.selection.createTextRange();
range.moveStart('character',-elem.value.length);
return range.text.length;
}
return elem.value.length;
}
(4)设置光标位置
function setCursorPosition(elem, position){
if(window.getSelection){
elem.focus();
elem.setSelectionRange(position,position);
}else if(document.selection){
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character',position);
range.moveStart('character',position);
range.select();
}
}