在contentEditable div中的inserted元素后面设置插入位置

Eli*_*lie 27 javascript contenteditable

我正在将一个元素插入到contentEditable div中,但浏览器会在插入的元素之前设置光标的位置.是否可以在插入的元素后面设置光标,以便用户不必重新调整光标位置就可以输入?

Tim*_*own 29

以下功能将执行此操作.DOM Level 2 Range对象使这在大多数浏览器中变得容易.在IE中,您需要在插入的节点之后插入标记元素,将选择移动到它,然后将其删除.

实例:http://jsfiddle.net/timdown/4N4ZD/

码:

function insertNodeAtCaret(node) {
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var range = sel.getRangeAt(0);
            range.collapse(false);
            range.insertNode(node);
            range = range.cloneRange();
            range.selectNodeContents(node);
            range.collapse(false);
            sel.removeAllRanges();
            sel.addRange(range);
        }
    } else if (typeof document.selection != "undefined" && document.selection.type != "Control") {
        var html = (node.nodeType == 1) ? node.outerHTML : node.data;
        var id = "marker_" + ("" + Math.random()).slice(2);
        html += '<span id="' + id + '"></span>';
        var textRange = document.selection.createRange();
        textRange.collapse(false);
        textRange.pasteHTML(html);
        var markerSpan = document.getElementById(id);
        textRange.moveToElementText(markerSpan);
        textRange.select();
        markerSpan.parentNode.removeChild(markerSpan);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用我的Rangy库.那里的等价代码

function insertNodeAtCaret(node) {
    var sel = rangy.getSelection();
    if (sel.rangeCount) {
        var range = sel.getRangeAt(0);
        range.collapse(false);
        range.insertNode(node);
        range.collapseAfter(node);
        sel.setSingleRange(range);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿.这很有趣:"DOM Level 2 Range对象在大多数浏览器中都很容易实现." 尝试了三天的各种排列,但收效甚微.(我知道,这不是一个有用的评论,但只是不得不说出来) (4认同)