当前位置: 首页 > 知识库问答 >
问题:

javascript - window.getSelection(); 获取鼠标选中文本后 给文本添加 span标签 实现高亮 第一次获取的时候 下标正常 加完span标签后 下标位置就不对了?

暴才俊
2024-04-24

window.getSelection(); 获取鼠标选中文本后 给文本添加 span标签 实现高亮 第一次获取的时候 下标正常 加完span标签后 下标位置就不对了

共有1个答案

樊令秋
2024-04-24

当你在网页中使用 window.getSelection() 来获取用户选中的文本,并尝试通过添加 span 标签来高亮这段文本时,可能会遇到下标位置变化的问题。这是因为当你向选中的文本节点添加新的 span 标签时,DOM 结构发生了变化,原有的节点和偏移量(offset)也随之改变。

要解决这个问题,你可以采取以下步骤:

  1. 保存原始范围(Range):首先,使用 getSelection() 获取 Selection 对象,并从该对象中获取 Range 对象。这个 Range 对象代表了用户选中的区域。
  2. 创建新的节点:创建一个新的 span 元素,并设置所需的样式(例如,背景颜色以实现高亮)。
  3. 提取文本内容:从原始的 Range 对象中提取文本内容。
  4. 替换文本内容:使用提取出来的文本内容替换原始选中文本节点的内容。
  5. 将新节点插入到DOM中:将新的 span 元素插入到原来选中文本的位置。
  6. 调整范围:由于DOM结构已经改变,需要重新设置 Range 的起始和结束位置,以确保它们指向新的 span 元素。

以下是一个简化的示例代码,展示了如何实现这一过程:

// 获取选中的文本const selection = window.getSelection();if (selection.rangeCount > 0) {  const range = selection.getRangeAt(0);  // 创建新的 span 元素  const span = document.createElement('span');  span.style.backgroundColor = 'yellow'; // 设置高亮颜色  // 提取选中的文本  const textNode = range.extractContents();  const text = textNode.textContent;  // 将文本设置到新的 span 元素中  span.textContent = text;  // 将 span 元素插入到原始位置  range.insertNode(span);  // 重新设置范围以包括新的 span 元素  range.setStart(span, 0);  range.setEnd(span, span.childNodes.length);  // 更新选择以反映新的范围  selection.removeAllRanges();  selection.addRange(range);}

这段代码应该能解决你遇到的问题。注意,这种方法会改变原始选中文本的结构,因为它用一个新的 span 元素替换了原始文本节点。如果你的应用依赖于原始的DOM结构,那么你可能需要调整其他部分的代码来适应这种变化。

 类似资料:
  • 问题内容: 有人可以告诉我未指定a 或元素的&位置吗? 即: 在上面,如果我这样做: 返回的值。但是,如果我尝试将其用于“ 12a”,则不会返回任何内容。 我在页面上有一堆/ s,我无法为其指定/ 属性,但是我需要在该元素的正下方显示一个。 问题答案: 此函数将告诉您元素相对于页面的x,y位置。基本上,您必须遍历所有元素的父级并将其偏移量加在一起。 但是,如果您只是想要元素相对于其容器的x,y位置

  • 问题内容: 我的链接看起来像这样 我想从那里去。我试过了 它输出。 我试过了,但它给了我KeyError。我该如何解决?我的错误是什么? 问题答案: 您可以使用css选择器,使用标题文本拉出所需的跨度: 找到具有包含 RAM 的 title 属性的 跨度 ,等效于在python中说。 或在 re.compile中 使用 find __ 要获取所有数据: 这会给你:

  • 查看此截图: 我正在使用这段代码添加表情符号在div的跨度。 但标记后没有附加空格,这样我就可以在标记后编写下一个文本。

  • 文本标签通常用于帮助记录仪表板,例如添加仪表板标题、URL 链接。 添加一个文本标签 在仪表板选项卡中,点击 “添加文本”。 将其放在仪表板上。 输入标题。 属性 文本标签的可用属性: 选项 描述 位置 自定义标签的位置。 大小 自定义标签的大小。 标题 输入标签的标题。 对齐方式 指定标签标题的文本对齐方式。 字体 设置标签标题的字体样式。 粗体 将粗体样式应用于标签标题。 斜体 将斜体样式应用

  • 文本标签通常用于帮助记录仪表板,例如添加仪表板标题、URL 链接。 添加一个文本标签 在仪表板选项卡中,点击 。 将其放在仪表板上。 输入标题。 属性 文本标签的可用属性: 选项 描述 位置 自定义标签的位置。 大小 自定义标签的大小。 标题 输入标签的标题。 对齐方式 指定标签标题的文本对齐方式。 字体 设置标签标题的字体样式。 粗体 将粗体样式应用于标签标题。 斜体 将斜体样式应用于标签标题。

  • 文本标签通常用于帮助记录仪表板,例如添加仪表板标题、URL 链接。 添加一个文本标签 在仪表板选项卡中,点击 “添加文本”。 将其放在仪表板上。 输入标题。 属性 文本标签的可用属性: 选项 描述 位置 自定义标签的位置。 大小 自定义标签的大小。 标题 输入标签的标题。 对齐方式 指定标签标题的文本对齐方式。 字体 设置标签标题的字体样式。 粗体 将粗体样式应用于标签标题。 斜体 将斜体样式应用