【问题标题】:prevent selecting next dom when dbclicking text in contenteditabledbclicking contenteditable中的文本时防止选择下一个dom
【发布时间】:2015-07-01 22:51:28
【问题描述】:

我有以下内容可编辑的 div,其中包含混合文本和 dom,如下所示:

some text<span> which i would </span><span>like to select </span>

我的问题是,我想防止双击一个单词来选择 span arround。例如,如果我双击“which”这个词,它只会选择这个词,这是需要的行为。但问题是,如果我选择“would”这个词,它会选择“would”。如何在双击事件中只选择没有跨度的“将”?

我尝试在前后添加空格,但没有结果。

【问题讨论】:

    标签: jquery html contenteditable


    【解决方案1】:

    只需添加这个小的 javascript sn-p,就可以在 span 元素中选择单个单词:

    $('span').dblclick(function(e){
        e.preventDefault();
        var selection = window.getSelection();
        if (selection.toString().indexOf(' ') > -1)
        {
            var range = selection.getRangeAt(0);
            var start = range.startOffset;
            var finish = range.endOffset - 1;
            setSelectionRange(this, start, finish);
        }
    });
    
    function getTextNodesIn(node) {
        var textNodes = [];
        if (node.nodeType == 3) {
            textNodes.push(node);
        } else {
            var children = node.childNodes;
            for (var i = 0, len = children.length; i < len; ++i) {
                textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
            }
        }
        return textNodes;
    }
    
    function setSelectionRange(el, start, end) {
        if (document.createRange && window.getSelection) {
            var range = document.createRange();
            range.selectNodeContents(el);
            var textNodes = getTextNodesIn(el);
            var foundStart = false;
            var charCount = 0, endCharCount;
    
            for (var i = 0, textNode; textNode = textNodes[i++]; ) {
                endCharCount = charCount + textNode.length;
                if (!foundStart && start >= charCount
                        && (start < endCharCount ||
                        (start == endCharCount && i <= textNodes.length))) {
                    range.setStart(textNode, start - charCount);
                    foundStart = true;
                }
                if (foundStart && end <= endCharCount) {
                    range.setEnd(textNode, end - charCount);
                    break;
                }
                charCount = endCharCount;
            }
    
            var sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.selection && document.body.createTextRange) {
            var textRange = document.body.createTextRange();
            textRange.moveToElementText(el);
            textRange.collapse(true);
            textRange.moveEnd("character", end);
            textRange.moveStart("character", start);
            textRange.select();
        }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    some text<span> which i would </span><span>like to select </span>

    【讨论】:

    • 即使我在 span 元素之外,我的问题也会出现。例如,如果我双击跨度之外的“文本”一词,我会在我的选择“文本”中得到以下跨度,我只想要“文本”跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2015-08-07
    • 1970-01-01
    • 2012-10-06
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多