【问题标题】:How to replace selected text with html in a contenteditable element? [duplicate]如何在 contenteditable 元素中用 html 替换选定的文本? [复制]
【发布时间】:2011-09-09 06:21:27
【问题描述】:

使用 contenteditable 元素如何用我自己的 html 替换所选内容?

【问题讨论】:

  • 这个问题的第二部分(“用我自己的 html 替换选定的文本”)在链接为参考的问题中没有得到回答,因为这个问题是重复的。
  • 我删除了已经回答的部分以符合“一题一题”的规则。

标签: javascript jquery contenteditable


【解决方案1】:

查看此处了解工作的 jsFiddle:http://jsfiddle.net/dKaJ3/2/

function getSelectionHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    alert(html);
}

代码取自Tim Down: Return HTML from a user-selected text

【讨论】:

  • BTW - 永远不要调用函数getSelection(),因为这将覆盖默认值并导致堆栈递归
  • 效果很好!谢谢。我现在如何将所选文本替换为与文本相同位置的其他内容?
  • 没关系,找到答案了:stackoverflow.com/questions/3997659/…
  • 很好,但是请再问一个问题,它从整个文档中返回选定的文本,如何只获取选定的 div。可能是具有不同类的 div?
  • 这并没有解决问题:如果至少有两个相似的字符串,你将如何替换选择?
【解决方案2】:

要获取选定的 HTML,您可以使用我为 this question 编写的函数。要将所选内容替换为您自己的 HTML,您可以使用 this function。下面是替换函数的一个版本,它插入 HTML 字符串而不是 DOM 节点:

function replaceSelectionWithHtml(html) {
    var range;
    if (window.getSelection && window.getSelection().getRangeAt) {
        range = window.getSelection().getRangeAt(0);
        range.deleteContents();
        var div = document.createElement("div");
        div.innerHTML = html;
        var frag = document.createDocumentFragment(), child;
        while ( (child = div.firstChild) ) {
            frag.appendChild(child);
        }
        range.insertNode(frag);
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        range.pasteHTML(html);
    }
}

replaceSelectionWithHtml("<b>REPLACEMENT HTML</b>");

【讨论】:

  • 请定义node。我想我们可以删除这一行html = (node.nodeType == 3) ? node.data : node.outerHTML;
  • @HDog:是的,你是对的。看起来像是我忘记删除的复制粘贴行。我现在已经删除了。谢谢。
  • 为什么'html'既是函数的参数又是局部变量声明?由于stackoverflow.com/a/27963351/578812 它有效,但乍一看似乎令人困惑。
  • @CraigA:这是一个错误。我怀疑我复制并改编了一个没有html 参数的函数。感谢您指出。
  • @flen:JavaScript 中的var 语句允许您在单个语句中声明多个变量,以逗号分隔,每个变量可选地具有一个初始值。 More info at MDN
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2018-07-07
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多