Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在getSelection()跨越节点边界时使用多个元素包装它_Javascript_Dom_Selection - Fatal编程技术网

Javascript 如何在getSelection()跨越节点边界时使用多个元素包装它

Javascript 如何在getSelection()跨越节点边界时使用多个元素包装它,javascript,dom,selection,Javascript,Dom,Selection,下面是我用元素包装所选文本的步骤: let selectObj = window.getSelection(); let wrapTag = document.createElement("a"); const range = selectObj.getRangeAt(0).cloneRange(); range.surroundContents(wrapTag); selectObj.removeAllRanges(); selectObj.addRange(range); 但是,如果选择

下面是我用元素包装所选文本的步骤:

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</a></b>
    <a>sit</a>
    amet
</div>

洛勒姆
同侧阴沟
坐
艾米特

你知道我如何实现它吗?

多亏了这个库,它非常简单,它包含一个“createClassApplier”模块,如果需要,它可以用多个包装来包装任何跨境选择

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

npm install rangy
代码示例:

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

rangy.init();
let rangyOptions = {};
let rangyWrapper = rangy.createClassApplier("your-class", rangyOptions);
rangyWrapper.applyToSelection();
您可以在第二个参数中指定许多选项(更改默认范围标记、添加属性等),您可以进行检查

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

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