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

javascript - js 文本划选?

施俊远
2024-04-25

js 文本划选 第一次划取执行的时候没有问题,获取的起始位置是相对于div标签的。
执行之后会向html中添加span标签

第二次划取span标签后的文字的时候,获取的起始位置却是相对于span标签的
有没有方法每次获取的起始位置都是相对于div的?

共有1个答案

陈龙野
2024-04-25

你的问题似乎是关于在JavaScript中处理文本选择(文本高亮或划取)时,如何确保获取的起始位置始终基于特定的div元素,而不是基于其后添加的span元素。

当你在一个div内部添加span元素后,文本选择(例如,用户通过鼠标拖拽选择文本)的起始和结束位置将基于当前的DOM结构来确定。这意味着,如果选择的文本跨越了div和span的边界,那么起始和结束位置可能会相对于span,而不是原始的div。

为了解决这个问题,你可以采取以下策略:

  1. 固定参考系:在进行文本选择之前,始终确保选择的文本基于同一个父元素(在这个例子中是div)。你可以通过移除或隐藏span元素来确保这一点,或者在选择完成后立即恢复它们。
  2. 计算偏移量:如果你不能更改DOM结构,可以计算span元素相对于其div父元素的偏移量,并在选择时减去这些偏移量。这样,你可以将选择的位置转换回原始的div坐标系。
  3. 使用Range和Selection API:JavaScript的RangeSelectionAPI提供了丰富的工具来操作文本选择。你可以使用这些API来获取选择的文本及其位置,并手动调整它们以基于div而不是span。

这是一个基本的示例,展示了如何使用Range和Selection API来获取选择的文本及其相对于特定元素的位置:

function getSelectedTextAndOffset(relativeToElement) {  const selection = window.getSelection();  if (selection.rangeCount > 0) {    const range = selection.getRangeAt(0);    const startOffset = range.startOffset;    const endOffset = range.endOffset;        // 找到相对于relativeToElement的起始和结束位置    const rect = relativeToElement.getBoundingClientRect();    const startRect = range.getBoundingClientRect();    const endRect = new Range().setStart(range.endContainer, range.endOffset).getBoundingClientRect();    // 计算偏移量    const startOffsetRelativeToDiv = startRect.left - rect.left;    const endOffsetRelativeToDiv = endRect.left - rect.left;    const selectedText = range.extractContents().textContent;    return {      text: selectedText,      startOffset: startOffsetRelativeToDiv,      endOffset: endOffsetRelativeToDiv    };  }  return null;}// 使用方法:const divElement = document.getElementById('yourDivId');const { text, startOffset, endOffset } = getSelectedTextAndOffset(divElement);console.log('Selected text:', text);console.log('Start offset relative to div:', startOffset);console.log('End offset relative to div:', endOffset);

请注意,这个示例是一个基本的起点,可能需要根据你的具体需求进行调整。特别是,它假设选择的文本都在一个单一的div内,并且没有考虑更复杂的DOM结构或跨多个元素的选择。

 类似资料:
  • $format = new \Vtiful\Kernel\Format($fileHandle); $style = $format->strikeout()->toResource();

  • 一个JS文件想使用本地一个JSON文件中的数据 百度了下,发现不能直接去读取这个JSON文件。可以通过JQUERY的一个方法或者new XMLHttpRequest();这样来获取到JSON文件中的内容,不知道还有没有其他更简洁的方法? https://segmentfault.com/a/1190000038275195

  • 我想更改编辑文本下面的蓝色,我不知道它是什么属性。 我试着用不同的背景色,但没用。 我在下面附上了一张图片:

  • js函数参数占位符报错问题 经网上搜索,如果函数传入多个值,但是又没有使用第一的值,可以用_符号进行展位,但是自己写代码时会发现浏览器报错。代码如下 报错信息: 该怎么占位呢?

  • 所以我使用了这个图表。jshttp://www.chartjs.org/docs/我不能改变底部文字的颜色 例如:“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”以及左侧的数字 我尝试了所有这些选项: scaleFontColor: “#FFFFFF” pointLabelFontColor: “#FFFFFF” 我的完整代码:

  • 版本生命周期 版本 状态 积极支持截止时间 安全维护截止时间 发布或预计发布时间 3.0 研发中 / / 2021-06-20 2.1 积极支持中 / / 2020-12-28 2.0 安全维护中 2020-12-28 2021-06-30 2020-06-22 1.1 停止维护 2020-06-23 2020-12-31 2019-10-08 1.0 停止维护 2019-10-08 2019-1