【问题标题】:Insert at caret with javascript, but only within a certain class用javascript插入插入符号,但只能在某个类中
【发布时间】:2015-04-03 02:30:18
【问题描述】:

我正在使用 The Great and Powerful Oz Tim Down 编写的一些 javascript,它在插入符号处插入东西。它工作得很好,但是我怎样才能将函数限制为只能在类名为“editor-text”的 div 中运行?

编辑:它还必须在 .editor-text div 中的其他元素(例如 H1)中工作。

Edit2:也必须在新行上工作。见http://jsfiddle.net/j5mv219L/

现场演示: http://jsfiddle.net/wfo7gcvh/

守则:

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
            // 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) {
                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);
    }
}

【问题讨论】:

    标签: javascript range selection


    【解决方案1】:

    您可以获取具有选择的节点,并检查它是否具有类或者是否是具有该类的元素的子元素等

    function pasteHtmlAtCaret(html, selector) {
        var sel, range, parent, node = null;
    
        if (document.selection) {
            node = document.selection.createRange().parentElement();
        } else {
            var selection = window.getSelection();
            if (selection.rangeCount > 0) {
                node = selection.getRangeAt(0).startContainer;
                if (node !== $(node).closest(selector).get(0)) {
                    node = node.parentNode;
                }
            }
        }
    
    
    
        if (node && $(node).closest(selector).length > 0 && window.getSelection) {
            sel = window.getSelection();
            if (sel.getRangeAt && sel.rangeCount) {
                range = sel.getRangeAt(0);
                range.deleteContents();
                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);
    
                if (lastNode) {
                    range = range.cloneRange();
                    range.setStartAfter(lastNode);
                    range.collapse(true);
                    sel.removeAllRanges();
                    sel.addRange(range);
                }
            }
        } else if (document.selection && document.selection.type != "Control") {
            document.selection.createRange().pasteHTML(html);
        }
    }
    

    FIDDLE

    【讨论】:

    • 感谢 adeneo,这确实有效。我希望只编辑原始的 pasteHTMLAtCaret 函数,而不是调用该函数的代码,因为它在多个地方使用。
    • 我知道这在不久前就得到了回答,但我发现了这种方法的一个错误。基本上可以说你有一个

      标签。您无法粘贴到其中,因为它正在读取 H1 作为父级,而不是指定的类:jsfiddle.net/kthornbloom/wfo7gcvh/4

    • 由于解决方案的问题,我不得不将其作为答案删除。如果更正了,我可以重新标记它。
    • @kthornbloom - 快乐,快乐,快乐!
    • 很抱歉,我发现了另一个小问题。它不适用于使用
      的新行。关于为什么的任何线索?这是一个示例:jsfiddle.net/j5mv219L
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2015-06-30
    • 2011-09-14
    • 1970-01-01
    • 2023-03-15
    • 2019-03-29
    相关资源
    最近更新 更多