javascript - 想要获取文本(内容)的开始和结束索引
问题描述
我想使用 selectNodeContents() 或 document.createRange() 从整个内容中获取所选文本(内容)的开始和结束索引。
我努力了
<div id="parent">
Hello everyone! <p id="demo_text">This is my home page</p>
</div>
var node = document.getElementById('demo_text');
var range = document.createRange();
range.selectNodeContents(node);
我想,
startIndex = 16 // starting index of "This" from "Hello everyone! This is my home page"
endIndex = 35 // end index of "page" from "Hello everyone! This is my home page"
解决方案
如果您实际上只是在寻找索引,您可以.innerText
结合使用String.prototype.indexOf()
来定位您的子元素innerText
在父元素中的位置innerText
,这将返回起始索引。然后可以通过添加子字符串的长度来计算结束索引。
const node = document.getElementById('demo_text');
const parent = document.getElementById('parent');
const startIndex = parent.innerText.indexOf(node.innerText);
const endIndex = startIndex+node.innerText.length-1;
console.log('startIndex: ', startIndex);
console.log('endIndex: ', endIndex);
console.log(parent.innerText[startIndex]);
console.log(parent.innerText[endIndex]);
<div id="parent">
Hello everyone! <p id="demo_text">This is my home page</p>
</div>
但是,如果您要选择字符串,则需要使用创建新Selection
对象window.getSelection()
并将已创建的范围添加到其中。MDN 上的示例
// Clear any current selection
const selection = window.getSelection();
selection.removeAllRanges();
const node = document.getElementById('demo_text');
const range = document.createRange();
range.selectNodeContents(node);
// Add the range to the empty selection
selection.addRange(range);
::-moz-selection {
background: pink;
}
::selection {
background: pink;
}
<div id="parent">
Hello everyone! <p id="demo_text">This is my home page</p>
</div>
推荐阅读
- cytoscape.js - 试图将节点扩展为空父节点
- ios - 如何在 Swift 中通过发送 multipeersession 发送 [Double] 数组?
- python - Python Socket 编程 - ConnectionRefusedError: [WinError 10061] 由于目标机器主动拒绝,无法建立连接
- javascript - 未捕获的类型错误:r.getClientRects 不是函数 jquery.min.js:2
- python - Python如何分组到合并的数据框?
- ruby-on-rails - 为什么 FactoryBot 每次都为 lat/lng 分配相同的值?
- php - 从 http 迁移到 Https codeigniter 时的配置问题
- javascript - 如何将类 onclick 事件切换为仅
- 使用Vuejs的lis列表中的元素?
- vb.net - 完全格式化释放内存
- mysql - MySQL UPDATE 触发器错误 - 无法更新语句已使用的表