2013-08-27 56 views
1

我們有一個bug at this CKEditor plugin,一個通用的解決方案是like to this,將通用字符串過濾器僅應用於DOM的終端文本節點。在CKEditor-4中遍歷DOM節點

QUESTION:如何(需要的代碼示例)遍歷通過的CKEditor-4工具選擇節點editor.getSelection()),如CKEDITOR.dom.range

+0

這個問題的答案合作[2013年8月28日這個插件版本](https://github.com/onderceylan/ckeditor-texttransform-plugin/blob/master/plugin.js) –

回答

4

第一步將從當前選擇中獲取範圍。要做到這一點只要致電:

var ranges = editor.getSelection().getRanges(); 

這給你範圍的數組,因爲理論上(和這個理論只由火狐證明)一個選擇可以包含許多範圍。但在99%的實際案例中,您只能處理第一個案例而忽略其他案例​​。所以你有range

現在,迭代此範圍中每個節點的最簡單方法是使用CKEDITOR.dom.walker。以下面的方式使用它:

var walker = new CKEDITOR.dom.walker(range), 
    node; 

while ((node = walker.next())) { 
    // Log values of every text node in range. 
    console.log(node.type == CKEDITOR.NODE_TEXT && node.getText()); 
} 

但是,在範圍邊界處的文本節點存在問題。請考慮以下範圍:

<p>[foo<i>bar</i>bo]m</p> 

這將記錄:foobarbom。是的 - 整個bom,因爲它是一個單一的節點和沃克不修改DOM(有文檔中的錯誤)。

因此,如果它等於範圍的startContainerendContainer,並且如果是 - 只轉換範圍內的那部分,則應檢查要轉換的每個節點。

注意:我不知道沃克的內部,我不確定是否可以修改DOM,而迭代它。我建議首先緩存節點,然後進行更改。

+0

非常感謝!關於'walker'問題......嗯......另一種方法是使用DOM-2標準的Javascript方法:如何獲得編輯(選定)文本的DOM?我們可以使用XPath('text()')或'document.querySelector'等來迭代所有文本節點......並且直接調用(在迭代完成後按照你的建議)'nodeValue'或'textContent'屬性。 –

+0

解決[引用插件代碼](https://github.com/onderceylan/ckeditor-texttransform-plugin/blob/master/plugin.js)錯誤的另一種方法是通過正則表達式...如何獲得XHTML(像DOM'saveXML')?有一個'selection.getSelectedHTML()'來代替'selection.getSelectedText()'? –

+0

對不起,但我不明白你的問題。它們似乎與主要的無關。 – Reinmar