您应该使用事件(靠近你什么建议):
var editor = CKEDITOR.instances.editor1;
editor.document.getBody().on('keydown', function(event) {
if (event.data.getKeystroke() === 65 /*a*/ && isFirstLetter()) {
// insert 'A' instead of 'a'
editor.insertText('A');
event.data.preventDefault();
}
});
现在 - 应该如何isFirstLetter()
是什么样子?
- 您必须从
editor.getSelection().getRanges()
开始获取插入位置。
- 您只对该系列的第一个范围感兴趣。该范围内的文件开始的
- 举动开始:
- 从之前插入符号使用小窍门提取文本内容
range.setStartAt(editor.document.getBody(), CKEDITOR.POSITION_AFTER_START)
,
- 使用
CKEDITOR.dom.walker
通过源为了DOM树遍历,
- 收集文本节点,并找出什么是脱字符号(是否
/\. $/
) - 请记住,您必须跳过内联标签并停止块标签 - 提示:返回false
从guard
函数停止遍历。如何你可以range
使用walker
例子:
var range, walker, node;
range = editor.getSelection().getRanges()[0];
range.setStartAt(editor.document.getBody(), CKEDITOR.POSITION_AFTER_START);
walker = new CKEDITOR.dom.walker(range);
walker.guard = function(node) {
console.log(node);
};
while (node = walker.previous()) {}
而现在一些伤心的事。
- 我们假设您在输入时选择为空 - 这不一定是真的。当选择未折叠(空白)时,您必须在致电
insertText
之前手动删除其内容。您可以使用range#deleteContents
来执行此操作。
- 但是,这不是全部 - 删除范围的内容后,你必须把脱字号放在正确的位置 - 这不是微不足道的。基本上,您可以使用
range#select
(在deleteContents
之后的范围内),但在某些情况下,它可能会将脱字符号放置在不正确的位置 - 如段落之间。解决这个问题是......如果没有关于HTML + editables + insertions +其他东西的知识,就不可行。
- 该解决方案是不完整的 - 你必须处理
paste
事件,删除内容(可以从句子的开头删除的话),等等,等等
- 我想有几个我甚至没有其他问题想到:P。
所以这种方法是不现实的。如果你仍然想实现这个功能,我认为你应该设置计时器并遍历DOM(你可以在包含整个文档的范围上使用walker
,或者最近键入的文本(很难找到它在哪里))找到从较低信和修复它们。
请问您可以发布完整的代码吗?我正在查找你所做的! – Zagloo