2010-12-27 3 views
16

Есть ли способ установить, чтобы курсор находился в конце содержимого CKEditor?Как установить положение курсора в конец текста в CKEditor?

Этот разработчик спросил тоже, но не получил ответа:

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

Я хотел бы установить фокус в конце текста внутри CKEditor. Когда я использую:

ckEditor.focus(); 

Он принимает меня к началу текста уже внутри CKEditor.

ответ

-1

Вы пробовали ckEditor.Selection.Collapse (false);

+3

Я не понимаю, о чем вы говорите. Каков точный синтаксис? Я не вижу поля Selection на моем объекте ckeditor. – BrooklynDev

+0

-1 Не работает для меня ни –

4

После немного пустячный, я получил его на работу со следующим кодом:

$(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. Установить диапазон
+0

FYI, это не работает в IE8. '.getSelection()' не поддерживается ... – gabaum10

7

Согласно документации для 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).

+0

Какая черта '[диапазоны]' ?? Является ли «о» опечаткой? – mpen

+0

@Mark, спасибо за улов. Это должен быть «диапазон». Это то, что я получаю за то, что не проверяю документацию CKEditor. – Dan

+0

Я был не совсем уверен, потому что синтаксис с квадратной скобкой делает его почти похожим на местозаполнитель для чего-то другого. – mpen

16

ответ Дэн получил странные результаты для меня, но незначительные изменения (в дополнение к опечатка затруднительное) сделал его работу:

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

Спасибо, тоже здесь. Решение Dan вложило в нее каретку, но в правой части редактора в соответствии с ожидаемой конечной точкой. Спасибо, спасибо. – halfer

+0

Решение Yap, Dan выбрасывало курсор на новую строку ... – Roberto

+0

Спасибо, что это работает .. теперь, чтобы выяснить, как программно войти в редактор (фокус не приносит каретки) –

1

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

Вы должны сфокусировать редактор, получить объект документа, поместить его в диапазон, диапазон сглаживания (с ложным параметром), выбрать тело (с selectNodeContents), свернуть его (с помощью ложного параметра) и, наконец, выбрать диапазон. Лучше всего сделать это в случае экземпляра.

1

Вот аналогичный ответ на @ 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>"); 
0

Это самое простое решение, предоставляемое API-интерфейсом ckeditor.Я тестировал его на IE10 +, ff, сафари и 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 ]) 

 Смежные вопросы

  • Нет связанных вопросов^_^