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程序设计有所帮助。