javascript - 在 contenteditable div 插入 html

标签 javascript jquery contenteditable

我有一个带有 contenteditable 集的 div,我正在使用 jquery 捕获按键以在按下回车键时调用 preventDefault()。类似于 this question在光标处插入文本,我想直接插入 html,为简洁起见,我们将其称为 br 标签。使用上述问题的答案实际上在 IE 中有效,因为它使用 range.pasteHTML 方法,但在其他浏览器中,br 标记将显示为纯文本而不是 html。我如何修改答案以插入 html 而不是文本?

最佳答案

在大多数浏览器中,您可以使用从选择中获取的范围的 insertNode() 方法。在 IE < 9 中,您可以使用 pasteHTML(),如您所述。下面是在所有主要浏览器中执行此操作的函数。如果内容已经被选中,它会被替换,所以这实际上是一个粘贴操作。此外,我添加了代码以将插入符放在插入内容的末尾之后。

jsFiddle:http://jsfiddle.net/jwvha/1/

代码:

function pasteHtmlAtCaret(html) {
    var 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
            // only relatively recently standardized and is not supported in
            // some browsers (IE9, for one)
            var el = document.createElement("div");
            el.innerHTML = html;
            var 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);
    }
}

2013 年 8 月 21 日更新

根据评论中的要求,这是一个更新的示例,其中包含一个额外参数,用于指定是否选择插入的内容。

演示:http://jsfiddle.net/timdown/jwvha/527/

代码:

function pasteHtmlAtCaret(html, selectPastedContent) {
    var 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
            // only relatively recently standardized and is not supported in
            // some browsers (IE9, for one)
            var el = document.createElement("div");
            el.innerHTML = html;
            var frag = document.createDocumentFragment(), node, lastNode;
            while ( (node = el.firstChild) ) {
                lastNode = frag.appendChild(node);
            }
            var firstNode = frag.firstChild;
            range.insertNode(frag);

            // Preserve the selection
            if (lastNode) {
                range = range.cloneRange();
                range.setStartAfter(lastNode);
                if (selectPastedContent) {
                    range.setStartBefore(firstNode);
                } else {
                    range.collapse(true);
                }
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    } else if ( (sel = document.selection) && sel.type != "Control") {
        // IE < 9
        var originalRange = sel.createRange();
        originalRange.collapse(true);
        sel.createRange().pasteHTML(html);
        if (selectPastedContent) {
            range = sel.createRange();
            range.setEndPoint("StartToStart", originalRange);
            range.select();
        }
    }
}

关于javascript - 在 contenteditable div 插入 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690752/

相关文章:

javascript - 使用 JS 检查 HTML 元素是否可编辑

javascript - react .js : onChange event for contentEditable

javascript - 如何通过react-redux connect使用React.memo?

JavaScript 链表导致垃圾回收

javascript - 如何禁用 div 内的 JavaScript?

jquery - 将 xhrFields 添加到 dropzone.js 以跨域发送 session 数据

jquery - 调试 jQuery ajax 500 内部服务器错误

javascript - 我应该如何考虑我的 JavaScript 应用程序 namespace ?

javascript - $(document).ready() 处理程序立即触发

javascript - JS、HTML。谷歌美化。如何动态地将美化的html代码插入到html页面的contenteditable div中