在contentEditable元素中插入HTML元素

问题描述 投票:5回答:2

我有一个contentEditable div,我想插入HTML标签(一个简单的span元素)。

是否有跨浏览器解决方案,允许我在div选择或光标位置插入这些标签。如果在页面上选择了其他内容(不在div中),我想将标记附加到div的末尾。

谢谢

javascript jquery contenteditable
2个回答
7
投票

这是一个kickstart

// get the selection range (or cursor     position)
var range = window.getSelection().getRangeAt(0); 
// create a span
var newElement = document.createElement('span');
newElement.id = 'myId';
newElement.innerHTML = 'Hello World!';

// if the range is in #myDiv ;)
if(range.startContainer.parentNode.id==='myDiv') {
   // delete whatever is on the range
   range.deleteContents();
   // place your span
   range.insertNode(newElement);
}

我没有IE但在firefox,chrome和safari上工作正常。也许你想玩range.startContainer只有在contentEditable div上进行选择才能继续。

编辑:根据quirksmode range intro你必须改变window.getSelection()部分是IE兼容。

var userSelection;
if (window.getSelection) {
    userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
    userSelection = document.selection.createRange();
}

7
投票

以下将在所有主流浏览器(包括IE 6)中执行此操作。它还将处理选择结束在<div>之外的情况以及选择包含在<div>内的子(或更深嵌套)元素中的情况。

2019年附录:insertNodeOverSelection的第二个分支仅适用于IE <= 8,现在可以删除。

function isOrContainsNode(ancestor, descendant) {
    var node = descendant;
    while (node) {
        if (node === ancestor) return true;
        node = node.parentNode;
    }
    return false;
}

function insertNodeOverSelection(node, containerNode) {
    var sel, range, html;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            if (isOrContainsNode(containerNode, range.commonAncestorContainer)) {
                range.deleteContents();
                range.insertNode(node);
            } else {
                containerNode.appendChild(node);
            }
        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        if (isOrContainsNode(containerNode, range.parentElement())) {
            html = (node.nodeType == 3) ? node.data : node.outerHTML;
            range.pasteHTML(html);
        } else {
            containerNode.appendChild(node);
        }
    }
}
<input type="button" onmousedown="insertNodeOverSelection(document.createTextNode('[NODE]'), document.getElementById('test'));" value="insert">

<div contenteditable="true">
    <div id="test" style="background-color: lightgoldenrodyellow">
        This is the editable element where the insertion will happen. Select something or place the cursor in here, then hit the button above
    </div>
    <div>
        No insertion will happen here
    </div>
</div>
© www.soinside.com 2019 - 2024. All rights reserved.