2012-06-27 158 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