Как установить положение курсора в конец текста в CKEditor?
Есть ли способ установить, что курсор находится в конце содержимого CKEditor?
Этот разработчик тоже спросил, но не получил ответов:
http://cksource.com/forums/viewtopic.php?f=11&t=19877&hilit=cursor+end
Я хотел бы задать фокус в конце текста внутри CKEditor. Когда я использую:
ckEditor.focus();
Он возвращает меня в начало текста, уже находящегося внутри CKEditor.
Ответы
Ответ 1
Дэн ответ получил странные результаты для меня, но незначительные изменения (в дополнение к исправлению опечатки) заставили его работать:
var range = me.editor.createRange();
range.moveToElementEditEnd( range.root );
me.editor.getSelection().selectRanges( [ range ] );
Ответ 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).
Ответ 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
}
});
Идея:
- Получить корень node (не тело)
- Перейдите к следующему node, пока не будет больше узлов для перехода на.
- Выберите последний node.
- Свернуть это
- Диапазон настройки
Ответ 4
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), свернуть его (с ложным параметром) и, наконец, выберите диапазон. Лучше всего сделать это в случае экземпляра. Случайное событие.
Ответ 5
Вот аналогичный ответ на @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>");
Ответ 6
Это самое простое решение, предоставляемое 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 ])
Ответ 7
Это будет работать наверняка. CKEDITOR.config.startupFocus = 'end';
Ответ 8
Вы пробовали ckEditor.Selection.Collapse(false);