最近做个小功能,功能效果如图:

试想一下,如果在选择文本之后不仅能获得对应文档片段,而且再获得文本对应的文档位置, 这样我们才能给文档片段包裹类名再后插入原来的位置。
这样的话咱们先来学习DOM2和DOM3的几个概念
1. window.getSelection()
getSelection()
方法,可以确定实际选择的文本。
这个方法是 window 对象和 document 对象的属性,调用它会返回一个表示当前选择文本的 Selection对象。
Selection 对象都有getRangeAt
属性。
getRangeAt(index)
,返回索引对应的选区中的 DOM 范围。
这个属性,这个属性返回索引对应的选区中的 DOM 范围,是一个Range
对象这样就记住了获取文档片段的位置。
2. Range.extractContents()
extractContents()
,会从文档中移除范围选区,并返回范围的文档片段,这样就获得了想要的文档片段。
3. Range.insertNode()
insertNode()
,是在Range的起始位置插入节点的方法。详细属性可以自行参考MDN或者高程
接下来就上代码
//css
.active {
background: #00FF90;
}
//html
<div id="text">
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。
故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。
锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。
蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
</div>
//js
function select() {
//获取选中文本位置,返回Range对象
let selectedRange = window.getSelection().getRangeAt(0);
//移除选区文档片段,并返回
let selectedFragment = selectedRange.extractContents();
let span = document.createElement("span");
span.classList = 'active';
//创建span标签添加想要的类名,名把返回的文档片段插入
span.appendChild(selectedFragment);
selectedRange.insertNode(span); //在获取的Range对象中插入span标签
//再点击span标签,在其前面添加span标签内的文本,并删除这个span标签
span.onclick = function(ev) {
this.parentNode.insertBefore(document.createTextNode(this.innerText), this);
this.parentNode.removeChild(this);
};
}
document.getElementById('text').onmouseup = function() {
select();
//鼠标松开后取消浏览器默认的深蓝色选中样式
window.getSelection().removeAllRanges();
};
如能对您有所帮助,实在是感到荣幸。如有不合理之处也请大家多多指点。 谢谢浏览。