javascript Range对象跨浏览器常用操作(下)

上一篇(http://kjah.iteye.com/blog/420624)介绍了Range对象:ie用的TextRange对象和标准Dom Range对象,并分别介绍使用这两个对象如何进行区域选择,这篇将介绍使用Range对象进行常用的插入文本和替换操作。

 

 2.插入文本

   TextRange插入文本

      使用TextRang插入文本比较简单,直接调用pasteHTML()方法就可以直接插入html代码。
    Dom Range插入文本

       使用Dom Range插入文本相对复杂一些,Dom Range对象使用insertNode()方法实现插入,但是insertNode是在Range的开始位置插入一 个节点,参数是一个节点而不是字符串,我们可以通过插入文本节点实现,如果使用document.createTextNode建立文本节点,文本中的HTML标记会自动转换,但空格是个特例,并不会自动转换为 ,这使我在开发代码缩进时很头疼,最后解决的办法,是使用Rang.createContextualFragment,这个方法虽然在文档中没有找到,但测试多个浏览器都支持此方法,此方法返回的是一个DocumentFragment对

象。以下是示例代码:
 例3:

var rg = window.getSelection().getRangeAt(0); 
var fragment = rg.createContextualFragment(str); 
rg.insertNode(fragment);

 这段代码虽然实现插入了文本,但是光标位置却在插入文本之前,因为“insertNode是在Range的开始位置插入一 个节点”,接下来我们实现光标的控制,这需要设置Range对象的位置,并更新Selection对象的Range,代码如下:

例4:

var selection=window.getSelection();
var rg=selection.getRangeAt(0);
var fragment = rg.createContextualFragment(str);
var oLastNode = fragment.lastChild; //获得DocumentFragment的末尾位置
rg.insertNode(fragment);
rg.setEndAfter(oLastNode);//设置末尾位置
rg.collapse(false);//合并范围至末尾
selection.removeAllRanges();//清除range
selection.addRange(rg);//设置range

 以下是一个代码缩进功能的部分代码作为示例:按tab键时会在当前位置,插入4个空格,解决在编辑时不能输入tab的问题。实际应用中的功能包括多行缩进和自动缩进。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
 </HEAD>
 <BODY>
  <SCRIPT LANGUAGE="JavaScript">
  <!--
	window.οnlοad=function(){
		var iframeContent="";
		var divContent="";
		var divChange=false;
		var iframeChange=false;
		var $=function(s){return document.getElementById(s);}
		$("ifram_div").innerHTML+='<div id="infoIframe">iframe</div><iframe id="youretextarea" style="height:200px;width:99%;" class="_editbox"></iframe>';
		var fw=$("youretextarea").contentWindow;
		var f=fw.document;
		f.designMode = 'On';
		f.contentEditable = true; 
		f.open(); 
		f.writeln('<html><style>p{margin:0px;padding:0px;}body{margin:0px;padding:0px;font:16/18px Arial;}</html>'); 
		f.close();
		if(f.attachEvent){
			f.attachEvent("onkeydown",fun1);
		}else{
			fw.addEventListener("keydown",fun1,true);
		}
		function fun1(e){
			e=e||window.event;
			var code=e.charCode||e.keyCode;
			var strTab="&nbsp;&nbsp;&nbsp;&nbsp;";
			if(code==9){//tab键
				if(f.selection){//ie
					e.returnValue=false;//取消浏览器默认动作 ie
					var rg=f.selection.createRange();
					rg.pasteHTML(strTab);
				}else{
					e.preventDefault();//取消浏览器默认动作	
					var selection=fw.getSelection();
					var rg=selection.getRangeAt(0);
					var fragment = rg.createContextualFragment(strTab);
					var oLastNode = fragment.lastChild; //获得DocumentFragment的末尾位置
					rg.insertNode(fragment);
					rg.setEndAfter(oLastNode);//设置末尾位置
					rg.collapse(false);//合并范围至末尾
					selection.removeAllRanges();//清除range
					selection.addRange(rg);//设置range
				}
			}
		}
	}
  //-->
  </SCRIPT>
  <div id="ifram_div"></div>
 </BODY>
</HTML>

 

3.替换
    综合介绍的选择和插入的方法可完成替换功能,TextRange比较简单pasteHTML方法会替换原来Range选中的文本,Dom Range的insertNode不会删除原range选中内容,需要调用deleteContents()方法先删除选择内容。

 

以上介绍了使用Range对象常用的区域选择、插入文本和替换操作,希望在大家开发在线编辑器时有所帮助,粗略之处还请见谅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值