【问题标题】:How to set cursor position to end of text in CKEditor?如何在CKEditor中将光标位置设置为文本末尾?
【发布时间】:2011-05-31 00:12:01
【问题描述】:

有没有办法将光标设置在 CKEditor 内容的末尾?

这位开发者也问过,但没有得到答复:

http://cksource.com/forums/viewtopic.php?f=11&t=19877&hilit=cursor+end

我想将焦点设置在 CKEditor 内的文本末尾。当我使用时:

ckEditor.focus();

它将我带到 CKEditor 中已经存在的文本的开头。

【问题讨论】:

    标签: ckeditor fckeditor


    【解决方案1】:

    Dan 的回答对我来说得到了奇怪的结果,但微小的变化(除了错字修复)使它起作用:

    var range = me.editor.createRange();
    range.moveToElementEditEnd( range.root );
    me.editor.getSelection().selectRanges( [ range ] );
    

    【讨论】:

    • 谢谢,这里也是。 Dan 的解决方案确实为我插入了插入符号,但在编辑器的最右边与预期的端点一致。你的已经修好了,谢谢。
    • 感谢这项工作.. 现在要弄清楚如何以编程方式进入编辑器(焦点不会带上插入符号)
    • 就我而言,代码集是末尾的插入符号,但没有滚动到末尾。所以当我使用滚动条走到最后时,我只能看到插入符号。我帮自己解决了 me.editor.insertHtml("");这样就完成了。
    【解决方案2】:

    根据 CKEditor 4 的文档,您可以在拥有编辑器对象后执行以下操作。

    var range = editor.createRange();
    range.moveToPosition( range.root, CKEDITOR.POSITION_BEFORE_END );
    editor.getSelection().selectRanges( [ range ] );
    

    链接:http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection(在 selectRanges 函数下)。

    【讨论】:

    • [ranges] 到底是什么?? “s”是错字吗?
    • @Mark,感谢您的关注。应该是range。这就是我没有验证 CKEditor 文档的结果。
    • 我不太确定,因为方括号语法使它看起来几乎像是一个不同事物的占位符。
    • 不幸的是,不是最干净的代码。对于不熟悉 JavaScript 的任何人,selectRanges 接受 CKEDITOR.dom.range 对象的数组,[range] 创建一个仅包含 range 对象的数组。
    • 是的,我想通了,但是我的错字已经结束 :-) 大多数 CKEDITOR 对象似乎都是原生等价物的薄包装。
    【解决方案3】:

    经过一番摆弄,我已经让它与以下代码一起工作:

    $(document).ready(function() {
    
        CKEDITOR.on('instanceReady', function(ev) {
    
            ev.editor.focus();
    
            var s = ev.editor.getSelection(); // getting selection
            var selected_ranges = s.getRanges(); // getting ranges
            var node = selected_ranges[0].startContainer; // selecting the starting node
            var parents = node.getParents(true);
    
            node = parents[parents.length - 2].getFirst();
    
            while (true) {
                var x = node.getNext();
                if (x == null) {
                    break;
                }
                node = x;
            }
    
            s.selectElement(node);
            selected_ranges = s.getRanges();
            selected_ranges[0].collapse(false);  //  false collapses the range to the end of the selected node, true before the node.
            s.selectRanges(selected_ranges);  // putting the current selection there
        }
    
    });
    

    这个想法是:

    1. 获取根节点(不是正文)
    2. 前进到下一个节点,直到没有更多节点可以前进。
    3. 选择最后一个节点。
    4. 收起
    5. 设置范围

    【讨论】:

      【解决方案4】:

      这是@peter-tracey 的类似答案。就我而言,我的插件正在插入引文。如果用户进行了选择,我需要禁用选择并将光标放在句子的末尾。

        // Obtain the current selection & range
        var selection = editor.getSelection();
        var ranges = selection.getRanges();
        var range = ranges[0];
      
        // Create a new range from the editor object
        var newRange = editor.createRange();
      
        // assign the newRange to move to the end of the current selection
        // using the range.endContainer element.
        var moveToEnd = true;
        newRange.moveToElementEditablePosition(range.endContainer, moveToEnd);
      
        // change selection
        var newRanges = [newRange];
        selection.selectRanges(newRanges);
      
        // now I can insert html without erasing the previously selected text.
        editor.insertHtml("<span>Hello World!</span>");
      

      【讨论】:

        【解决方案5】:

        CKEditor 3.x:

        on : {
                'instanceReady': function(ev) {
                   ev.editor.focus();
                   var range = new CKEDITOR.dom.range( ev.editor.document );
                   range.collapse(false);
                   range.selectNodeContents( ev.editor.document.getBody() );
                   range.collapse(false);
                   ev.editor.getSelection().selectRanges( [ range ] );
                }
             }
        

        基于此处开发人员提供的伪代码:

        https://dev.ckeditor.com/ticket/9546#comment:3

        您必须聚焦编辑器,获取文档对象,将其放在范围内, 折叠范围(带有 false 参数),选择主体(带有 selectNodeContents),折叠它(使用 false 参数),最后 选择范围。最好在 instanceReady 事件中完成。

        【讨论】:

          【解决方案6】:

          这是 ckeditor API 提供的最简单的解决方案。我已经在 IE10+、ff、safari 和 Chrome 上测试过:

          range = editor.createRange();
          // the first parameter is the last line text element of the ckeditor instance
          range.moveToPosition(new CKEDITOR.dom.node(editor.element.$.children[pos - 1]), CKEDITOR.POSITION_BEFORE_END)
          range.collapse()
          editor.getSelection().selectRanges([ range ])
          

          【讨论】:

            【解决方案7】:

            这肯定会奏效。 CKEDITOR.config.startupFocus = 'end';

            【讨论】:

            • 在内联 Ckeditor (4.11) +1 中为我工作,谢谢
            【解决方案8】:

            你试过 ckEditor.Selection.Collapse(false);

            【讨论】:

            • 我看不出你到底在说什么。准确的语法是什么?我的 ckeditor 对象上没有选择字段。
            猜你喜欢
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 2019-11-13
            • 2012-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-19
            相关资源
            最近更新 更多