Przeczytałem to excellent answer prawie na to samo pytanie. Jednak wypróbowałem każdą technikę zalecaną przez użytkownika i żaden z nich nie działa.CKEDITOR - nie można zmienić położenia kursora po modyfikacji DOM
Sytuacja polega na tym, że zabieram obecny kod HTML z edytora i zawijam pewne elementy w tagach z rozpiętością. Następnie ustawiłem zmodyfikowany HTML i spróbuję przywrócić położenie kursora użytkownika. Żadna technika nie działa.
Tutaj jest bardzo prosty przykład, aby odtworzyć problem:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="//cdn.ckeditor.com/4.4.7/standard/ckeditor.js"></script>
</head>
<body>
<textarea id="cktest"><p>Sometimes Lorem. Sometime Ipsum. Always dolor.</p></textarea>
<script type="text/javascript">
(function() {
var checkTimeout;
var bookmark;
var storeCursorLocation = function(editor) {
bookmark = editor.getSelection().createBookmarks();
};
var restoreCursorLocation = function(editor) {
editor.getSelection().selectBookmarks(bookmark);
};
var validateText = function(editor) {
storeCursorLocation(editor);
var data = editor.document.getBody().getHtml();
data = data.replace("Lorem", "<span class='err-item'>Lorem</span>");
editor.document.getBody().setHtml(data);
restoreCursorLocation(editor);
};
CKEDITOR.replace('cktest', {
on: {
'instanceReady': function(evt) {
},
'key' : function(evt) {
clearTimeout(checkTimeout);
checkTimeout = setTimeout(function() {
validateText(evt.editor);
}, 1000);
}
}
});
})();
</script>
</body>
</html>
Kod ten uruchamia licznik czasu, gdy użytkownik naciśnie klawisz, a następnie czeka na 1 sekundę po zaprzestaniu naciśnięcie klawiszy zrobić czek.
Skopiuj ten plik do nowego pliku .html i uruchom go w ulubionej przeglądarce (używam przeglądarki Chrome).
Kiedy ładuje się CKEditor, użyj myszki, aby umieścić kursor w środku tekstu. Następnie naciśnij klawisz CTRL i odczekaj 1 sekundę. Zobaczysz, że kursor przeskoczył z powrotem na początek tekstu.
Ten przykładowy kod wykorzystuje
editor.getSelection().createBookmarks();
aby utworzyć zakładkę. Ale próbowałem też:
editor.getSelection().createBookmarks(true);
i
editor.getSelection().createBookmarks2();
Próbowałem również tylko oszczędność zakres używając
var ranges = editor.getSelection().getRanges();
i
editor.getSelection().selectRanges(ranges);
w funkcji restoreCursorLocation.
Wystarczy dodać do tej odpowiedzi - o wiele bezpieczniejszym rozwiązaniem byłoby użycie ['CKEDITOR.style'] (http://docs.ckeditor.com/#!/api/CKEDITOR.style), ponieważ dotknie tylko tych części drzewa, które muszą zostać zmienione. Jednak aby go użyć, musisz zaimplementować funkcję szukającą tekstu w DOM, co jest dość skomplikowaną rzeczą. – Reinmar
Dzięki za doskonałą odpowiedź, Reinmar. W prawdziwym kodzie używam CKEDITOR.htmlParser, aby przejść przez dokument i dokonać modyfikacji. Nie tylko proste .replace(). Przyjrzę się używaniu stylów i zobaczę, czy to działa lepiej. Nie wiem, dlaczego createBookmark (true) nie działał wcześniej. Ale teraz jest. –