首页 > 其他分享 >写一个方法实现自定义右键菜单的功能

写一个方法实现自定义右键菜单的功能

时间:2024-12-05 09:44:58浏览次数:3  
标签:style 菜单 自定义 contextMenu menu 右键 document event

function createCustomContextMenu(menuItems) {
  // 隐藏浏览器默认右键菜单
  document.addEventListener('contextmenu', (event) => {
    event.preventDefault();
  });

  // 创建自定义菜单元素
  const contextMenu = document.createElement('div');
  contextMenu.classList.add('custom-context-menu');
  contextMenu.style.display = 'none'; // 初始隐藏
  document.body.appendChild(contextMenu);


  // 添加菜单项
  menuItems.forEach(item => {
    const menuItem = document.createElement('div');
    menuItem.classList.add('custom-context-menu-item');
    menuItem.textContent = item.label;
    menuItem.addEventListener('click', item.onClick);
    contextMenu.appendChild(menuItem);
  });


  // 显示菜单
  document.addEventListener('contextmenu', (event) => {
    contextMenu.style.left = `${event.clientX}px`;
    contextMenu.style.top = `${event.clientY}px`;
    contextMenu.style.display = 'block';
  });

  // 点击其他地方隐藏菜单
  document.addEventListener('click', (event) => {
    if (!contextMenu.contains(event.target)) {
      contextMenu.style.display = 'none';
    }
  });
}


// 示例用法:
const menuItems = [
  { label: '复制', onClick: () => { console.log('复制'); navigator.clipboard.writeText(window.getSelection().toString()).then(() => {/* 完成 */});} },
  { label: '粘贴', onClick: () => { console.log('粘贴');  navigator.clipboard.readText().then(clipText => { document.execCommand('insertText', false, clipText); });} },
  { label: '全选', onClick: () => { console.log('全选'); document.execCommand('selectAll', false, null); } },
  { label: '刷新', onClick: () => { console.log('刷新'); location.reload(); } }
];

createCustomContextMenu(menuItems);


// CSS 样式 (可以根据需要自定义)
const style = document.createElement('style');
style.textContent = `
.custom-context-menu {
  position: fixed;
  z-index: 9999;
  background-color: #fff;
  border: 1px solid #ccc;
  box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
  padding: 5px 0;
}

.custom-context-menu-item {
  padding: 5px 10px;
  cursor: pointer;
}

.custom-context-menu-item:hover {
  background-color: #eee;
}
`;
document.head.appendChild(style);

使用方法:

  1. 引入代码: 将以上 JavaScript 代码添加到你的 HTML 文件中,最好放在 <body> 的末尾或单独的 .js 文件中。

  2. 调用函数: 使用 createCustomContextMenu() 函数,传入一个包含菜单项配置的对象数组。每个菜单项对象包含 label (显示的文本) 和 onClick (点击时执行的函数) 两个属性。

  3. CSS样式: 代码中包含了基本的 CSS 样式,你可以根据需要修改 .custom-context-menu.custom-context-menu-item 的样式。

改进和扩展:

  • 动态菜单: 可以根据上下文动态生成菜单项。例如,根据选中的元素类型显示不同的选项。
  • 子菜单: 可以实现多级嵌套的子菜单。
  • 图标: 可以为每个菜单项添加图标。
  • 键盘导航: 可以使用键盘方向键导航菜单项。
  • 屏幕边缘处理: 当菜单靠近屏幕边缘时,自动调整位置以避免菜单被遮挡。

这个改进的版本更加灵活,易于使用和扩展。 希望这个例子对您有所帮助!

标签:style,菜单,自定义,contextMenu,menu,右键,document,event
From: https://www.cnblogs.com/ai888/p/18587839

相关文章

  • Qt编写嵌入式linux输入法/支持自定义词语和繁体/支持wayland和watson/纯QWidget/界面
    一、功能特点纯QWidget编写,原创输入法机制,没有任何第三方动态库的依赖。支持各种Qt版本,包括Qt4、Qt5、Qt6及后续版本。支持各种编译器,包括mingw、msvc、gcc、clang、wasm等。支持各种目标平台,包括windows、linux、macos、android、嵌入式linux等。支持任意控件输入,包括文本......
  • 使用自定义 MSBuild Task 阻止 git 的大文件提交
    NuGetGallery|Jgrass.MSBuild.GitTask前言在.NET项目自定义MSBuildTask中提到,可以使用自定义MSBuildTask来实现自定义功能。这里介绍实现的git提交大文件提交拦截功能。引入nuget包之后,设置好要拦截的大小,内置的LargeFileInterceptTask会自动在当前仓库写入......
  • Windows .md 右键新建添加md文件-Typora版
    前言全局说明Windows.md右键新建添加md文件一、说明1.1环境:Windows11家庭版23H222631.3737Typora0.11系统里要安装好Typora二、添加2.1regaddHKCR\.md/ve/dTypora.md/fTypora.md:代表.md文件关联Typora.mdregaddHKCR\.md\ShellNew/vNu......
  • Element-Plus表格:Table自定义合并行数据的最佳实践
    Element-Plus表格:Table自定义合并行数据的最佳实践“知行合一”——王阳明在开发项目中,我们时常会用到表格,许多需求可能会要求自定义特定的行或列。 接下来,我们将探讨在实际开发中如何应对这一挑战。本文案例采用的技术:名称版本Vue3^3.5.12element-plus^2.8.8......
  • 使用自定义 JsonConverter 解决 long 类型在前端的精度问题
    问题Javascript的number类型存在精度限制,浏览器反序列化JSON时,无法完整保留long类型的精度。在JSON序列化时将long转换为string进行传递就可以保留精度。在ASP.NETCore中,可以创建一个自定义JsonConverter来达到这一目的。实现long和string转换的JsonC......
  • 可滑动触摸的jQuery隐藏侧边栏菜单插件
    slide-and-swipe-menu是一款支持移动手机滑动触摸的隐藏侧边栏菜单jquery插件。该侧边栏菜单基于touchSwpie插件,可以通过按钮来触发打开侧边栏菜单,并通过滑动触摸来关闭菜单。 在线演示 下载  安装可以通过bower或nmp来安装该侧边栏菜单插件。bowerinstall......
  • #渗透测试#SRC漏洞挖掘#红蓝攻防#黑客工具之Burp Suite进阶-自定义UI组件教程
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 如需获取工具,评论区留言即可!!!目录一、BurpSuite自定义UI......
  • 关于在Android Studio上实现的菜单功能未显示的解决方法
    概述 最近在学习菜单功能的时候,发现已经全部按照书本上要求来实现了,却怎么也没显示出菜单来。在互联网上查找许久,终于发现是因为在我的AndroidStudio上创建的项目自带主题,将主题上里“.NoActionBar”删除即可正常显示菜单栏。具体操作如下在项目视图里选择“app=>res=>val......
  • Vue3.5新版本特性一览-数组操作10倍性能提升+响应式属性解构+自定义组件优化+ssr水合
    Vue团队欣喜地宣布,Vue3.5(代号TengenToppaGurrenLagann)于9月初发布!本次小版本更新并未引入任何破坏性更改,带来了诸多内部优化以及新功能。在这篇文章中,我们将重点介绍一些新特性和改进。如需了解全部更新内容,请参阅GitHub上的完整更新日志。最近突然想整理一些前......
  • java-自定义日志注解
    ......