我正在尝试使用contenteditable创建一个richtext区域。突出显示的解析器返回一个html字符串,我将元素的内容替换为(可能无效,就像现在一样)。
令人满意的问题是,在我这样的事情之后,光标位置不会被保留。我可以理解。
有没有办法保留这个位置?我可以让解析器返回一个元素来表示插入符应该在哪里(假设文本中的游标偏移),如果这有助于解决方案。
提前致谢。
答案 0 :(得分:1)
我可以让解析器返回一个表示插入符应该在哪里的元素
这就够了。假设您解析生成的HTML,现在您在sentinel
中引用了caret-should-be-here元素。
使用document.createRange()
创建DOM范围。让here
成为新范围。调用here.selectNode(sentinel)
使范围围绕元素。
调用here.deleteContents()
删除虚拟元素。
调用window.getSelection().removeAllRanges()
清除当前选择,该选择因HTML更改而搞砸了。
调用window.getSelection().addRange(here)
将光标放在元素的位置。
是
sentinel
我的锚元素吗?
是的,我猜。
如何获取字符串中的光标位置? ...我希望从字符串的开始处偏移。
让我们从光标位置开始。窗口选择的第零范围应该是光标的位置。也就是说,范围的开始和结束位于光标的相同位置。但是,这些位置的表达方式是面向DOM树,而不是字符串和偏移。它们有一个(开始|结束)容器和一个(开始|结束)偏移量。检查DOM规范的含义。
您对某种字符串偏移感兴趣。正如我所解释的那样,如果您采用纯文本版本的子树,那么哪个索引对应于该范围?有多种方法可以定义子树的纯文本版本。一个是textContent
属性返回的内容,foo<br>bar
给出&#34; foobar&#34;。有些浏览器定义了innerText
,其中foo<br>bar
给出了&#34; foor \ nbar&#34;。您可能已经选择了您正在使用的那个,但问题中没有说明。
无论如何,这是一个想法,但它可能不适合您的应用。
将窗口选择设置为从开头(索引0应该在哪里)到光标位置的单个范围。
阅读window.getSelection().toString().length
。在我开发的浏览器中,选择对象上的toString
会产生与innerText
相当的结果。