javascript - 获取光标选择文本的索引
问题描述
给定以下 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 = 35
和endIndex = 44
什么已经尝试和想法:
现在我正在使用光标选择文本
var text = window.getSelection().toString();
使用
indexOf
和之类的函数lastIndexOf
似乎不是一个选项,因为光标选择的术语可以是任意的,因此没有模式,也不能保证它是唯一的。我最近发布了一个非常相似的问题,该问题被标记为重复,因为有一个解决这个问题的方法(使用
selectionStart
andselectionEnd
),但要让它工作,你必须使用<textarea>
这个用例不可能的 a 。我觉得也许
<span>
可以以某种方式利用标签的奇怪用法;特别是因为它是根据需要添加任何id
s (或其他属性)的选项。
限制:
- 在这种情况下,不能使用 a
<textarea>
而不是 a 。<div>
解决方案
您需要询问由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);
推荐阅读
- java - test 和 src 目录/代码之间的区别在 test 文件夹中不起作用
- javascript - 部署应用后如何在 Webpack.config.js 中配置代理 url?
- python - store new values at every index of an empty matrix by implementing a nested for loop
- python - 使用 StellarGraph 创建嵌入是不可重现的
- powerbi - 按多列分组并聚合所有值
- c - 如何使用星号绘制“W”字母
- azure - 有没有办法知道并仅获取使用 REST API 在 Azure DevOps 管道上出现错误的阶段的日志?
- html - 我在哪里放置 ETag,格式是什么?
- haskell - Haskell 在什么逻辑意义上是引用透明的?
- aggregate - Sumologic 中的聚合通配符