参考1:
https://www.jianshu.com/p/3cb26112636d
<div
ref="myeditor"
contenteditable="true"
class="myeditor"
v-html="text.textarea"
@click="editlink($event)"
@input="myeditorChange"
@keypress.enter="myeditorenter($event)" // 监听回车
@blur="myeditorblur">
</div>
myeditorenter(e) {
e.preventDefault();
RangeUtil.insertHtmlAtCaret('<br/>') // 在当前光标插入文本
// this.$refs.myeditor.innerHTML = this.$refs.myeditor.innerHTML+'<br/>'
},
// 光标类方法
export const RangeUtil = {
// 当前光标位置插入文本
insertHtmlAtCaret: (html) => {
let 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)
let el = document.createElement("div");
el.innerHTML = html;
let 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);
}
},
// 保存光标位置
saveRange: () => {
let selection = window.getSelection ? window.getSelection() : document.selection;
if (!selection.rangeCount) return;
let range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
window._range = range;
},
// 基于保存的光标插入内容
insertContent(str) {
let selection, range = window._range;
if (!window.getSelection) {
range.pasteHTML(str);
range.collapse(false);
range.select();
} else {
selection = window.getSelection ? window.getSelection() : document.selection;
range.collapse(false);
let hasR = range.createContextualFragment(str);
let hasR_lastChild = hasR.lastChild;
while (hasR_lastChild && hasR_lastChild.nodeName.toLowerCase() == "br" && hasR_lastChild.previousSibling && hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br") {
let e = hasR_lastChild;
hasR_lastChild = hasR_lastChild.previousSibling;
hasR.removeChild(e);
}
range.insertNode(hasR);
if (hasR_lastChild) {
range.setEndAfter(hasR_lastChild);
range.setStartAfter(hasR_lastChild);
}
selection.removeAllRanges();
selection.addRange(range);
}
},
参考2:
https://blog.csdn.net/Chloeeeeeeee/article/details/139297991
const editableDiv = document.getElementById('editable');
const range = document.createRange();
const selection = window.getSelection();
const textNode = editableDiv.childNodes[0]; // 假设这是文本节点 "Hello, World!"
const offset = 5; // 将光标移动到 "Hello" 之后
range.setStart(textNode, offset);
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
参考3:解决问题!
https://blog.csdn.net/qq_38989173/article/details/123651959
//div内全部文本
var text = $('.test').text().trim();
//当前光标所在行:光标前文本长度
var this_leng = window.getSelection().focusOffset;
//当前光标所在行:行文本
var this_text = window.getSelection().getRangeAt(0).endContainer.data;
//当前光标所在行:整行文本长度
//兼容光标所在行为空时,文本中间空字符或空换行
var this_textlen = this_text ? this_text.length:0;
//当前光标所在行:下一个兄弟元素
//本来想用这个判断的,但是一直是null,就没研究了
//var next_text = window.getSelection().getRangeAt(0).endContainer.nextSibling;
//判断文本长度 执行是整行回车(换行+插入空白行div)还是部分回车(仅换行,不插入空白行div)
if (this_leng == this_textlen) {
insertHtmlAtCaret('<div><br/></div>');
} else {
insertHtmlAtCaret('<br/>');
}