您應該使用事件(靠近你什麼建議):
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