<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>在可编辑div中定位和设置光标</title>
<style>
#editor {
height: 300px;
width: 580px;
border: 1px solid #999;
margin-bottom: 15px;
}
</style>
</head>
<body>
<div id="editor" contenteditable></div>
<input type="text" id="inputDom">
<button id="sendContent">发送内容</button>
<script>
// 发送表情的按钮
var sendContent = document.getElementById('sendContent');
// 定义最后光标对象
var lastEditPosition;
// 编辑框点击事件
document.getElementById('editor').onclick = function () {
// 获取选定对象
var selection = document.getSelection();
// 设置最后光标对象
lastEditPosition = selection.getRangeAt(0);
}
// 编辑框按键弹起事件
document.getElementById('editor').onkeyup = function () {
// 获取选定对象
var selection = document.getSelection();
// 设置最后光标对象
lastEditPosition = selection.getRangeAt(0);
}
// 发送表情
document.getElementById('sendContent').onclick = function () {
// 获取可编辑框
var editor = document.getElementById('editor');
// 获取输入框
var inputDom = document.getElementById('inputDom');
// 编辑框获得焦点
editor.focus();
// 获取选定对象
var selection = document.getSelection();
// 如果保存的有上次的光标对象
if (lastEditPosition) {
// 清除所有选区
selection.removeAllRanges();
// 添加最后光标还原之前的状态
selection.addRange(lastEditPosition);
}
// 如果选定对象范围是编辑框范围
if (selection.anchorNode.nodeName != '#text') {
// 创建表情文本节点进行插入
var emojiText = document.createTextNode(inputDom.value);
// 如果文本框的子元素大于0,则表示有其他元素,则按照位置插入表情节点
if (editor.childNodes.length > 0) {
for (var i = 0; i < editor.childNodes.length; i++) {
if (i == selection.anchorOffset) {
editor.insertBefore(emojiText, editor.childNodes[i]);
}
}
} else {
// 否则直接插入一个表情元素
editor.appendChild(emojiText);
}
// 创建新的光标对象
var range = document.createRange();
// 将光标对象的范围界定为新建的表情节点
range.selectNodeContents(emojiText);
// 定位光标位置在表情节点的最大长度位置
range.setStart(emojiText, emojiText.length);
// 将选区折叠为一个光标
range.collapse(true);
// 清除所有光标对象
selection.removeAllRanges();
// 添加新的光标对象
selection.addRange(range);
// 如果选定对象范围是文本节点
} else {
// 获取光标对象
var range = selection.getRangeAt(0);
// 获取光标对象的范围界定对象,一般就是textNode对象
var textNode = range.startContainer;
// 获取光标位置
var rangeStartOffset = range.startOffset;
// 在光标位置处插入新的表情内容
textNode.insertData(rangeStartOffset, inputDom.value);
// 添加了新内容,将光标移动到新的位置
range.setStart(textNode, rangeStartOffset + inputDom.value.length);
// 将选区折叠为一个光标
range.collapse(true);
// 清除所有光标对象
selection.removeAllRanges();
// 添加新的光标对象
selection.addRange(range);
}
// 记录最后光标对象
lastEditPosition = selection.getRangeAt(0)
}
</script>
</body>
</html>
js在可编辑div中定位和设置光标
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、设置光标定位的用途 在提示符中,不但可以设置颜色,还可以设置光标定位,当然,也是通过转义序列来设置。 设置光标...