我在开发将不可编辑的内容插入文本流的 CKEditor 插件时遇到了麻烦。我一直在尝试使用范围函数,但由于文档不够出色,因此收效甚微。因此,给定一些文本,假设插件插入“[[uneditable stuff]]”,然后在 WYSIWYG 显示中将其包装在一个跨度中,以便可以设置颜色样式:
<p>This is some text[[uneditable stuff here]]</p>
当第一次插入不可编辑的东西时,我们希望用户能够继续输入或按 Enter 换行。以下代码(我在这里得到:How to set cursor position to end of text in CKEditor?)在 Firefox 中有效,但(自然)在 IE9、8 或 7 中无效:
var s = editor.getSelection();
editor.insertElement(e); // element 'e'= a span created earlier
var p = e.getParent();
s.selectElement(p);
var selected_ranges = s.getRanges();
selected_ranges[0].collapse(false); // false = to the end of the selected node
s.selectRanges(selected_ranges); // putting the current selection there
所以我想要发生的是光标位于“^”位置:
<p>This is some text<span>[[uneditable stuff here]]</span>^</p>
如果新元素不在行尾,那么在创建之后,光标应该到这里:
<p>This is some text<span>[[uneditable stuff here]]</span>^ with more text after the new element</p>
在 FF 中,我可以将光标放在行尾,尽管不在新元素之后的位置。在 IE 中,光标仍在新的 SPAN 内,我在键入时看到它仍然是 span 的 css 颜色,当切换到 SOURCE 视图时,文本消失了(因为它是一个不可编辑的 span)。
我知道有一个 range.setStartAfter 方法,但即使在 FF/Chrome 中也完全无法使其工作。
有人对在 CKEditor 中使用范围和选择方法有很好的处理吗?我知道我没有!
开始认为只使用 editor.insertElement 是错误的,我应该了解 FakeElement (insertBogus?) 函数,我还不明白。诸如链接和图像之类的股票插件似乎没有这个问题。