简而言之,问题是:给定一个所见即所得的编辑器(CKEditor),你想让一个插件进行文本转换 - 选择一段文本并操纵其中的文本(例如大写)。例如:
这是段落一个
这个是第二段
如果粗体代表您的选择,结果将是
这是段落 ONE
这个是第2段
这里的问题是选择将是一个完整的HTML片段,即使选择不包含完整标记。选定的HTML是:
<p>one</p> <p>this</p>
注意第一个和最后一个<p>
标记。当您在选择html中执行dom遍历时,应用文本转换并替换html,它将使用这些部分标记,因此您的结果将变为:
这是段落
ONE
:此
是第2段
我检查了它是否可以&#34;合并&#34;第一个和最后一个部分标签与他们的dom父母,但选择对象是孤立的,它没有兄弟姐妹或父母从它的原始背景。
还试图找到一个选项来检索没有这些自动修复标签的选择,但没有运气。
在CKEditor文档中,他们提到walker object - 但是会自动从选择扩展到完整的封闭标记,这意味着选择仅用作最小边界。
另外,因为选择对象是孤立的,所以不可能只更改那里的dom节点文本值 - 需要替换原始的dom片段(至少在CKEditor的情况下)。
我尽量不要坚持使用CKEditor api,但是在这一点上我也没有看到任何替代品。这真的是一个难题还是我错过了什么?
答案 0 :(得分:1)
一种解决方案是使用浏览器引擎用标记标记所选区域(afaik是本机操作)。这与您选择粗体或斜体相同 - 但是这里它将是一个临时包装。然后你走DOM并替换临时标签中的内容 - 最后删除标签(保留内容)。
这确保您可以在精确选择上应用转换,并且通过删除标记,您不会破坏原始DOM。简而言之:
不太优雅但是有效。这是受到@Andrew_Mast关于包裹在跨度中的想法的启发。
答案 1 :(得分:0)
我会遍历所有单词以及不同标记内的每组单词,用<span style="text-transform: uppercase;">
和</span>