https://www.cnblogs.com/strangerqt/p/3745426.html
法国国营铁路公司(SNCF)20日承认,新订购的2000列火车因车体过宽,无法开进国内许多火车站的站台,从而不得不花大笔资金改造站台。法国国营铁路公司发言人克里斯托夫·皮耶诺埃尔告诉法国新闻电台:“我们发现问题晚了点。我们承认这一失误并为此承担责任。”
以这段文字为例子。。一个P标签包含了文字节点以及其他几个标签,标签中包含了文字节点。
selection 对象有一下几个属性:(以下都为chrome下单测的结果,firefox,IE另说)
以上的属性为chrome下console selection对象出来的与FF IE不一致,下面来说FF的selection对象属性,方法;
FF的selection 方法基本和chrome的一样,但是少了baseNode和extentNode以及extentOffset,baseOffset这4个属性,所以综上所述胃:起点节点用的属性为anchorNode,结束节点为focusNode的属性即可
IE下的的selection对象与上面又不相同为:
seletion对象属性和方法完全不同于W3C的selection之属性,方法;
RANGE对象
range对象也分为IE和W3C对象;range对象可以对选中的文字进行添加对象,删除,变粗,改变字体等适合用于网页富文本编辑等。在网上一搜一大片,我选几个目前能用到的属性来记录下。
W3C range:可以由selection对象创建也可以由document来创建。两者的区别为selection已经选好的range对象,通过selection.getRangeAt(0);来得到从selection 0开始的range对象;通过Document来创建就要稍微复杂一点,首先要确定range对象来自哪个元素,就拿上面的列子来讲;range对象来自P标签这个DOM对象;另外,range对象有4个基本属性:
一般选择:使用range.SelectNode(Dom)连同startContainer和endContainer一同选中;包含标签;range.SelectNodeContents(Dom);选中除了start,endContainer之外的内容,只是内容,不包含标签;
复杂选择:可以指定选择某段文字从哪开始从哪结束;有2个方法,为setStart,setEnd;方法分别接受2个参数,第一个参数为这个range对象的container,第2个参数为索引值;start和end2个方法的参数分别对应为setStart(startContainer,startOffset);setEnd(endContainer,endOffset);
以上就是range对象的基本属性和选择方式,分为selection选择和自己输入参数创建;下面就是实际操作range对象,让其实现富文本编辑;
extractContents:提取并删除range对象,返回一个document.fragment对象;相当于我们的剪切功能;这方法和insertAdjacentHTML配合非常牛逼;例子:比如我们” 台:“我们发现问题晚了点。我们承认这一 “ 这种range对象的话有一部分的B标签在里面,那么使用这个方法的话,剪切后,B标签会自动补全开始和闭合标签,内容为剪切剩下的内容。比如剪切上面的range后,B标签就变成了失误并为此承担责任。” range中含有B标签部分的文字也会自动闭合成一个完整的B标签例如:我们承认这一;
要使用insetAdjacentElement的话,必须知道调用insetAdjacentElement的节点为哪个。比如要把剪切出来的内容原原本本添加个背景色后还原,那么就必须知道确切的使用“insetAdjacentElement”的DOM节点。insetAdjacentElement可以添加在这个DOM节点的标签面前,内容开始前,内容结束后,标签结束后。分别为beforeBegin,beforeBegin,beforeEnd,afterEnd; 如何知道确切的调用这个方法的DOM节点呢?前面的selection对象的anchorNode和focusNode就派上用场了。我们分别得到这2个节点的父节点;总共有这么几种可能性:
1:假如起始节点的父节点不这个例子的根节点的话,那么说明range对象的anchroeNode是一个子节点而非文本节点,那么我们就把提取出来的range添加进span使用ahchorNode.insetAdjacentElement('afterEnd',span)来添到经过extractContents后自动闭合的起始节点的后面;
2:假如起始父节点为这个例子的根节点,但是结束父节点不是的话,那么就是FocusNode.insetAdjacentElement('beforeBegin',span)来添加到这个节点的前面;
3:假如起始父节点和结束父节点为相同的话,那么说明这个range的anchor和FocusNode都在子节点里面;使用surroundContents即可。
4:起始父节点为例子的根节点,结束父节点不是,那么就以结束父节点为起点,使用FocusNode.insetAdjacentElement('beforeBegin',span);
5:假如起始和结束父节点都是例子的话使用surroungContents即可。
但是有一点不同的是,在firefox下insetAdjacentElement不是一个有效的方法,firefox只支持insetAdjacentHTML。在chrome下HTML,TEXT,ELEMENT都支持。
目前在firefox下要使用怎么办呢?只支持insetAdjacentHTML的话我们就用span的innerHTML来拼接一个新的span就是了哇
如:FocusNode.insetAdjacentElement('beforeBegin',""+span.innerHTML+"") problem solved~~
IE下实现range给背景添加颜色等操作
IE下的selection为document.selection;获取selection选中的range对象为document.selection.createRange();
由于IE的selection对象没有anchorNode等属性,所以添加背景色等操作就用不到insetAdjacentElement这样的函数,那么是怎么样进行操作的呢?
IE特有的execCommad来执行的,这个方法非常的强大,可以把range对象替换为其他的文本,input,img标签,还可以给range对象的文字进行样式设置;
获取range对象的方式和W3C一致,分别是通过selection 来获取,还有就是通过创建range对象;
selection创建:document.selection.createRange();
range对象创建:IE可以用不同标签来创建不同选择区域的range对象。比如用body创建range对象,那么range对象的选择区域就是整个页面了:获取整个body的range:document.body.createTextRange();目前IE range对象支持由body,input,button,textarea创建的range对象
简单的选择range对象:range.findText(”查找的文字“),返回一个bool值,true为找到值,false为没找到;例如上面的例子” 公司(SNCF) “ range.findText('公司(SNCF)'); 返回true,就可以使用execCommad操作对象了;注意:使用这个方法时候要注意range对象是由哪个标签创建的。比如Button创建的range对象要查找由textarea创建的range对象在textarea中的值,肯定是找不到的;
复杂的选择:IE range复杂的选择是通过moveStart,moveEnd来前后移动range选区;
这2个方法接受2个参数,第一个是移动的类型; 有4个类型:
character:按照字符进行移动,最小单位
word:按照单词进行移动;
sentence:按照句子进行移动;
textedit:直接移动到选区的结束位置,start传入这个参数无效,只有end方法传入才还效
第2个参数是数字,具体移动的个数,可以接受负值;start方法的数字是range开始起第几个开始计算;end方法的传入数字是这段range的结束位置起开始算,正数的话就是range的结束范围就是range本身的长度。负数的话那么就是range的长度减去负数值(绝对值);比如 一段完整的range文字,法国国营铁路公司(SNCF)20日承认, 我们要截取“铁路公司” 话看下面的例子:
这里用character来做例子;
range.moveStart('character',4);
range.moveEnd('character',-11);
那么range的范围就是创建这个range的元素的开始第4个到第8个之间的位置;
操作range对象
IE操作range对象全是通过execCommad来进行操作的
execCommad的参数有3个,
参数A,操作的类型比如设置range的css属性,剪切,复制,把range的文字转化成input、textarea标签等,
参数B,为bool值,在参数A为替换元素,添加链接的情况下才有用,目的为是否弹出框来确定这个操作,true为弹出,false为不弹出;
参数C,为参数A的具体属性,比如设置背景色的颜色,替换元素的ID属性,替换超链接的URL等;
参数A的部分参数为:
列如我们要设置背景色就为ragne.execCommad('BackColor','true','red');背景色为红色,其他css属性一直;
替换元素成TextBox并且把textbox的值设置为替换前的值:
var text=range.text;
range.execCommad('InsertInputText','false','tba');
document.getElementById('tba').value=text;