跨节点边界时如何用多个元素包裹 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。
这是我用一个元素包裹所选文本的方法:
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。