划词高亮实现 (更新中)

本文介绍了使用JavaScript进行划词高亮的技术实现,包括数据结构的设计、选区高亮的处理,如获取Range对象、创建HighlightRange对象以及处理选区内所有节点的高亮包装。在事件触发部分,重点讲解了在鼠标抬起(mouseUp)时如何实现选区的高亮效果。
摘要由CSDN通过智能技术生成

划词高亮

在这里插入图片描述

数据结构

HighlightRange

class HighlightRange {
   
    start: DomNode; // Range 开始的信息
    end: DomNode; // Range 结束的信息
    text: string; // 文本内容
    id: string;  // 唯一标识
}

DomNode

export interface DomNode {
   
    $node: Node;  // 节点
    offset: number;  // 节点中的偏移量
}

选区高亮

获取Range对象

  • 获取当前选取的DOM Range对象
export const getDomRange = (): Range => {
   
    const selection = window.getSelection();
    // 选区的起始点和终点是否在同一个位置
    if (selection.isCollapsed) {
   
        console.debug('no text selected');
        return null;
    }
    // 选取的range集合。但是规范要求选择的内容始终(仅)具有一个范围。
    return selection.getRangeAt(0);
};

生成HighlightRange 对象

  • Range对象 + id -> HighlightRange 对象
    static fromSelection(idHook: Hook) {
   
        const range = getDomRange(); //当前选取的DOM Range对象
        if (!range) {
   
            return null;
        }

        const start: DomNode = {
   
            $node: range.startContainer,
            offset: range.startOffset
        };
        const end: DomNode = {
   
            $node: range
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值