使用 JS 将链接插入到选定的文本中(当用户专注于输入 URL 时丢失 window.getSelection() 值)

2024-01-12

我正在尝试将链接插入到选定的文本中,这在前端编辑器中很常见。

我可以添加一个指向用户文本选择的链接,如下所示:

var sel = window.getSelection();
var e = document.createElement("a");
e.innerHTML = sel.toString();
e.type = "link";
e.href = "www.the_link_to_open.com"
e.target = "_blank";
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(e)

这样就成功添加了一个<a>围绕所选单词添加标签,并添加添加链接所需的属性,如下所示:

<a type="link" href="www.the_link_to_open.com" target="_blank">highlighted text</a>

但是,用户在编辑器中经历的流程是选择单词,然后打开一个可以添加链接的输入。但是,一旦用户单击(聚焦)输入字段,window.getSelection()注册input作为选择,这显然使得添加链接变得不可能(因为所选单词需要作为选择)。

我尝试存储结果window.getSelection()稍后使用,但这似乎会动态更改存储的值。我什至尝试了硬(?)副本来尝试存储window.getSelection()永久使用const selection = JSON.stringify(window.getSelection())但这并没有捕获输出。

当用户焦点远离所选文本时,如何保存选择对象?


在这里,您有一个具有两个功能的工作解决方案,如我上面的评论中所述。

let selectedText, range;

function getSelectedText() {
  const selectObj = window.getSelection();
  selectedText = selectObj.toString();
  range = selectObj.getRangeAt(0)
}


function createLink(e) {
  var a = document.createElement("a");
  a.innerHTML = selectedText
  a.type = "link";
  a.href = e.target.value
  a.target = "_blank";
  range.deleteContents();
  range.insertNode(a);
}

document.querySelector('.text').addEventListener('mouseup', getSelectedText)
document.querySelector('.link').addEventListener('change', (e) => createLink(e))
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div class="text">
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima illum, quod assumenda nisi illo hic quo minus excepturi quasi labore debitis nemo molestiae nesciunt, neque laboriosam repellendus necessitatibus vero corporis.
    </div>
    <br />
    <div>
      <label>Add url</label>
      <input class="link" type="text" />
    </div>
  </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JS 将链接插入到选定的文本中(当用户专注于输入 URL 时丢失 window.getSelection() 值) 的相关文章

随机推荐

  • 验证 macOS 应用程序以将 Mac 从睡眠状态唤醒

    我正在寻找一种对 macOS 应用程序进行身份验证的方法 该方法允许该应用程序将用户的 Mac 从睡眠状态唤醒 我知道我可以安排一个电源事件来使用与所提供的类似的代码唤醒计算机here https stackoverflow com que
  • 文件描述符存储在进程内存中的哪里?

    当从执行点调用函数A时 内部是一个JMP语句到指向函数A的地址 因此当前执行点被保存到堆栈中 PC加载被调用函数A的地址并继续 为了在函数调用后返回到执行点 函数块应该有相同的压入和弹出堆栈 通常在 C 中退出函数时 定义的堆栈变量会被销毁
  • 如何防止 Vim 在分割窗口时滚动?

    当我水平分割窗口时 我想阻止 Vim 滚动 如果这是正确的词 假设我在 Vim 中编辑一个 10 行文件 我在缓冲区上有一个窗口 窗口高 40 行 有足够的空间容纳两个窗口 一个在另一个之上 两个窗口都显示整个缓冲区 比方说scrollof
  • $parse、$interpolate 和 $compile 服务之间有什么区别?

    有什么区别 parse interpolate and compile服务 对我来说 他们都做同样的事情 获取模板并将其编译为模板函数 这些都是有助于 AngularJS 视图渲染的服务示例 尽管 parse and interpolate
  • Java 计算一年中的天数或两个日期之间的天数

    任何本机 Java 类中是否有一种方法可以计算特定年份中过去 将有多少天 就像 这是一个闰年 https en wikipedia org wiki Leap year 366天 还是平年 365天 还是需要我自己写 我正在计算两个日期之间
  • git - 只获取文件,不获取历史记录

    当我跑步时git pull or git fetch 我显然检索了历史记录和文件 对于大型项目来说 这需要花费很多时间 我想知道如何加快这个过程 对于某些项目 我只对源代码感兴趣 而不是对历史感兴趣 有没有办法告诉 git 我只想获取文件的
  • 在寄存器前加一个星号是什么意思?

    我正在研究c 如何通过汇编语言调用正确的成员函数 我附带的简单程序如下 class A public virtual void show class B public A public void show
  • 如何从外部进程打开 Visual Studio 中的现有工作项?

    我有一个控制台应用程序 它使用 TFS API 创建工作项 我希望应用程序在打开创建的工作项的情况下启动 Visual Studio 我试过 Process Start vstfs WorkItemTracking WorkItem 123
  • resignFirstResponder 不起作用?

    我尝试在 iPad 上隐藏键盘 但我不知道为什么 resignFirstResponder 不起作用 但 popToRoot 工作得很好 BOOL textFieldShouldReturn UITextField textField NS
  • 如何在grep结果中保留换行符?

    我想将 grep 结果分配给一个变量以供进一步使用 lines cat abc txt grep hello 但当我这样做时 似乎换行符在结果中被删除 echo lines 只打印一行 如何保留换行符 因此当我回显 lines 时 它会生成
  • Python 初学者 - 没有名为“mpi4py”的模块

    我是一名学生 第一次使用Python 目前我在虚拟机上使用 Xubuntu 19 10 我检查了 python 和 mpi4py 安装 我的 并行编程 教授给了我这个简单的 python 代码 from mpi4py import MPI
  • 渲染 JList 时更改光标

    我已经实现了我想要做的事情 但我忍不住认为有一种更有效的方法 请允许我来说明 简而言之 我要问的问题是是否有一种方法可以确定组件何时完成其初始渲染 我有一个 JList 它连接到 DefaultListModel 并由扩展了 Default
  • 主要 PHP/MySQL 登录项目,带有会话变量

    好吧 这两天我一直在网上搜寻并尽力搭建一个相当复杂的登录系统 我已经让它的核心工作起来了 用户可以注册并登录 我对简单的 php 和 mysql 并不陌生 但是当涉及到像这样的深入代码时 我迷失了 基本上我想要的是让用户输入他们的登录名 然
  • 如何完成这个python函数保存在同一个文件夹中?

    我正在尝试编写我的第一个真正的 python 函数 它可以做一些真正的事情 我想要完成的是搜索给定的文件夹 然后打开所有图像并将它们合并在一起 以便它们制作幻灯片图像 想象一下 5 个图像堆叠在一张图像中 我现在有了这段代码 应该没问题 但
  • 包含首字母缩略词的类的命名约定

    如果我用 OOP 语言命名一个新类 这是一个更好的约定 XMLWriter 最常见的 XMLwriter 更容易区分 XmlWriter 不再是缩写词 XML Writer 去掉了驼峰式的点 是的 很迂腐 但我很好奇谁使用什么以及为什么使用
  • 使用 python 脚本从 hdfs (hadoop) 目录获取文件列表

    如何使用python脚本从hdfs hadoop 目录中获取文件列表 我尝试过以下行 dir sc textFile hdfs 127 0 0 1 1900 directory collect 该目录有文件列表 file1 file2 fi
  • Node.js 和 CPU 密集型请求

    我已经开始修补 Node js HTTP 服务器 并且非常喜欢编写服务器端 Javascript 但有些事情阻止我开始在我的 Web 应用程序中使用 Node js 我了解整个异步 I O 概念 但我有点担心程序代码非常占用 CPU 资源的
  • 无法使用 OTG 端口连接 google Coral

    当我使用串行端口运行 google Coral 时 我可以运行演示应用程序 但是当我尝试运行时 谷歌珊瑚使用数据端口 C型电缆 我无法连接开发板 rahul ubuntu mdt shell 正在等待设备 连接到 Wishful yarn
  • JMeter 与远程服务器

    我正在尝试以分布式模式设置 JMeter 我有一个在 ec2 实例上运行的服务器 我希望主服务器在我的本地计算机上运行 我不得不跳过一些希望让 RMI 在服务器上正常工作 但通过将 java rmi server hostname 设置为
  • 使用 JS 将链接插入到选定的文本中(当用户专注于输入 URL 时丢失 window.getSelection() 值)

    我正在尝试将链接插入到选定的文本中 这在前端编辑器中很常见 我可以添加一个指向用户文本选择的链接 如下所示 var sel window getSelection var e document createElement a e inner