Tôi đã đọc số excellent answer này cho cùng một câu hỏi. Tuy nhiên, tôi đã thử mọi kỹ thuật mà @Reinmar được đề xuất và không có kỹ thuật nào trong số đó có vẻ hoạt động.CKEDITOR - không thể khôi phục vị trí con trỏ sau khi sửa đổi DOM
Tình huống là tôi đang lấy HTML hiện tại từ trình chỉnh sửa và gói các phần nhất định trong các thẻ span. Sau đó tôi đặt lại HTML đã sửa đổi và cố gắng khôi phục vị trí con trỏ của người dùng. Không có kỹ thuật nào hoạt động.
Dưới đây là một ví dụ rất đơn giản để tạo lại vấn đề:
<!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>
Mã này bắt đầu một bộ đếm thời gian khi người dùng nhấn một phím, và sau đó chờ 1 giây sau khi họ dừng nhấn phím để làm việc kiểm tra.
Sao chép tệp này vào tệp .html mới và chạy tệp đó trong trình duyệt yêu thích của bạn (Tôi đang sử dụng Chrome).
Khi CKEditor tải, sử dụng chuột để đặt con trỏ của bạn ở đâu đó ở giữa văn bản. Sau đó nhấn phím CTRL và đợi 1 giây. Bạn sẽ thấy con trỏ nhảy trở lại phần đầu của văn bản.
mã ví dụ này sử dụng
editor.getSelection().createBookmarks();
để tạo ra các bookmark. Nhưng tôi cũng đã cố gắng:
editor.getSelection().createBookmarks(true);
và
editor.getSelection().createBookmarks2();
Tôi cũng đã cố gắng chỉ tiết kiệm phạm vi sử dụng
var ranges = editor.getSelection().getRanges();
và
editor.getSelection().selectRanges(ranges);
trong hàm restoreCursorLocation.
Chỉ cần thêm vào câu trả lời này - một giải pháp an toàn hơn nhiều là sử dụng ['CKEDITOR.style'] (http://docs.ckeditor.com/#!/api/CKEDITOR.style), bởi vì nó sẽ chỉ chạm vào những phần này của cây phải được thay đổi. Tuy nhiên, để sử dụng nó, bạn sẽ cần phải thực hiện một chức năng tìm kiếm một văn bản trong DOM, đó là một điều khá phức tạp. – Reinmar
Cảm ơn câu trả lời tuyệt vời, Reinmar. Trong mã thực, tôi đang sử dụng CKEDITOR.htmlParser để xem qua tài liệu và thực hiện các sửa đổi. Không chỉ làm đơn giản .replace(). Tôi sẽ xem xét việc sử dụng các kiểu và xem nó có hoạt động tốt hơn không. Không chắc chắn tại sao createBookmark (true) không hoạt động cho tôi trước đây. Nhưng bây giờ. –