Javascript 获取所选文本的索引
给定以下HTML:Javascript 获取所选文本的索引,javascript,html,Javascript,Html,给定以下HTML: <div> <span>This </span> <span>is </span> <span>plain </span> <span>text </span> <span>and </span> <span>this </span> <span>is &
<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>
这
是
平原
正文
及
这
是
更多
平原
正文
及
这
是
这个
最终的
平原
文本
显示为:
这是纯文本,这是更纯的文本,这是最终的
纯文本
请注意:
标记用于其他用途
我希望能够突出显示(光标选择)上述文本的任何部分,并获得光标选择文本的开始和结束索引。例如,以下光标选择(光标选择术语“纯文本”的第二次出现)将输出startIndex=35
和endIndex=44
已尝试的内容和想法:
- 现在,我使用
var text=window.getSelection().toString()获取光标选中的文本代码>
- 使用诸如
和indexOf
之类的函数似乎不是一个选项,因为光标选择的术语可能是任意的,因此没有模式,也不能保证它是唯一的lastIndexOf
- 我最近发布了一个非常类似的问题,该问题被标记为重复问题,因为这个问题有一个解决方案(使用
和selectionStart
),但要实现这一点,您必须使用selectionEnd
,这在本用例中是不可能的 - 我觉得,
标签的奇怪用法可能会在某种程度上被利用;特别是因为它是根据需要添加任何
s(或其他属性)的选项id
- 使用
而不是
不是此场景的选项
getSelection()
返回的文件的各种属性
您特别感兴趣的是:
-开始选择的元素anchorNode
-选择开始于的anchorOffset
中字符的索引anchorNode
-选择结束的元素focusNode
-选择在focusOffset
中结束的字符索引focusNode
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);
不确定问题出在哪里?预期结果是什么?光标所选术语相对于整个字符串的开始和结束索引。如果我有字符串“hello Bob,hello Bill”,我用光标选择第二个
“hello”
,那么结果应该是startIndex=10
和endIndex=14
。