javascript - 选择后插入 HTML

标签 javascript dom

我希望能够双击以选择 div 中的一些文本,然后触发一个 JavaScript 函数在所选文本之后插入一些 HTML,就像 Google Wave 中的“编辑/回复”功能一样。

我已经确定了如何在双击时触发一个函数,它正在定位选择并随后在它之后插入 HTML,这就是问题所在。

最佳答案

以下函数将在所有主流浏览器中选择的末尾插入一个 DOM 节点(元素或文本节点)(请注意,Firefox 现在默认允许多选;以下仅使用第一个选择):

function insertNodeAfterSelection(node) {
    var sel, range, html;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.collapse(false);
            range.insertNode(node);
        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        range.collapse(false);
        html = (node.nodeType == 3) ? node.data : node.outerHTML;
        range.pasteHTML(html);
    }
}

如果您想插入 HTML 字符串:

function insertHtmlAfterSelection(html) {
    var sel, range, node;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = window.getSelection().getRangeAt(0);
            range.collapse(false);

            // Range.createContextualFragment() would be useful here but is
            // non-standard and not supported in all 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);
        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        range.collapse(false);
        range.pasteHTML(html);
    }
}

2012 年 1 月 18 日更新

最后,这是一个插入 HTML 并保留选择的版本(即扩展选择以包括最初选择的内容加上插入的内容)。

现场演示:http://jsfiddle.net/timdown/JPb75/1/

代码:

function insertHtmlAfterSelection(html) {
    var sel, range, expandedSelRange, node;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = window.getSelection().getRangeAt(0);
            expandedSelRange = range.cloneRange();
            range.collapse(false);

            // Range.createContextualFragment() would be useful here but is
            // non-standard and not supported in all 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) {
                expandedSelRange.setEndAfter(lastNode);
                sel.removeAllRanges();
                sel.addRange(expandedSelRange);
            }
        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        expandedSelRange = range.duplicate();
        range.collapse(false);
        range.pasteHTML(html);
        expandedSelRange.setEndPoint("EndToEnd", range);
        expandedSelRange.select();
    }
}

关于javascript - 选择后插入 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597116/

相关文章:

javascript - html5中的CANVAS支持哪些图片格式?

javascript - 如何在ajax成功函数中仅访问由json发送的一个对象而不是整个数组?

java - 如何使用 JxPath 和 DOM 解析器解析 XML 文件

javascript - 使用 Angular 指令向 DOM 添加可切换按钮

html - IE7元素无法点击

javascript - 如何获取函数中父标签的属性值?

javascript - 服务中的 AngularJS $http 调用,返回已解析的数据,而不是 promise

javascript - jQuery removeClass 在 ('click' 、function() 上禁用

javascript - 捕获滚轮事件

php - 选择 nodeValue 但排除子元素