2013-08-27 52 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