Text CKEditor 4:如何获取和设置光标/插入符号位置?

Text CKEditor 4:如何获取和设置光标/插入符号位置?,text,insert,ckeditor,position,cursor,Text,Insert,Ckeditor,Position,Cursor,我正在寻找一种方法来做两件非常基本的事情。我只想检索插入符号在文本中的位置。然后我想将插入符号放置在文本中的特定位置。目的是能够以编程方式修改文本 我发现很多人都在尝试做各种类似的事情,但不是我想要的。事实上,大多数解决方案都在研究HTML,查找范围和DOM元素。也许这是一条路,但我还没有找到一个有效的解决办法 查看如何获取光标位置。我从各种来源(例如)找到了以下解决方案: 但这并不能解决我的问题。在以下案文中: 苹果 弓箭手 口音 如果光标直接放在每个单词的A后面,则每次返回1。我想要的是在第

我正在寻找一种方法来做两件非常基本的事情。我只想检索插入符号在文本中的位置。然后我想将插入符号放置在文本中的特定位置。目的是能够以编程方式修改文本

我发现很多人都在尝试做各种类似的事情,但不是我想要的。事实上,大多数解决方案都在研究HTML,查找范围和DOM元素。也许这是一条路,但我还没有找到一个有效的解决办法

查看如何获取光标位置。我从各种来源(例如)找到了以下解决方案:

但这并不能解决我的问题。在以下案文中:

苹果

弓箭手

口音

如果光标直接放在每个单词的A后面,则每次返回1。我想要的是在第一个A之后定位时得到1,然后在第二个A之后定位时得到6,最后在第三个A之后得到13

换句话说,更重要的是光标在文本中的哪个字符位置。例如,它应该允许我在文本的第X个字符后插入文本


感谢您的帮助

查看您的最后一条评论,您可能希望尝试在CKEditor中实现类似书签的功能,但更耐用。正如我所解释的,当您将数据发布到服务器或简单地切换到源模式并返回时,原始书签将被删除。更重要的是,我建议使用的空跨距被编辑器删除,因为它们没有可视表示,被认为是垃圾

您可以使用
protectedSource
保护您的自定义书签范围:

var editor = CKEDITOR.replace( 'editor1', {
    language: 'en',
    protectedSource :  /<span.*class="my-break-point".*\/>/g
});

如果有任何不清楚的地方,请告诉我。

为了获得光标位置,您需要使用选择和范围。但是请注意,您将无法获得预期的1,6,13结果,因为CKEditor在后台使用HTML而不是纯文本。如果您的任务是在痛苦文本中返回光标位置而忽略HTML,请做好准备,迎接许多挫折和痛苦,因为您肯定会遇到许多边缘情况。您好@j.swiderski,谢谢您的回答。事实上,我不介意玩范围和选择这么久,我得到了预期的结果。但到目前为止,我不知道怎么做。我用一个字母数来说明结果,但对我来说,将位置描述为“Row1/Range3/Offset4”也是一样的,只要它允许将光标精确地返回到它所在的位置(在用户语言中“在单词中的一个字母之后”)。单独的范围(如给定的示例代码)似乎不够。请参阅和一个旧的范围,因为它有很多好的示例和更好的定义。通常,每个范围都有一个起始节点(startContainer)和该起始节点内的偏移量。偏移量相对于startContainer,不显示整个文档中的位置。如果您在Apple或Archers中折叠了选择,例如,
A^pple

A^rchers

,那么偏移量是相对于段落(范围起始容器)的,而不是例如body.@j.swiderski对于长期缺席,我很抱歉,我被拉离了这里,我回来了。谢谢你的帮助。它确实澄清了整个范围系统的工作方式,我现在清楚地了解到偏移量是相对于startContainer的。但这意味着要将插入符号返回到特定位置,我需要存储startContainer和偏移量,对吗?你建议我怎么做?我需要在数据库中保存一些东西,这样我就可以随时回到这一点。对不起,迟了答复。我认为您需要在CKEditor中考虑类似书签的东西。当您切换到源代码模式并返回或将数据保存到数据库中时,编辑器书签将被删除,因此您需要自己的解决方案。我将发布一个答案,因为我需要在那里添加一些评论。非常感谢你的帮助。我开始玩书签,看看发生了什么。起初它看起来很完美,但实际上,它们并不耐用。我可以序列化bookmark对象并将其保存在db中,但如果重新加载文档(即使它也保存了),我就无法返回到该书签。下一步是创建我自己的书签。我会试试你的建议。然而,我觉得我仍然不明白为什么在文档(或节点树)中获取插入符号的“地址”如此困难。要将书签放在正确的位置,我需要插入符号在文档中的位置(其“地址”),无论它是什么形状或形式。我不明白为什么我不能简单地将这个“地址”信息保存在数据库中,然后再回到这一点。
var editor = CKEDITOR.replace( 'editor1', {
    language: 'en',
    protectedSource :  /<span.*class="my-break-point".*\/>/g
});
var range = editor.getSelection().getRanges()[0];
var bm = range.createBookmark();