如何动态地将 标签附加到

标签的特定位置?

2024-03-02

本质上,我正在尝试实现一个在选择时突出显示某些文本的功能。这仅适用于 Google Chrome 浏览器。

例如: 选型前:

<html>
    <body>
        <p>sample text</p>
    </body>
</html>

从“示例文本”中选择“文本”后:

<html>
    <body>
        <p>sample <span class="state-highlighted">text</span> </p>
    </body>
</html>

JavaScript:

document.body.addEventListener("mousedown", (event) => {
  document.body.addEventListener("mouseup", (event) => {

    // Assume we have checked that mousedown position is different from mouseup position.
    // Not sure what to do after this.

  });
});

我可以从一个更简单的问题开始: 如何将 span 元素插入到 paragragh 元素中,比如说单击时?


鼠标松开时,调用window.getSelection()得到一个选择 https://developer.mozilla.org/en-US/docs/Web/API/Selection目的。您可以检查它以查找内部所选内容的开始和结束文本<p>。然后更换<p>的 HTML 包围该文本部分<span class="highlighted">:

const p = document.body.querySelector('p');
const origContent = p.textContent;
p.addEventListener('mousedown', () => {
  p.textContent = origContent;
});
p.addEventListener('mouseup', (e) => {
  const selection = window.getSelection();
  if (!selection) {
    return;
  }
  const range = selection.getRangeAt(0);
  // If user starts highlighting on the right, and drags mouse to the left,
  // endOffset will be smaller than startOffset:
  const startIndex = Math.min(range.startOffset, range.endOffset);
  const { length } = String(selection);
  const endIndex = startIndex + length;
  p.textContent = p.textContent;
  p.innerHTML = (
    p.textContent.slice(0, startIndex) +
    '<span class="highlighted">' +
    selection +
    '</span>' +
    p.textContent.slice(endIndex)
  );
});
.highlighted {
  background-color: orange;
}
<p>sample text sample text sample text sample text sample text sample text sample text sample text sample text</p>

如果用户可能一次选择文本的多个部分,并且您想要突出显示两个不连续的文本片段,则可以迭代从 0 到selection.rangeCount并对原始上下文进行切片以相应地创建新的 HTML。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态地将 标签附加到

标签的特定位置? 的相关文章

  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • HTML5 MediaSource 适用于某些 mp4 文件,但不适用于其他文件(相同的编解码器)

    我正在玩 MediaSource API 代码直接取自 Mozilla 的示例页面 https developer mozilla org en US docs Web API MediaSource endOfStream https d
  • Jquery 数据表列总和

    我只是参考一下这个链接 https datatables net examples advanced init footer callback html了解如何获取 jquery 数据表中的列总计 但我已经完成了一半的项目 我在html页面
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 使用css bootstrap时如何仅向一列添加右边框?

    我正在尝试使用CSS引导框架 http getbootstrap com css tables在我的项目中 我正在使用带有以下类的表table table bordered table striped 我想删除除第一列之外的所有列的边框 这
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • ASP.NET WebApi DateTimeOffset 序列化为 Json/JavaScript (angular2)

    我没有找到一个很好的方法来获取 JavaScript Angular2 的 DateTimeOffset 值 我正在使用 WebApi 5 2 3 和 angular2 在网上我看到日期如下 RecordModifiedAt 2016 03
  • OpenGL ES 2.0 中的光线拾取

    我正在尝试在 OpenGL ES 2 0 中实现光线拾取以确定是否已单击对象 到目前为止 我只是想检查是否已按下特定的三角形 我使用这个网站作为动力http android raypick blogspot ca 2012 04 first
  • CodeIgniter 仅允许在登录时访问某些控制器

    我有一些 CodeIgniter 控制器 只能由已登录的用户访问 即 this gt session gt userdata username 不为空 如果未经身份验证的人尝试访问所述控制器 他们应该收到 header location a
  • chromedriver:ubuntu 14.04 64 位上缺少各种 lib 依赖项

    所以我尝试运行从下载的 chromedriver 2 20 wget http chromedriver storage googleapis com 2 20 chromedriver linux64 zip 在我的 ubuntu 14
  • 如何向 UILabel 添加填充? [复制]

    这个问题在这里已经有答案了 UILabel 内的文本与左边框和右边框相冲突 有没有办法向 UILabel 添加一些内部填充 以便文本不会如此紧密地接触内部边框 只需调整标签的位置 我不知道任何其他方法 尽管其他人可能会 如果您对背景颜色有疑
  • OpenXML:Excel 中自动调整列宽

    我已经编写了使用 OpenXML 生成 Excel 文件的代码 下面是在 Excel 中生成列的代码 Worksheet worksheet new Worksheet Columns columns new Columns int num
  • HistoryRecord 的活动空闲超时?

    W ActivityManager 81 Launch timeout has expired giving up wake lock W ActivityManager 81 Activity idle timeout for Histo
  • log4j:记录包,但不包括其子包

    您好 我想排除某些子包被我的一个记录器记录 因为它们正在被另一个记录器记录 例如 com mysite app logger1 com mysite app news logger2 com mysite app events logger
  • 如何使用 ASP.NET MVC 将字典绑定到一组复选框?

    我的需要是 绑定 Dictionary
  • Maven 的 Jersey 问题 - Shade 插件

    我的问题非常类似于 仅当依赖项组装到单个 jar 中时才会抛出 Jersey 异常 https stackoverflow com questions 12611213 jersey exception only thrown when d
  • 过滤R中所有列包含相同数据的行

    我有一个数据集 要求每个参与者回答一系列问题 有些人对每个问题都给出了相同的回答 我想丢弃这些参与者的数据 但不知道如何去做 我的意思是我可以尝试过滤 区分 但我遇到的问题是大约有 100 个问题 所以 100 列 我不确定使 R 过滤所有
  • 使用PHP 5.5的password_hash和password_verify函数

    假设我想存储用户的密码 这是否是使用 PHP 5 5 的正确方法password hash 函数 或 PHP 5 3 7 的此版本 https github com ircmaxell password compat https githu
  • 我在 Visual Studio 2010 中找不到从工具菜单生成本地资源

    我在网页的设计视图 标记 中 我在工具菜单中找不到 生成本地资源 谁能告诉我如何启用这个工具 查看 aspx 或 ascx 文件时 确保您正在查看 设计 或 拆分 选项卡 而不是 源 选项卡 此外 这篇文章可能会有所帮助 其中部分指出 如果
  • C# 中的 'volatile' 关键字仍然被破坏吗?

    乔 阿尔巴哈里有一个很棒的系列 http www albahari com threading 关于多线程 这是必读的内容 对于任何从事 C 多线程处理的人来说都应该牢记于心 然而 在第 4 部分中 他提到了 volatile 的问题 请注
  • 获取用户信息 Google-PHP-Client 问题?

    首先 我只想说我需要从用户那里获取哪些信息 全名 名字 姓氏 电子邮件地址 主帐户 而不是 google plus com 位置 国家 州 城市 地址 Youtube 用户名 为了获取所有这些信息 我继续下载 安装位于以下位置的 PHP 客
  • 如何创建静态链接共享库

    在我的硕士论文中 我尝试为 ARM Cortex M3 嵌入式系统采用共享库方法 由于我们的目标板没有 MMU 我认为使用 普通 动态共享库是没有意义的 因为 text 是直接从闪存执行的 而 data 在启动时被复制到 RAM 所以我无法
  • MinGW 调试模式下 Qt 应用程序启动缓慢

    我在 Win 7 上使用 Qt Creator 3 1 1 和 Qt 5 3 如果设置了 2 个套件 VC2013 和 MinGW 4 8 1 我的应用程序可以编译 并且可以与两个编译器一起使用 但是当我以 MinGW gdb 调试模式启动
  • 如何使用 sklearn Pipeline 转换项目?

    我有一个简单的 scikit learnPipeline共两个步骤 aTfIdfVectorizer随后是一个LinearSVC 我已经使用我的数据拟合了管道 都好 现在我想使用我的拟合来转换 而不是预测 一个项目pipeline I tr
  • 为 git log 这样的两个字命令创建别名?

    有时我有两个词的命令 例如git log or apt get install我想添加一个默认参数 例如 大多数时候我想添加 abbrev commit参数给我的git log 以及 y参数为apt get install git log
  • 如何动态地将 标签附加到

    标签的特定位置?

    本质上 我正在尝试实现一个在选择时突出显示某些文本的功能 这仅适用于 Google Chrome 浏览器 例如 选型前 p sample text p 从 示例文本 中选择 文本 后 p sample span class state hi