【问题标题】:Caret position resets in contenteditable when setting innerHTML [duplicate]设置 innerHTML 时,插入符号位置在 contenteditable 中重置
【发布时间】:2018-05-31 03:13:54
【问题描述】:

我正在尝试创建一个容器字段组件,我正在使用 html 属性 contenteditable,但是当我替换组件的 innerHTML 值时,光标(插入符号)将其放回位置 0。有没有办法保持光标位置?

看起来像这样:

【问题讨论】:

    标签: javascript cursor contenteditable caret


    【解决方案1】:

    我在另一个主题中找到了真正的解决方案: How to set caret(cursor) position in contenteditable element (div)?

    代码如下:

    function createRange(node, chars, range) {
        if (!range) {
            range = document.createRange()
            range.selectNode(node);
            range.setStart(node, 0);
        }
    
        if (chars.count === 0) {
            range.setEnd(node, chars.count);
        } else if (node && chars.count >0) {
            if (node.nodeType === Node.TEXT_NODE) {
                if (node.textContent.length < chars.count) {
                    chars.count -= node.textContent.length;
                } else {
                     range.setEnd(node, chars.count);
                     chars.count = 0;
                }
            } else {
                for (var lp = 0; lp < node.childNodes.length; lp++) {
                    range = createRange(node.childNodes[lp], chars, range);
    
                    if (chars.count === 0) {
                       break;
                    }
                }
            }
       }
    
       return range;
    };
    
    function setCurrentCursorPosition(element,chars) {
        if (chars >= 0) {
            var selection = window.getSelection();
    
            range = createRange(element.parentNode, { count: chars });
    
            if (range) {
                range.collapse(false);
                selection.removeAllRanges();
                selection.addRange(range);
            }
        }
    };
    
    function isChildOf(node, parentId) {
        while (node !== null) {
            if (node.id === parentId) {
                return true;
            }
            node = node.parentNode;
        }
    
        return false;
    };
    
    function getCurrentCursorPosition(parentId) {
        var selection = window.getSelection(),
            charCount = -1,
            node;
    
        if (selection.focusNode) {
            if (isChildOf(selection.focusNode, parentId)) {
                node = selection.focusNode;
                charCount = selection.focusOffset;
    
                while (node) {
                    if (node.id === parentId) {
                        break;
                    }
    
                    if (node.previousSibling) {
                        node = node.previousSibling;
                        charCount += node.textContent.length;
                    } else {
                         node = node.parentNode;
                         if (node === null) {
                             break;
                         }
                    }
               }
          }
       }
    
        return charCount;
    };
    

    【讨论】:

    • 在我的情况下它总是返回-1;
    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2011-06-17
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多