【问题标题】:CKEditor 4: How to get and set the cursor / caret position?CKEditor 4:如何获取和设置光标/插入符号的位置?
【发布时间】: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


【解决方案1】:

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

您可以做的是使用protectedSource 来保护您的自定义书签跨度:

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

接下来,您需要提供自定义代码,该代码将在您需要时将&lt;span class="my-break-point"/&gt; 插入到编辑器 HTML 中,并跟踪书签,以便在插入下一个时删除前一个。

当然,这只是一个基本示例。如果选择没有折叠,您可以有一个书签用于折叠选择或两个书签用于选择的开始/结束。

请先尝试插入书签,然后查看 HTML 中插入的折叠和非折叠选择的内容: - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark2

示例代码:

var range = editor.getSelection().getRanges()[0];
var bm = range.createBookmark();

如果有什么不清楚的地方,请告诉我。

【讨论】:

  • 非常感谢您的帮助。我开始玩书签,看看发生了什么。起初它看起来很完美,但实际上它们并不耐用。我可以序列化书签对象并将其保存在数据库中,但如果我重新加载文档(即使它也已保存),我将无法返回此书签。下一步是创建我自己的书签。我会尝试你的建议。但是我觉得我仍然不明白为什么在文档(或节点树)中获取插入符号的“地址”如此困难。
  • 要将书签放在正确的位置,我需要插入符号在文档中的位置(它的“地址”),无论它会出现什么形状或形式。我不明白为什么我不能简单地将这个“地址”信息保存在数据库中,然后再回到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多