前端面试:富文本编辑器里面如何在划词选择的文本上添加右键菜单?

在富文本编辑器中,为划词选择的文本添加右键菜单(上下文菜单)是一项常见的需求。实现这一功能涉及监听用户的右键点击事件、显示自定义菜单以及在该菜单上执行相应操作。以下是实现这一功能的步骤和示例代码。

1. HTML 结构

首先,假设有一个用于展示富文本的容器和一个上下文菜单的基本 HTML 结构。

<div id="editor" contenteditable="true" style="border: 1px solid #ccc; padding: 10px;"> 这是一个可编辑的富文本区域。请在这里选择文本。 </div> <div id="context-menu" style="display:none; position:absolute; background:#fff; border:1px solid #ccc; z-index:1000;"> <ul> <li id="bold">加粗</li> <li id="italic">斜体</li> <li id="underline">下划线</li> </ul> </div> 

2. CSS 样式

可以根据需要给菜单添加一些基本的样式,以使其看起来更美观。

#context-menu { padding: 5px; } #context-menu ul { list-style: none; padding: 0; margin: 0; } #context-menu li { padding: 5px 10px; cursor: pointer; } #context-menu li:hover { background-color: #f0f0f0; } 

3. JavaScript 实现

接下来,使用 JavaScript 来实现右键菜单的打开、关闭和功能处理。

1. 监听右键点击事件

在富文本编辑器的容器上监听 contextmenu 事件,以便检测右键点击。

const editor = document.getElementById('editor'); const contextMenu = document.getElementById('context-menu'); // 右键点击事件 editor.addEventListener('contextmenu', function(event) { event.preventDefault(); // 阻止默认的右键菜单 const selection = window.getSelection(); // 确保有选中的文本 if (selection && selection.toString().length > 0) { // 获取点击位置并显示上下文菜单 contextMenu.style.top = `${event.clientY}px`; contextMenu.style.left = `${event.clientX}px`; contextMenu.style.display = 'block'; } }); 

2. 处理菜单项点击事件

监听上下文菜单中各个项的点击事件,进行相应的文本操作。

// 加粗操作 document.getElementById('bold').addEventListener('click', function() { toggleTextStyle('strong'); hideContextMenu(); }); // 斜体操作 document.getElementById('italic').addEventListener('click', function() { toggleTextStyle('em'); hideContextMenu(); }); // 下划线操作 document.getElementById('underline').addEventListener('click', function() { toggleTextStyle('u'); hideContextMenu(); }); // 通用函数用于添加或移除样式 function toggleTextStyle(tagName) { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); const newNode = document.createElement(tagName); // 创建新的元素 range.surroundContents(newNode); // 用新节点包裹选中文本 } } 

3. 隐藏上下文菜单

为了在点击菜单之外的地方时隐藏菜单,可以添加一个鼠标点击事件监听器到 document。

// 隐藏上下文菜单 function hideContextMenu() { contextMenu.style.display = 'none'; } // 点击非菜单区域时隐藏菜单 document.addEventListener('click', hideContextMenu); 

4. 完整实现

整合上述代码后,最终实现如下:

<div id="editor" contenteditable="true" style="border: 1px solid #ccc; padding: 10px;"> 这是一个可编辑的富文本区域。请在这里选择文本。 </div> <div id="context-menu" style="display:none; position:absolute; background:#fff; border:1px solid #ccc; z-index:1000;"> <ul> <li id="bold">加粗</li> <li id="italic">斜体</li> <li id="underline">下划线</li> </ul> </div> <style> #context-menu { padding: 5px; } #context-menu ul { list-style: none; padding: 0; margin: 0; } #context-menu li { padding: 5px 10px; cursor: pointer; } #context-menu li:hover { background-color: #f0f0f0; } </style> <script> const editor = document.getElementById('editor'); const contextMenu = document.getElementById('context-menu'); editor.addEventListener('contextmenu', function(event) { event.preventDefault(); const selection = window.getSelection(); if (selection && selection.toString().length > 0) { contextMenu.style.top = `${event.clientY}px`; contextMenu.style.left = `${event.clientX}px`; contextMenu.style.display = 'block'; } }); document.getElementById('bold').addEventListener('click', function() { toggleTextStyle('strong'); hideContextMenu(); }); document.getElementById('italic').addEventListener('click', function() { toggleTextStyle('em'); hideContextMenu(); }); document.getElementById('underline').addEventListener('click', function() { toggleTextStyle('u'); hideContextMenu(); }); function toggleTextStyle(tagName) { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); const newNode = document.createElement(tagName); range.surroundContents(newNode); } } function hideContextMenu() { contextMenu.style.display = 'none'; } document.addEventListener('click', hideContextMenu); </script> 

注意事项

  1. 上下文菜单的样式和交互:可以根据需要调整菜单的样式,增加动画效果等。
  2. 事件处理的性能:过多的事件监听可能会影响性能,确保在必要时移除不再使用的监听器。
  3. 交互兼容性:确保在不同浏览器中的兼容性测试,避免特定浏览器下功能失效。
  4. 无障碍访问:注意上下文菜单的无障碍性,确保使用键盘等其他方式的用户也能访问菜单功能。

通过上述步骤,你可以在富文本编辑器中为划词选择的文本添加右键菜单,用户可以轻松地对选中的文本执行各种操作,如加粗、斜体和下划线。这种方式增强了用户体验,并提供了更强大的文本编辑功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32918.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟v10 ARM64架构系统升级mysql数据库从mysql-5.7.27到mysql-8.4.4图文教程

1、背景与问题说明 因mysql-5.2.27版本存在安全漏洞问题&#xff0c;为保障系统安全&#xff0c;需将处于生产环境的麒麟v10 ARM64架构系统服务器上当前部署的mysql-5.7.27版本升级到mysql-8.4.4&#xff0c;以规避潜在风险&#xff0c;提升系统整体的安全性和稳定性。 1.1 本…

关于我和快速幂的事()

我之前只会这样的(dfs&#xff09;&#xff1a; 不懂下面这种写法的具体逻辑&#xff1a; 看完下面的推理&#xff0c;再转转我聪明的小老戴&#xff1a; 法一中&#xff1a;把2^11看成(2^5)^2 法二中&#xff1a;把2^11看成(2^2)^5

CSS3-流星雨

1. 绘制标签 <div class"container"><span></span> </div>2. 设置div背景 在百度上搜索一幅星空的图片 <style>* {/* 初始化 */margin: 0;padding: 0;}body {/* 高度100% */height: 100vh;/* 溢出隐藏 */overflow: hidden;}.contai…

P3390 【模板】矩阵快速幂

把 f&#xff08;ll k&#xff09; 写成 f&#xff08;int k&#xff09; 结果又是tle又是wa的。找了半天错误。 &#xff08;为了节省一点时间&#xff0c;因为函数不能return数组&#xff0c;还把数组改写到结构体里&#xff09; 我在想考试怎么办&#xff0c;考试不能看过…

STM32F407 cubeIDE Bootloader APP 如何写

一、bootloader 代码如下&#xff1a; #define FLASH_JUMP_ADDR (0x0800c000) /* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ----------…

[Space Shooter_1] Environment | CMake | SDL

环境&#xff1a; CCMakeSDLVS code图形化界面参考&#xff1a;itch.io csp vscode 控制面板 C代码生成流程 查找路径&#xff0c;来进行 cmake 链接 跨平台 cmake 一个库 如果已经有 cmake 来实现跨平台&#xff0c;链接 也可以不用这么麻烦了 set(CMAKE_RUNTIME_OUTPUT_DI…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

Shader中着色器的编译目标级别

1. # pragma target x.0 2. # pragma require xxx 支持的“#pragma target”名称 以下是支持的着色器模型列表&#xff0c;其中包含大致增加的功能集&#xff08;在某些情况下对于平台/GPU 的要求更高&#xff09;&#xff1a; #pragma target 2.0 适用于 Unity 支持的所有平…

【SpringBoot】实现登录功能

在上一篇博客中&#xff0c;我们讲解了注册页面的实现。在此基础上会跳转到登录页面&#xff0c;今天给大家带来的是使用 SpringBoot&#xff0c;MyBatis&#xff0c;Html&#xff0c;CSS&#xff0c;JavaScript&#xff0c;前后端交互实现一个登录功能。 目录 一、效果 二、…

【QT】事件系统入门——QEvent 基础与示例

一、事件介绍 事件是 应用程序内部或者外部产生的事情或者动作的统称 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&…

蓝桥杯备赛-基础练习 day1

1、闰年判断 问题描述 给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年:1.年份是4的倍数而不是100的倍数 2&#xff0e;年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…

【数据挖掘】知识蒸馏(Knowledge Distillation, KD)

1. 概念 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模型压缩和知识迁移技术&#xff0c;旨在将大型复杂模型&#xff08;称为教师模型&#xff09;中的知识传递给一个较小的模型&#xff08;称为学生模型&#xff09;&#xff0c;以减少计算成本&…

HTMLCSS绘制三角形

1.代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>01triangle</title><s…

【数据结构】ArrayList顺序表

面向对象前置知识 ​ class(类)是一种类型&#xff0c;用class(类)可以创建类变量&#xff0c;类变量里存储变量与方法&#xff0c;创建类变量时都有开辟空间&#xff0c;类变量里的存储的成员变量都存储在堆区&#xff0c;类变量里存储的成员方法都存储在方法区&#xff0c;类…

Postman下载安装及简单入门

一&#xff0e;Postman简介 Postman是一款API测试工具&#xff0c;可以帮助开发、测试人员发送HTTP请求&#xff0c;与各种API进行交互&#xff0c;并分析响应 二&#xff0e;下载与安装 访问Postman官网&#xff08;https://www.postman.com/&#xff09;&#xff0c;下载适…

数据类设计_图片类设计之5_不规则类图形混合算法(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及不规则图片的混合算法. 图片示意图 图片是怎样表示的,这里把前面的补上 这里的数字1是不规则数据类对…

【C++】 —— 笔试刷题day_4

刷题day_4 继续加油&#xff01;&#xff01;&#xff01; 一、Fibonacci数列 题目链接&#xff1a;Fibonacci数列 题目解析 题目要求&#xff0c;输入一个数N&#xff0c;我们可以对N进行1/-1操作&#xff1b;题目让我们输出对N进行至少多少步可以变成Fibonacci数。 这里题目…

“Ubuntu禁止root用户通过SSH直接登录”问题的解决

目录 1 前言 2 问题的解决 2.1 修改sshd_config文件 2.2 重启 SSH 服务 1 前言 最近在做毕设的时候&#xff0c;由于使用普通用户&#xff0c;在MobaXterm的图形界面上&#xff0c;无法正常查看/root文件夹内容&#xff0c;如下图所示&#xff1a; 于是我就想直接想用oot…

MySql数据库等级考试学习分享3(Day5)

题目:机器周期的同步标准是( )。 选项: A. CPU执行指令所占用的时间 B. CPU访问存储器一次所需要的时间 C. CPU分析指令所需要的时间 D. CPU访问寄存器一次所需要的时间 知识点总结(0基础必看) 1. 计算机时序的基本单位 单位定义关系时钟周期(Clock Cycle)CPU主频的倒…

Unity 封装一个依赖于MonoBehaviour的计时器(下) 链式调用

[Unity] 封装一个依赖于MonoBehaviour的计时器(上)-CSDN博客 目录 1.加入等待间隔时间"永远执行方法 2.修改为支持链式调用 实现链式调用 管理"链式"调度顺序 3.测试 即时方法​编辑 "永久"方法 链式调用 ​4.总结 1.加入等待间隔时间&qu…