【问题标题】:Javascript: Pasting text at caret in WYSIWYG editorJavascript:在 WYSIWYG 编辑器中将文本粘贴到插入符号处
【发布时间】:2013-11-16 00:25:26
【问题描述】:

当涉及到 JavaScript 时,我仍在学习绳索,而导致我遇到最多问题的问题之一是理解插入符号的位置。目前,我正在为 wiki (http://t3chbox.wikia.com/wiki/MediaWiki:Wikia.js/referenceForm.js) 编写参考表单,并使其适用于 wiki 的源代码编辑器,但不适用于 WYSIWYG 编辑器(可视化编辑器)。我想知道这里是否有人知道如何获取插入符号的位置,然后为编辑内容所在的 iframe 粘贴文本?

所见即所得的编辑器可以在这里看到:http://t3chbox.wikia.com/wiki/Test?action=edit(对于那些拥有 Wikia 帐户并且视觉设置为关闭的用户,在未登录的情况下进行编辑)。我一直在使用获取内容并尝试在插入符号处粘贴的方法是这样的:

$(document.getElementById('cke_contents_wpTextbox1').getElementsByTagName('iframe')[0].contentDocument.body).insertAtCaret('hello');

谢谢:)

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您使用的 jquery insertAtCaret 函数仅适用于文本区域和输入字段。它不适用于 contentEditable 元素。您可以查看此 jsfiddle 以在插入符号处插入 contentEditable 元素。

        function pasteHtmlAtCaret(html,windo) {
            windo = windo || window;
            var sel, range;
            if (windo.getSelection) {
                // IE9 and non-IE
                sel = windo.getSelection();
                console.log(sel);
                if (sel.getRangeAt && sel.rangeCount) {
                    range = sel.getRangeAt(0);
                    console.log(range);
                    range.deleteContents();
    
                    // Range.createContextualFragment() would be useful here but is
                    // non-standard and not supported in all browsers (IE9, for one)
                    var el = windo.document.createElement("div");
                    el.innerHTML = html;
                    var frag = windo.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 (windo.document.selection && windo.document.selection.type != "Control") {
                // IE < 9
                windo.document.selection.createRange().pasteHTML(html);
            }
        }
    
    //usage
        var iframeWindow = document.getElementById('cke_contents_wpTextbox1').getElementsByTagName('iframe')[0].contentWindow;
        pasteHtmlAtCaret("Hello World!",iframeWindow);
    

    http://jsfiddle.net/jwvha/534/

    【讨论】:

    • 你好。感谢您的快速回复。我尝试了这个,但是我得到了与使用 insertAtCaret 代码时相同的结果。虽然它可以识别元素,但代码实际上并不影响它。
    • 已更新我的答案以支持 contentWindow 作为 pasteHtmlAtCaret 函数的参数。我在您的编辑器页面上试用了这段代码,它成功了。
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多