如何避免从部分选择中破坏块级HTML元素?

时间:2015-11-13 02:24:36

标签: javascript html dom ckeditor

简而言之,问题是:给定一个所见即所得的编辑器(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,但是在这一点上我也没有看到任何替代品。这真的是一个难题还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

一种解决方案是使用浏览器引擎用标记标记所选区域(afaik是本机操作)。这与您选择粗体或斜体相同 - 但是这里它将是一个临时包装。然后你走DOM并替换临时标签中的内容 - 最后删除标签(保留内容)。

这确保您可以在精确选择上应用转换,并且通过删除标记,您不会破坏原始DOM。简而言之:

  1. 在选择上应用标记(使用浏览器或wysiwyg api)
  2. 找到所有临时标签:
    • 递归地走标签的孩子
      • 如果tag是文本节点,则应用转换
      • 否则递归走路
    • 收集标签的左侧兄弟文本节点+标签的html +右侧兄弟文本节点
    • 将tag的父html替换为先前的编译(= remove temp tag)
  3. 不太优雅但是有效。这是受到@Andrew_Mast关于包裹在跨度中的想法的启发。

答案 1 :(得分:0)

我会遍历所有单词以及不同标记内的每组单词,用<span style="text-transform: uppercase;"></span>

围绕它