You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在contenteditable元素的选中文本上创建链接右键菜单

实现contenteditable元素的选中文本右键添加链接功能

没问题,这个需求我之前做过类似的,咱们一步步来实现:

1. 先搭好基础HTML结构

首先需要一个可编辑的div,再加上自定义的上下文菜单(默认隐藏),菜单里放URL输入框和确认按钮:

<!-- 可编辑区域 -->
<div id="editableDiv" contenteditable="true" style="padding: 20px; border: 1px solid #ccc; min-height: 200px;">
  在这里编辑文本,选中一段后右键试试~
</div>

<!-- 自定义右键菜单 -->
<div id="linkMenu" style="display: none; position: fixed; background: white; border: 1px solid #ddd; padding: 10px; border-radius: 4px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); z-index: 1000;">
  <input type="text" id="urlInput" placeholder="输入链接地址" style="width: 200px; padding: 6px; margin-bottom: 8px; border: 1px solid #ccc; border-radius: 4px;">
  <button id="confirmLink">添加链接</button>
</div>

2. 核心JavaScript逻辑

接下来写JS代码,主要做这几件事:阻止默认右键菜单、捕获选中的文本、显示自定义菜单、生成链接。

// 获取元素
const editableDiv = document.getElementById('editableDiv');
const linkMenu = document.getElementById('linkMenu');
const urlInput = document.getElementById('urlInput');
const confirmLinkBtn = document.getElementById('confirmLink');

// 保存选中的文本范围(关键,右键后选中状态会丢失)
let selectedRange = null;

// 1. 监听右键点击事件
editableDiv.addEventListener('contextmenu', (e) => {
  // 阻止浏览器默认右键菜单
  e.preventDefault();
  
  // 获取当前选中的文本
  const selection = window.getSelection();
  if (selection.toString().trim() === '') {
    // 如果没选中文本,不显示自定义菜单
    return;
  }
  
  // 保存选中的范围对象
  selectedRange = selection.getRangeAt(0);
  
  // 定位自定义菜单到鼠标位置
  linkMenu.style.left = `${e.clientX}px`;
  linkMenu.style.top = `${e.clientY}px`;
  linkMenu.style.display = 'block';
  
  // 自动聚焦输入框
  urlInput.focus();
});

// 2. 点击确认按钮生成链接
confirmLinkBtn.addEventListener('click', () => {
  const url = urlInput.value.trim();
  if (!url || !selectedRange) return;
  
  // 创建a标签
  const link = document.createElement('a');
  link.href = url;
  link.textContent = selectedRange.toString();
  
  // 替换选中的文本为a标签
  selectedRange.deleteContents();
  selectedRange.insertNode(link);
  
  // 重置状态:隐藏菜单、清空输入框、清除选中范围
  linkMenu.style.display = 'none';
  urlInput.value = '';
  selectedRange = null;
  
  // 让光标回到链接后面,提升编辑体验
  const newRange = document.createRange();
  newRange.setStartAfter(link);
  newRange.collapse(true);
  const selection = window.getSelection();
  selection.removeAllRanges();
  selection.addRange(newRange);
});

// 3. 点击页面其他地方关闭菜单
document.addEventListener('click', (e) => {
  if (!linkMenu.contains(e.target) && e.target !== editableDiv) {
    linkMenu.style.display = 'none';
    urlInput.value = '';
    selectedRange = null;
  }
});

// 4. 支持回车确认输入
urlInput.addEventListener('keydown', (e) => {
  if (e.key === 'Enter') {
    confirmLinkBtn.click();
  }
});

一些细节优化

  • 我加了回车确认的功能,用户不用每次都点按钮,更顺手
  • 生成链接后自动把光标移到链接后面,保持编辑的连贯性
  • 没选中文本时不显示菜单,避免无效操作
  • 菜单用fixed定位,确保在页面任何位置都能正确显示

这样整个流程就通了:选中文本→右键唤起菜单→输入URL→点击确认/回车,选中文本就变成超链接啦!

内容的提问来源于stack exchange,提问作者Andrew Ahn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:20:02