javascript - 如何在 contenteditable 元素中保持插入符号的位置

标签 javascript html css ecmascript-6

我怎样才能保持插入符号在 contenteditable 元素中的位置,当我尝试更新可编辑元素的 innerHTML 插入符号位置跳转到第一行时,我需要一个函数可以更新或更改可编辑元素 innerHTML 时保持插入符号的位置,谢谢。

我的代码:

// content editable element
let editor = document.getElementById("editor");

editor.onkeypress = (e) => {
    if (e.keyCode === 32) {
        let lines = editor.children;
        for (let line of lines) {
            line.innerHTML += "Hello World !!!";
        }
    }
}

最佳答案

我的回答:

// content editable element
let editor = document.getElementById("editor");

// on keypress
editor.onkeypress = () => {
    // get the position of caret
    let pos = getCaretPos(editor.children[0]);

    // update the innerHTML
    editor.children[0].innerHTML += "Hello World !!!";

    // set the caret position
    setCaretPos(editor.children[0], pos);
}

function getCaretPos(element) {
    var ie = (typeof document.selection != "undefined" && document.selection.type != "Control") && true;
    var w3 = (typeof window.getSelection != "undefined") && true;
    var caretOffset = 0;
    if (w3) {
        var range = window.getSelection().getRangeAt(0);
        var preCaretRange = range.cloneRange();
        preCaretRange.selectNodeContents(element);
        preCaretRange.setEnd(range.endContainer, range.endOffset);
        caretOffset = preCaretRange.toString().length;
    } else if (ie) {
        var textRange = document.selection.createRange();
        var preCaretTextRange = document.body.createTextRange();
        preCaretTextRange.moveToElementText(element);
        preCaretTextRange.setEndPoint("EndToEnd", textRange);
        caretOffset = preCaretTextRange.text.length;
    }
    return caretOffset;
}

function setCaretPos(element, position) {
    var node = element;
    node.focus();
    var textNode = node.firstChild;
    var caret = position; // insert caret after the 10th character say
    var range = document.createRange();
    range.setStart(textNode, caret);
    range.setEnd(textNode, caret);
    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
}

关于javascript - 如何在 contenteditable 元素中保持插入符号的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521466/

相关文章:

html - 如何让滚动条覆盖内容

html - 如何自定义设计选择选项卡?

javascript - 单击后如何动态更改css?然后再次单击返回默认值?

javascript - 在 Chrome 中操作图像时内存泄漏

javascript - 淡出/int 背景图像只有根 div - jQuery/js

javascript - jquery thickbox引用问题

php - for 循环只取 mysql 结果的第一个值

javascript - Javascript 中的迭代数组

JavaScript:将 Google Analytics/Yandex.Metrica 减少到推荐人和屏幕大小

html - 响应式设计改变div的顺序和位置