1.选中标注文字
实现思路:通过@mouseup和window.getSelection();获取选中文字范围,创建一个新的span标签,将选中内容放入新的span标签中并可以设置选中样式。删除选中文字,在选中区域插入新的span标签进行替换。
通过@mouseup获取鼠标选中文字事件
使用window.getSelection()获取选中文本范围相关信息
const selection = window.getSelection();
将选中范围保存到rang中:const range = selection.getRangeAt(0);
获取选中文字:const selectedText = selection.toString()获取
选中范围起点节点:selection.anchorNode;
选中范围末点节点: selection.focusNode;
创建span标签: const span = document.createElement("span")
设置标签样式:span.style.textDecoration = "underline";
将选中内容放到span标签中:span.appendChild(document.createTextNode(selectedText));
将选中文字删除:range.deleteContents();
将创建的span标签插入到文字中:range.insertNode(span);
2.选中取消标注
实现思路:通过删除选中范围内的span标签并保留span标签中的文字,实现标注的取消。
获取选中文字对应的HTML元素对象textElements
const selection = window.getSelection();
const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
const textElements = [];
if (range) {
const walker =
document.createTreeWalker(range.commonAncestorContainer,NodeFilter.SHOW_TEXT);
let node = walker.nextNode();
while (node) {
const parentElement = node.parentElement;
if (parentElement) {
textElements.push(parentElement);
}
node = walker.nextNode();
}
}
删除span标签并将span标签的内筒添加到新节点内
let children = textElements
//删除div标签里面的span标签并保存span标签中的文字内容
// 遍历所有子节点
for (let i = 0; i < children.length; i++) {
const child = children[i];
console.log(child.tagName);
//
// 如果子节点是span标签
if (child.tagName === "SPAN") {
// 提取span标签中的内容
// 提取span标签中的内容
const textContent = child.textContent;
// 创建一个新的文本节点,并将span标签中的内容添加到这个新节点中
const newTextNode = document.createTextNode(textContent);
// 用新的文本节点替换原来的span标签
child.parentNode.replaceChild(newTextNode, child);
} else if (child.hasChildNodes()) {
// 如果子节点还有子节点,递归处理这个子节点
console.log("是有子节点呢");
console.log(child)
}