2012-06-27 160 views
0

由于用户在CKEditor内容实例中输入文字,我希望能够即时将句子的第一个字母大写。CKeditor中首字母大写首字母缩写

该策略包括捕捉每个击键并在必要时尝试替换它,例如,当插入的字符沿着点和空格时。我很好捕捉事件,但无法找到一个方法来分析周围插入符位置的字符:

var instance = CKEDITOR.instances.htmlarea 
instance.document.getBody().on('keyup', function(event) { 
    console.log(event); 
    // Would like to parse here from the event object... 
    event.data.preventDefault(); 
}); 

任何帮助,将不胜感激,包括一个战略选择。

+0

请问您可以发布完整的代码吗?我正在查找你所做的! – Zagloo

回答

4

您应该使用​​事件(靠近你什么建议):

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()是什么样子?

  1. 您必须从editor.getSelection().getRanges()开始获取插入位置。
  2. 您只对该系列的第一个范围感兴趣。该范围内的文件开始的
    • 举动开始:
    • 从之前插入符号使用小窍门提取文本内容range.setStartAt(editor.document.getBody(), CKEDITOR.POSITION_AFTER_START)
    • 使用CKEDITOR.dom.walker通过源为了DOM树遍历,
    • 收集文本节点,并找出什么是脱字符号(是否/\. $/) - 请记住,您必须跳过内联标签并停止块标签 - 提示:返回falseguard函数停止遍历。如何你可以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,或者最近键入的文本(很难找到它在哪里))找到从较低信和修复它们。

+0

非常感谢Reinmar。关于可悲的事情,我不会实现这些特定的事件上下文。事实上,他们是解决这个大写功能的方法,这对处理异常很有帮助。 –

+0

我也在寻找相同的东西,但我可以在哪里编写上面的代码。我尝试使用JavaScript,但它没有提出关键事件,它不工作,我可以写这个任何一个可以帮助我out.thank你 – 2016-05-23 17:39:43