保持光标位置在contenteditable

时间:2014-05-28 23:03:59

标签: javascript css contenteditable

我正在尝试使用contenteditable创建一个richtext区域。突出显示的解析器返回一个html字符串,我将元素的内容替换为(可能无效,就像现在一样)。

令人满意的问题是,在我这样的事情之后,光标位置不会被保留。我可以理解。

有没有办法保留这个位置?我可以让解析器返回一个元素来表示插入符应该在哪里(假设文本中的游标偏移),如果这有助于解决方案。

提前致谢。

1 个答案:

答案 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相当的结果。