JS在可编辑的div中的光标位置插入内容的方法
本文实例讲述了js实现在可编辑div中指定位置插入内容的方法,就像我们使用的编辑器一样,分享给大家供大家参考。具体实现方法如下:
首先要让DIV启用编辑模式
<divcontenteditable=trueid="divTest"></div>
通过设定contenteditable=true开启div的编辑模式.这样DIV就可以跟文本框一样输入内容了。
不扯话题了。下面说怎么获取或设置光标位置.
2个步骤:
①获取DIV中的光标位置
②改变光标位置
varcursor=0;//光标位置 document.onselectionchange=function(){ varrange=document.selection.createRange(); varsrcele=range.parentElement();//获取到当前元素 varcopy=document.body.createTextRange(); copy.moveToElementText(srcele); for(cursor=0;copy.compareEndPoints("StartToStart",range)<0;cursor++){ copy.moveStart("character",1);//改变光标位置,实际上我们是在记录cursor的数量. } }
给document绑定光标变化事件。用来记录光标位置.
这样就可以拿到DIV的光标位置了.
functionmoveEnd(obj){ lyTXT1.focus(); varr=document.selection.createRange(); //因为这里死从当前光标开始移动的(好像文本框的是从0算起.)所以我们需要拿到当前光标位置,然后就可以计算出要移动多少位了,这样就可以把光标移动到想要的位置了 r.moveStart('character',lyTXT1.innerText.length-cursor); r.collapse(true); r.select(); }
通过上面的我们就可以将DIV中的光标移动到最后面了
一个完整的实例
<buttontype="button"onclick="document.getElementById('test').focus();insertHtmlAtCaret('<b>INSERTED</b>');">插入字符</button> <divcontentEditable="true"style="height:50px;border:2pxsolidred;"id="test"> </div> functioninsertHtmlAtCaret(html){ varsel,range; if(window.getSelection){ //IE9andnon-IE sel=window.getSelection(); if(sel.getRangeAt&&sel.rangeCount){ range=sel.getRangeAt(0); range.deleteContents(); //Range.createContextualFragment()wouldbeusefulherebutis //non-standardandnotsupportedinallbrowsers(IE9,forone) varel=document.createElement("div"); el.innerHTML=html; varfrag=document.createDocumentFragment(),node,lastNode; while((node=el.firstChild)){ lastNode=frag.appendChild(node); } range.insertNode(frag); //Preservetheselection if(lastNode){ range=range.cloneRange(); range.setStartAfter(lastNode); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } } }elseif(document.selection&&document.selection.type!="Control"){ //IE<9 document.selection.createRange().pasteHTML(html); } }
再看一个基于jquery的实例
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metacontent="text/html;charset=utf-8"http-equiv="Content-Type"> <scripttype="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <title>contenteditable</title> <style> *{ margin:0;padding:0; } .im-message-area{ width:98%; padding:2px; height:75px; border:#000solid1px; background:#fff; font:12px/20pxarial,"5b8b4f53"; word-wrap:break-word; overflow-y:auto; line-height:1; } .ul{display:none;} .ulli{ background-color:#CCC; width:50px; } </style> <scriptlanguage="javascript"type="text/javascript"> functioninimage(text){ varobj=$(".im-message-area")[0]; varrange,node; if(!obj.hasfocus){ obj.focus(); } if(window.getSelection&&window.getSelection().getRangeAt){ range=window.getSelection().getRangeAt(0); range.collapse(false); node=range.createContextualFragment(text); varc=node.lastChild; range.insertNode(node); if(c){ range.setEndAfter(c); range.setStartAfter(c) } varj=window.getSelection(); j.removeAllRanges(); j.addRange(range); }elseif(document.selection&&document.selection.createRange){ document.selection.createRange().pasteHTML(text); } } $(document).ready(function(){ $('#button').click(function(){ $('.ul').show(); }) $('.ulli').each(function(){ $(this).click(function(){ inimage($(this).text()); }) }) }); </script> </head> <body> <divcontenteditable="true"id="im_message_area"class="im-message-area"><br></div> <ahref="javascript:void(0)"id="button">按钮</a> <ulclass="ul"> <li>(笑)</li> <li>(哭)</li> <li>(乐)</li> </ul> </body> </html>
希望本文所述对大家的javascript程序设计有所帮助。