【问题标题】:Chrome doesn't get the selected html string wrapping tags (contenteditable)Chrome 没有获取选定的 html 字符串包装标签(contenteditable)
【发布时间】:2013-02-04 16:38:55
【问题描述】:

我正在使用 Tim Down 的 this 解决方案在内容可编辑的 div 中获取选定的 html,它工作正常(谢谢 Tim!) 但是使用 Chrome,如果我在 html 标记的边界处选择一个 html 字符串,如下图所示:http://i.imgur.com/UiYzrcp.png?1:

我得到的只是纯文本(在这种情况下为test)。

如果我将选择扩展到下一个字符(例如字母 c),我会得到正确的 html (<strong>test</strong> c)。

我可以通过选择图像中的单词来获取 Webkit 中的完整 html 吗? 谢谢

【问题讨论】:

    标签: javascript html dom contenteditable


    【解决方案1】:

    不是真的。 WebKit 在将任何范围的每个边界添加到选择时都会对其进行规范化,以便它符合 WebKit 的文档中有效选择/插入符号位置的想法。您可以更改原始函数,以便它检测包含元素内所有文本的选择的情况,并扩展选择范围以包围该元素(而不实际更改选择)。这是一个简单的示例(对于更一般的情况,您可能需要更聪明的方法,例如文本在嵌套元素中时,检测块/内联元素等):

    演示:http://jsfiddle.net/btLeg/

    代码:

    function adjustRange(range) {
        range = range.cloneRange();
    
        // Expand range to encompass complete element if element's text
        // is completely selected by the range
        var container = range.commonAncestorContainer;
        var parentElement = container.nodeType == 3 ?
                container.parentNode : container;
    
        if (parentElement.textContent == range.toString()) {
            range.selectNode(parentElement);
        }
    
        return range;
    }
    
    function getSelectionHtml() {
        var html = "", sel, range;
        if (typeof window.getSelection != "undefined") {
            sel = window.getSelection();
            if (sel.rangeCount) {
                var container = document.createElement("div");
                for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                    range = adjustRange( sel.getRangeAt(i) );
                    container.appendChild(range.cloneContents());
                }
                html = container.innerHTML;
            }
        } else if (typeof document.selection != "undefined") {
            if (document.selection.type == "Text") {
                html = document.selection.createRange().htmlText;
            }
        }
        return html;
    }
    

    【讨论】:

    • 非常感谢!但是这种类型呢:test 如何获取 i 和 strong 或任何带有文本的标签,例如:

      test

      和 ...?
    • @Vahid:您可以更改 adjustRange() 以向上遍历 DOM,直到它命中包含除选择之外的文本的元素。 jsfiddle.net/timdown/btLeg/3
    • 哇,完全救了我的命:D
    猜你喜欢
    • 2015-06-20
    • 2016-07-20
    • 1970-01-01
    • 2016-11-03
    • 2012-01-19
    • 2017-02-02
    • 2018-07-28
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多