本文實例講述了js實現在可編輯div中指定位置插入內容的方法,就像我們使用的編輯器一樣,分享給大家供大家參考。具體實現方法如下:
首先要讓DIV啟用編輯模式
復制代碼 代碼如下:<div contenteditable=true id="divTest"></div>
通過設定contenteditable=true開啟div的編輯模式.這樣DIV就可以跟文本框一樣輸入內容了。
不扯話題了。下面說怎麼獲取或設置光標位置.
2個步驟:
① 獲取DIV中的光標位置
② 改變光標位置
復制代碼 代碼如下:var cursor = 0; // 光標位置
document.onselectionchange = function () {
var range = document.selection.createRange();
var srcele = range.parentElement();//獲取到當前元素
var copy = document.body.createTextRange();
copy.moveToElementText(srcele);
for (cursor = 0; copy.compareEndPoints("StartToStart", range) < 0; cursor++) {
copy.moveStart("character", 1);//改變光標位置,實際上我們是在記錄cursor的數量.
}
}
給document綁定光標變化事件。用來記錄光標位置.
這樣就可以拿到DIV的光標位置了.
復制代碼 代碼如下:function moveEnd(obj) {
lyTXT1.focus();
var r = document.selection.createRange();
//因為這裡死從當前光標開始移動的(好像文本框的是從0算起.)所以我們需要拿到當前光標位置,然後就可以計算出要移動多少位了,這樣就可以把光標移動到想要的位置了
r.moveStart('character', lyTXT1.innerText.length - cursor);
r.collapse(true);
r.select();
}
通過上面的我們就可以將DIV中的光標移動到最後面了
一個完整的實例
復制代碼 代碼如下:<button type="button" onclick="document.getElementById('test').focus(); insertHtmlAtCaret('<b>INSERTED</b>');">插入字符</button>
<div contentEditable="true" style="height:50px; border:2px solid red;" id="test"> </div>
function insertHtmlAtCaret(html) {
var sel, range;
if (window.getSelection) {
// IE9 and non-IE
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
// Range.createContextualFragment() would be useful here but is
// non-standard and not supported in all browsers (IE9, for one)
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
// Preserve the selection
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
} else if (document.selection && document.selection.type != "Control") {
// IE < 9
document.selection.createRange().pasteHTML(html);
}
}
再看一個基於jquery的實例
復制代碼 代碼如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<script type="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:#000 solid 1px;
background:#fff;
font:12px/20px arial,"5b8b4f53";
word-wrap:break-word;
overflow-y:auto;
line-height:1;
}
.ul{display:none;}
.ul li{
background-color:#CCC;
width:50px;
}
</style>
<script language="javascript" type="text/javascript">
function inimage(text){
var obj= $(".im-message-area")[0];
var range, node;
if(!obj.hasfocus) {
obj.focus();
}
if (window.getSelection && window.getSelection().getRangeAt) {
range = window.getSelection().getRangeAt(0);
range.collapse(false);
node = range.createContextualFragment(text);
var c = node.lastChild;
range.insertNode(node);
if(c){
range.setEndAfter(c);
range.setStartAfter(c)
}
var j = window.getSelection();
j.removeAllRanges();
j.addRange(range);
} else if (document.selection && document.selection.createRange) {
document.selection.createRange().pasteHTML(text);
}
}
$(document).ready(function(){
$('#button').click(function(){
$('.ul').show();
})
$('.ul li').each(function(){
$(this).click(function(){
inimage($(this).text());
})
})
});
</script>
</head>
<body>
<div contenteditable="true" id="im_message_area" class="im-message-area"><br></div>
<a href="javascript:void(0)" id="button">按鈕</a>
<ul class="ul">
<li>(笑)</li>
<li>(哭)</li>
<li>(樂)</li>
</ul>
</body>
</html>
希望本文所述對大家的javascript程序設計有所幫助。