在前端开发的时候有时候会遇到一种需求:在一段文本中获取选中的一段文字。
如下:怎么获取选择的文字呢?

getSelection()方法
window对象有一个getSelection()方法,他会返回一个Selection对象。从这个对象中储存了拖动鼠标选择文本的一些信息。
比如:用户选择的文本范围、插入符号的位置等。
举个例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<p>getSelection()方法可以返回一个Selection对象,用于表示用户选择的文本范围或插入符的当前位置。</p>
</body>
<script>
//鼠标监听,当释放鼠标的时候,调用testSelection()方法。
document.onmouseup=function(){
testSelection();
}
function testSelection(){
//获取Selection对象
let selection=window.getSelection();
//调用selection对象的toString()方法就可以获取鼠标拖动选中的文本。
console.log("选中的文本为:");
console.log(selection.toString());
}
</script>
</html>
上面的代码是:鼠标拖动选中一段文字,释放鼠标后会在控制台把选中的文字输出。
其实也可以不显示的调用用toString()方法。直接写console.log(selection+“”)。这样得到的效果是一样的。
跨元素选中文本,怎么获取多段字符?
可能有时候要选中的文本不在一个标签内,可能会跨多个标签。
比如下面的html代码,下面的文字在两个标签里。如果我选择一段跨标签的文字,然后我想把他转换成一个字符数组,把每个元素中的字符放到一个数组里怎么弄?
<body> <p>getSelection()方法可以返回一个Selection对象,</p> <p>用于表示用户选择的文本范围或插入符的当前位置。</p>
</body>
这个时候如果直接使用selection.toString()获取的是一段换行的字符。
比如选中:

控制台输出:

输出的是一段含有换行符号的字符串,可以使用split()方法转换成字符数组。
selection.toString().split("
");
//返回的就是个字符串数组。
Range对象获取选中的标签
上面的例子,是把每个标签里面的字符分到一个字符串数组里面了。但是如果想要获取选中的文本分别在哪些标签里面呢?
这时候可以使用Selecton对象的getRangeAt(0)这个方法,获取一个Range对象。
Range对象的api请参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Range