【发布时间】:2017-08-17 19:20:57
【问题描述】:
我正在寻找一种方法来做两件非常基本的事情。我只想检索文本中插入符号的位置。然后我想将插入符号定位在文本中的特定位置。目的是能够以编程方式修改文本。
我发现很多人都在尝试做各种类似的事情,但并不是我想要的。事实上,大多数解决方案都在查看 HTML、查找范围和 DOM 元素。也许这是要走的路,但我还没有找到可行的解决方案。
查看获取光标位置。我从各种来源(例如this one)找到了以下解决方案:
var selection = e.editor.getSelection();
var range = selection.getRanges()[0];
var cursor_position = range.startOffset;
但这并不能解决我的问题。在以下文本中:
苹果
弓箭手
口音
如果将光标连续放在每个单词的A之后,则每次都返回1。我想要的是在第一个 A 之后获得 1,然后在第二个 A 之后获得 6,最后在第三个 A 之后获得 13。
换句话说,更多的问题是光标在文本中的哪个字符位置。例如,它应该允许我在文本中的第 X 个字符之后插入文本。
感谢您的帮助
【问题讨论】:
-
为了获得光标位置,您需要使用选择和范围。但是请注意,您不会得到您期望的 1,6,13 结果,因为 CKEditor 在背景中使用 HTML 而不是纯文本。如果您的任务是在忽略 HTML 的痛苦文本中返回光标位置,请准备好迎接很多挫折和痛苦,因为您肯定会遇到许多边缘情况。
-
您好@j.swiderski,感谢您的回答。实际上,我不介意长时间玩范围和选择以达到预期的结果。但到目前为止,我不知道如何。我通过字母数来说明结果,但将位置描述为“Row1/Range3/Offset4”对我来说是一样的,只要它允许将光标准确地返回到它所在的位置(在用户语言中)一个字一个字”)。单独的范围(如在给定的示例代码中)似乎是不够的。
-
请参阅dom.spec.whatwg.org/#interface-range 和旧的w3.org/TR/DOM-Level-2-Traversal-Range/…,因为它有恕我直言的好例子和更好的定义。通常,每个范围都有一个起始节点 (startContainer) 和该起始节点内的偏移量。 偏移量是相对于 startContainer 并且不显示在整个文档中的位置。如果您在 Apple 或 Archers 中折叠了选择,例如
<body><p>A^pple</p><p>A^rchers</p></body>然后偏移量是相对于段落(范围 startContainer)而不是例如身体。 -
@j.swiderski 对不起,久违了,我被拉离了这里,我回来了。感谢您的帮助。它确实阐明了整个范围系统的工作方式,我现在清楚地理解偏移量是相对于 startContainer 的。但这意味着要将插入符号返回到特定位置,我需要存储 startContainer 和偏移量,对吗?你会建议我怎么做?我需要在数据库中保存一些东西,以便我可以随时回到这一点。
-
嗨 Xosted。抱歉回复晚了。我认为您需要考虑 CKEditor 中的书签之类的东西。当您切换到源模式并返回或将数据保存到数据库中时,编辑器书签会被删除,因此您需要自己的解决方案。我会发布一个答案,因为我需要在那里添加一些评论。
标签: text insert ckeditor position cursor