首页 > 解决方案 > 获取光标选择文本的索引

问题描述

给定以下 HTML:

<div>
    <span>This </span>
    <span>is </span>
    <span>plain </span>
    <span>text </span>
    <span>and </span>
    <span>this </span>
    <span>is </span>
    <span>more </span>
    <span>plain </span>
    <span>text </span>
    <span>and </span>
    <span>this </span>
    <span>is </span>
    <span>the </span>
    <span>final </span>
    <span>plain </span> 
    <span>text</span>
</div>

显示为:

这是纯文本,这是更纯文本,这是最终纯文本

请注意:<span>标签被用于其他目的。

我希望能够突出显示(光标选择)上述文本的任何部分并获取光标选择文本的开始和结束索引。例如,以下光标选择(光标选择术语“纯文本”的第二次出现)将输出startIndex = 35endIndex = 44

在此处输入图像描述

什么已经尝试和想法:

限制:

标签: javascripthtml

解决方案


您需要询问由getSelection().

您特别感兴趣的是:

  • anchorNode- 选择开始的元素
  • anchorOffset- 选择中字符的索引anchorNode开始于
  • focusNode- 选择结束的元素
  • focusOffset- 选择中字符的索引focusNode结束于

然后是进行 DOM 迭代和一些数学运算的案例。

把它放在一起:

let div = document.querySelector('div'),
    text = div.innerText;
div.addEventListener('mouseup', evt => {
    let sel = getSelection(),
        result = {start: null, end: null};
    if (!sel) return;
    ['start', 'end'].forEach(which => {
        let counter = 1,
            tmpNode = div.querySelector('span'),
            node = which == 'start' ? 'anchor' : 'focus';
        while(tmpNode !== sel[node+'Node'].parentElement) {
            result[which] += tmpNode.innerText.length;
            counter++;
            tmpNode = div.querySelector('span:nth-child('+counter+')')
        }
        result[which] += sel[node+'Offset'] + (which == 'start' ? 1 : 0);
    });
    alert('Selection starts at '+result.start+' and ends at '+result.end);
}, false);

小提琴


推荐阅读