【发布时间】:2018-06-13 17:49:42
【问题描述】:
我正在尝试使用window.getSelection().getRangeAt(0) 来获取句子中所选单词的索引。它在没有任何<mark> 和<abbr> 的文本中运行良好。但是当句子中有这样的标签时,这个功能似乎会将句子分成几段。
例如,HTML中的一句话看起来像My car <abbr title="car_state"><mark>broke down</mark></abbr>. What do I do?
当我选择broke down 之前的文本时,它工作正常。但是当我选择后面的文本时,例如,e What,它将在2 处给出startOffset 而不是22。
是否可以获取整个句子的索引?
受 Kaiido 回答的启发,以下方法将起作用。 虽然突出显示的文本不匹配,但无论如何我都不需要突出显示的文本
请随时添加有关解决方案的 cmets。
运行示例
$('#selected_text').click(function(){
var text = "My car is broke down. What do I do?";
var range = window.getSelection().getRangeAt(0);
var start = range.startOffset;
var end = range.endOffset;
var extra = 0;
var selected_string = range.toString();
var t = $('span').contents();
for(var i = 0; i < t.length; i++){
console.log(extra);
if(t[i].wholeText === undefined){
extra += t[i].textContent.length;
}else if(t[i].wholeText.includes(selected_string)){
break;
}else{
extra += t[i].length;
}
}
start += extra;
end += extra;
console.log("start index: " + start);
console.log("end index: " + end);
console.log(text.slice(start, end));
console.log(selected_string);
console.log("match: ", (selected_string === text.slice(start, end)));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<span>My car is <abbr title="car_state"><mark>broke down</mark></abbr>. What do <mark>I</mark> d<mark>o</mark>?</span>
<button id='selected_text'>show selected text</button>
</body>
</html>
【问题讨论】:
-
另外:请使用 minimal reproducible example 来更新您的问题,以展示问题,最好是使用 Stack Snippets(
[<>]工具栏按钮;here's how to do one)的可运行问题。
标签: javascript html getselection