跨节点边界时如何用多个元素包裹 getSelection()

How to wrap getSelection() with multiple elements when it crosses node boundaries

这是我用一个元素包裹所选文本的方法:

let selectObj = window.getSelection();
let wrapTag = document.createElement("a");

const range = selectObj.getRangeAt(0).cloneRange();
range.surroundContents(wrapTag);
selectObj.removeAllRanges();
selectObj.addRange(range);

但如果选择跨越文本节点边界,它将不起作用,所以我想我可以为每个跨越的节点做另一个换行,而不是像这样失败(选择的文本在 a 标签内):

<div>
    Lorem 
    <b>ipsum
    <a>dolor</b> sit</a>
    amet
</div>

它创建两个像这样的包装:

<div>
    Lorem
    <b>ipsum <a>dolor</a></b>
    <a>sit</a>
    amet
</div>

你知道我是怎么做到的吗?

由于 Rangy 库,它非常简单,它包含一个 "createClassApplier" 模块,如果需要,可以用多个包装来包装任何跨边界选择。

您可以通过以下方式获得它:

npm install rangy

代码示例:

import rangy from 'rangy/lib/rangy-classapplier';

rangy.init();
let rangyOptions = {};
let rangyWrapper = rangy.createClassApplier("your-class", rangyOptions);
rangyWrapper.applyToSelection();

您可以在第二个参数中指定许多选项(更改默认跨度标记、添加属性等...),您可以检查every options here