gpt4 book ai didi

javascript - 在内容丰富的中设置选择开始和结束

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:26:07 26 4
gpt4 key购买 nike

我正在尝试为采用基于语法的格式设置的网页创建一个 JavaScript 编辑器。它完全取代了 innerHTML<pre>使用 onkeyup 标记.但是,这会导致插入符号被移动到编辑器的开头。

我能找到的唯一解决方案是在进行更改之前获取选择开始和结束的偏移量,然后在最后设置它们。我用于获取选择开始和结束的代码修改自 https://stackoverflow.com/a/4812022/2093695 :

var selStart, selEnd;
if (typeof window.getSelection != "undefined") {
var range = window.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(editor);
preCaretRange.setEnd(range.endContainer, range.endOffset);
selStart = preCaretRange.toString().length;
selEnd = selStart + range.toString().length;
} else if (typeof document.selection != "undefined" && document.selection.type != "Control") {
var textRange = document.selection.createRange();
var preCaretTextRange = document.body.createTextRange();
preCaretTextRange.moveToElementText(editor);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
selStart = preCaretTextRange.text.length;
selEnd = selStart + textRange.text.length;
} else selStart = 0;

这部分工作正常,至少在 Firefox 中是这样。我的问题是设置选择。到目前为止,我的情况如下:

// restore selection
if (selStart) {
if (range) {
range = window.getSelection().getRangeAt(0);
range.setStart(editor,selStart);
range.setEnd(editor,selEnd);
// Doesn't work, in FF at least
// Behavior: when there are no tags,
// for 0, caret set at beginning
// for 1, caret set at end
// for anything greater, "IndexSizeError: Index or size is negative or greater than the allowed amount"
// when the editor contains tags,
// for 0, caret set at beginning of editor
// for 1, caret set at beginning of first tag (unless same as start of editor)
// for 2, caret set at end of first tag
// for 3, caret set at beginning of second tag
// for 4, caret set at end of second tag, and so on
// for a number that is 1 greater than whatever number would set the caret at the end of the last tag, caret set at end of editor
// for a number greater than that, same error as before
} else if (document.selection && document.selection.createRange) {
// Not sure what to do here
}
}

是这样吗setStartsetEnd应该工作吗?我究竟做错了什么?有没有更好的方法来设置选择的开始和结束,最好不使用库?

最佳答案

我为此发布了几个不同的函数。我找不到我最近的一个,但下面有一个指向 jsFiddle 的链接,其中包含一个应该有用的 restoreSelection() 函数:

https://stackoverflow.com/a/7404126/96100

更新:我找到了这段代码的最新版本。它的工作原理应该是一样的,但内部结构更优雅一些。

https://stackoverflow.com/a/13950376/96100

关于javascript - 在内容丰富的中设置选择开始和结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com