在Summernote中切换到代码视图时,光标总是移动到文档的末尾。有没有办法在切换时保持光标位置?有时使用它的人想写一些自定义HTML,因为这比使用编辑器的按钮更快,但是在切换到代码视图后,他们必须向上滚动并尝试找到之前的位置。这不太实用。
这里有一个简单的stackblitz。
基本上,我需要实现的是:当光标在这里时,我想点击“代码视图”按钮并跳转到这里。
这里有一个简单的stackblitz。
基本上,我需要实现的是:当光标在这里时,我想点击“代码视图”按钮并跳转到这里。
function getCaretCharacterOffsetWithin(element) {
var caretOffset = 0;
var doc = element.ownerDocument || element.document;
var win = doc.defaultView || doc.parentWindow;
var sel;
if (typeof win.getSelection != "undefined") {
sel = win.getSelection();
if (sel.rangeCount > 0) {
var range = win.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
}
} else if ( (sel = doc.selection) && sel.type != "Control") {
var textRange = sel.createRange();
var preCaretTextRange = doc.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}
$(document).ready(function() {
$('#summernote').summernote({
callbacks: {
onKeydown: function(e) {
const editable = document.getElementsByClassName('note-editable')[0]
const pos = getCaretCharacterOffsetWithin(editable)
console.log(pos)
const codable = document.getElementsByClassName('note-codable')[0]
codable.setSelectionRange(pos,pos)
}
}
})
$('#summernote').summernote('fullscreen.toggle');
});
getCaretCharacterOffsetWithin
的功劳归功于Tim Down
getCaretCharacterOffsetWithin()
可以获取在.note-editable
中光标的位置,但不是完全准确的,而且当你来回移动段落边界时,该值甚至不一致(正如Tim在他的原始帖子中警告的那样)。
setSelectionRange(pos,pos)
将在.note-editable
中的位置镜像到.note-codable
中。
另外
代码视图
并返回之前才会开始工作。并修复这个问题。onKeydown
上工作。textarea
中的光标位置
note-editable
中的光标位置并将其镜像到note-codable
,但这并不容易。我从来没有达到一对一的对应点。光标始终会偏差几个符号。而且你需要在相反的方向上镜像光标-从note-codable
到note-editable
-这我甚至都没试过。因此,我只发布了一个可以指导你正确方向的链接。 - x00