JS简单实现自定义右键菜单实例

下面我会详细讲解如何简单实现自定义右键菜单的过程。

第一步:HTML结构准备

首先,需要定义一个HTML结构,包含菜单需要绑定的元素。

<!-- 定义需要绑定右键菜单的区域 -->
<div id="menu-wrap">
  <ul id="context-menu" class="context-menu">
    <li class="edit">编辑</li>
    <li class="delete">删除</li>
  </ul>
</div>

第二步:CSS样式设置

接着,需要设置CSS样式,让菜单显示位置、字体等符合需求。

/* 右键菜单的样式设定 */
.context-menu {
  background-color: #fff;
  border: 1px solid #ccc;
  z-index: 9999;
  position: absolute;
  display: none;
  list-style: none;
  padding: 0;
}

/* 菜谱项样式设置 */
.context-menu li {
  padding: 5px 10px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f2f2f2;
}

第三步:JS代码编写

最后,需要编写JS代码,实现右键菜单的显示和功能。

1、绑定右键菜单

首先,需要绑定右键菜单的显示事件,代码如下:

// 绑定右键菜单事件
document.addEventListener('contextmenu', function(e) {

  e.preventDefault(); // 禁用默认的右键菜单事件
  var menu = document.querySelector("#context-menu");

  // 计算菜单显示位置
  var screenWidth = window.innerWidth; // 当前屏幕宽度
  var screenHeight = window.innerHeight; // 当前屏幕高度
  var menuWidth = menu.offsetWidth; // 菜单宽度
  var menuHeight = menu.offsetHeight; // 菜单高度
  var xPos = e.clientX; // 鼠标x坐标位置
  var yPos = e.clientY; // 鼠标y坐标位置

  // 如果距离右边屏幕距离过近,需要调整菜单x坐标位置
  if (xPos + menuWidth > screenWidth) {
    xPos -= menuWidth;
  }

  // 如果距离底部屏幕距离过近,需要调整菜单y坐标位置
  if (yPos + menuHeight > screenHeight) {
    yPos -= menuHeight;
  }

  // 显示右键菜单
  menu.style.left = xPos + "px";
  menu.style.top = yPos + "px";
  menu.style.display = "block";

});

这段代码实现了绑定右键菜单的显示事件,当用户右键单击菜单需要绑定的元素时,会显示一个自定义的右键菜单。

2、设置菜单点击事件

然后,需要给每个菜单项设置点击事件,代码如下:

// 绑定菜单项点击事件
document.addEventListener('click', function(e) {

  var menu = document.querySelector("#context-menu");

  // 如果点击的是菜单项,执行对应的操作
  switch (e.target.className) {
    case "edit":
      // 点击了“编辑”菜单项的操作
      break;
    case "delete":
      // 点击了“删除”菜单项的操作
      break;
  }

  // 隐藏右键菜单
  menu.style.display = "none";

});

这段代码实现了菜单项的点击事件,用户点击每个菜单项时,会执行对应的操作,比如编辑或删除。

示例解释

下面是两个示例,说明如何使用这段代码实现自定义右键菜单的功能。

示例1

在某个网页中,右键单击网页中的一段文字,弹出一个自定义右键菜单,包含“复制”和“粘贴”两个菜单项。用户点击“复制”菜单项后,会将文字复制到剪贴板中。

HTML结构

<div id="menu-wrap">
  <ul id="context-menu" class="context-menu">
    <li class="copy">复制</li>
    <li class="paste">粘贴</li>
  </ul>
  <p>你要复制的文字...</p>
</div>

CSS样式

/* 右键菜单的样式设定 */
.context-menu {
  background-color: #fff;
  border: 1px solid #ccc;
  z-index: 9999;
  position: absolute;
  display: none;
  list-style: none;
  padding: 0;
}

/* 菜谱项样式设置 */
.context-menu li {
  padding: 5px 10px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f2f2f2;
}

JS代码

// 绑定右键菜单事件
document.addEventListener('contextmenu', function(e) {

  e.preventDefault(); // 禁用默认的右键菜单事件
  var menu = document.querySelector("#context-menu");

  // 计算菜单显示位置
  var screenWidth = window.innerWidth; // 当前屏幕宽度
  var screenHeight = window.innerHeight; // 当前屏幕高度
  var menuWidth = menu.offsetWidth; // 菜单宽度
  var menuHeight = menu.offsetHeight; // 菜单高度
  var xPos = e.clientX; // 鼠标x坐标位置
  var yPos = e.clientY; // 鼠标y坐标位置

  // 如果距离右边屏幕距离过近,需要调整菜单x坐标位置
  if (xPos + menuWidth > screenWidth) {
    xPos -= menuWidth;
  }

  // 如果距离底部屏幕距离过近,需要调整菜单y坐标位置
  if (yPos + menuHeight > screenHeight) {
    yPos -= menuHeight;
  }

  // 显示右键菜单
  menu.style.left = xPos + "px";
  menu.style.top = yPos + "px";
  menu.style.display = "block";

});

// 绑定菜单项点击事件
document.addEventListener('click', function(e) {

  var menu = document.querySelector("#context-menu");

  // 如果点击的是菜单项,执行对应的操作
  switch (e.target.className) {
    case "copy":
      // 复制选中的文字
      document.execCommand("copy");
      break;
    case "paste":
      // 粘贴剪贴板中的内容
      document.execCommand("paste");
      break;
  }

  // 隐藏右键菜单
  menu.style.display = "none";

});

示例2

在某个网站后台管理系统的列表页中,右键单击某一行数据,弹出一个自定义右键菜单,包含“编辑”和“删除”两个菜单项。用户点击“删除”菜单项后,会弹出一个确认框,确认是否删除该行数据。

HTML结构

<div id="menu-wrap">
  <ul id="context-menu" class="context-menu">
    <li class="edit">编辑</li>
    <li class="delete">删除</li>
  </ul>
  <table>
    <tr>
      <td>数据1</td>
      <td>数据2</td>
      <td>数据3</td>
    </tr>
    <tr>
      <td>数据1</td>
      <td>数据2</td>
      <td>数据3</td>
    </tr>
    <tr>
      <td>数据1</td>
      <td>数据2</td>
      <td>数据3</td>
    </tr>
  </table>
</div>

CSS样式

/* 右键菜单的样式设定 */
.context-menu {
  background-color: #fff;
  border: 1px solid #ccc;
  z-index: 9999;
  position: absolute;
  display: none;
  list-style: none;
  padding: 0;
}

/* 菜谱项样式设置 */
.context-menu li {
  padding: 5px 10px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f2f2f2;
}

JS代码

// 绑定右键菜单事件
document.addEventListener('contextmenu', function(e) {

  e.preventDefault(); // 禁用默认的右键菜单事件
  var menu = document.querySelector("#context-menu");

  // 计算菜单显示位置
  var screenWidth = window.innerWidth; // 当前屏幕宽度
  var screenHeight = window.innerHeight; // 当前屏幕高度
  var menuWidth = menu.offsetWidth; // 菜单宽度
  var menuHeight = menu.offsetHeight; // 菜单高度
  var xPos = e.clientX; // 鼠标x坐标位置
  var yPos = e.clientY; // 鼠标y坐标位置

  // 如果距离右边屏幕距离过近,需要调整菜单x坐标位置
  if (xPos + menuWidth > screenWidth) {
    xPos -= menuWidth;
  }

  // 如果距离底部屏幕距离过近,需要调整菜单y坐标位置
  if (yPos + menuHeight > screenHeight) {
    yPos -= menuHeight;
  }

  // 显示右键菜单
  menu.style.left = xPos + "px";
  menu.style.top = yPos + "px";
  menu.style.display = "block";

});

// 绑定菜单项点击事件
document.addEventListener('click', function(e) {

  var menu = document.querySelector("#context-menu");

  // 如果点击的是菜单项,执行对应的操作
  switch (e.target.className) {
    case "edit":
      // 点击了“编辑”菜单项的操作
      break;
    case "delete":
      // 点击了“删除”菜单项的操作
      if (confirm("确认删除该行数据?")) {
        e.target.parentNode.parentNode.remove();
      }
      break;
  }

  // 隐藏右键菜单
  menu.style.display = "none";

});

这两个示例可以为我们提供思路,在实际应用中根据需求进行调整和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS简单实现自定义右键菜单实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 使命召唤17错误代码887A0005怎么办?(附解决办法)

    使命召唤17错误代码887A0005解决方案 问题描述 如果你在打开使命召唤17时遇到了错误代码887A0005,出现了类似下面的错误提示: “发生了问题,我们不能让你进入游戏,试图重新启动游戏或 Steam 客户端可能会有帮助。” 这个错误提示表示了出现了某种游戏启动或运行错误。 解决方案 接下来我们将会给出一些可能帮助你修复这个问题的解决方法。 解决方案…

    other 2023年6月27日
    00
  • Go并发编程中使用channel的方法

    下面我就来详细讲解Go并发编程中使用channel的方法的完整攻略。 什么是channel Go语言中的channel是一种通信机制,用于协调多个goroutine之间的交互和同步。简单来说,channel就是一个通道,通过它可以在goroutine之间传递数据,实现数据共享,实现同步或异步的通信。 channel的创建和关闭 channel是通过内置函数m…

    other 2023年6月27日
    00
  • 详解Spring加载Properties配置文件的四种方式

    下面是Spring加载Properties配置文件的四种方式的详细攻略。 一、通过@PropertySource注解加载 通过在Spring配置类上添加@PropertySource注解来加载Properties配置文件,可以通过value属性指定配置文件位置,也可以通过classpath属性来指定配置文件在类路径下的位置。 @Configuration @…

    other 2023年6月25日
    00
  • init output stream初始化输出流源码分析

    init output stream是一个Java API中的方法,其作用是初始化输出流。下面我们来详细分析一下该方法的源码和使用方法。 方法签名 public static JdbcOutputConnection initOutputConnection( String driverClass, String url, String user, Stri…

    other 2023年6月20日
    00
  • Java中继承、多态、重载和重写介绍

    我来讲解一下。 继承 继承是Java面向对象编程中的一个重要的特性。它允许我们创建一个新的类,以现有类的特性为基础,从而减少了代码的重复编写。下面是一个简单的继承示例: public class Animal { public void move() { System.out.println("动物可以移动"); } } public c…

    other 2023年6月27日
    00
  • git克隆远程仓库的指定分支方法(附常用git配置命令)

    当然!下面是关于\”git克隆远程仓库的指定分支方法(附常用git配置命令)\”的完整攻略: git克隆远程仓库的指定分支方法 在使用git克隆远程仓库时,可以通过指定分支来获取特定的代码。以下是两个示例: 示例1:克隆远程仓库的指定分支 $ git clone -b branch_name remote_repository_url 在这个示例中,我们使用…

    other 2023年8月19日
    00
  • 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 背景 随着前端技术的不断发展,越来越多的网站开始采用前后端分离的方式进行开发。单页应用(SPA)作为前后端分离方案中的一种,在用户体验上有着独特的优势。 然而,SPA和传统的多页应用相比,在SEO方面存在一些挑战。由于SPA的页面内容大多是通过AJAX异步获取,浏览器不会触发页面跳转,导致搜索引擎无法爬取到页面的内容,…

    其他 2023年3月28日
    00
  • linux系统挂载以及卸载USB接口的设备的解决办法

    Linux系统挂载以及卸载USB接口的设备可以通过以下步骤完成: 1. 查看设备状态 首先需要查看USB设备的状态,可以使用以下命令: $ lsusb 该命令可以列出当前连接到计算机上的所有USB设备,以及对应的Vendor ID和Product ID等信息。如果设备正常连接,则会显示设备的详细信息。 2. 挂载设备 挂载USB设备需要先创建一个挂载点,通常…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部