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日

相关文章

  • 关于sql:oracle优化器提示xmlagg函数

    以下是关于“关于SQL:Oracle优化器提示XMLAGG函数”的完整攻略,包含两个示例。 SQL:Oracle优化器提示XMLAGG函数 在Oracle中,XMLAGG函数用将多个行合并为一个XML文档。当我们在查询中使用XMLAGG函数时,Oracle化器可能提示我们使用XMLTABLE函数来提高查询性能。以下是关于如何使用XMLAGG函数和XMLTAB…

    other 2023年5月9日
    00
  • Cucumber常用关键字

    Cucumber是一种行为驱动开发(BDD)工具,它使用自然语言来描述软件的行为。在Cucumber中,关键字是用于描述测试场景和步骤的特殊单词。本文将详细讲解Cucumber常用关键字,包括Given、When、Then、And和But。同时,本文还提供了两个示例说明。 Given Given关键字用于描述测试场景的前置条件。它通常用于设置测试环境和准备测…

    other 2023年5月5日
    00
  • golang实现浏览器导出excel文件功能

    下面是详细的“golang实现浏览器导出excel文件功能”的攻略。 前言 Excel文件是企业中非常重要的文档格式之一,因此在很多场景下都需要通过浏览器导出Excel文件。本文将介绍在Golang中如何实现浏览器导出Excel文件功能。 原理和方案 在Golang中,我们可以通过任何能够返回二进制文件的HTTP处理函数进行文件下载。可以通过以下三种方式实现…

    other 2023年6月26日
    00
  • Python全局变量操作详解

    Python全局变量操作详解 在Python中,全局变量是在整个程序中都可以访问的变量。在函数内部,可以通过使用global关键字来访问和修改全局变量。本攻略将详细讲解Python中的全局变量操作。 定义全局变量 在函数外部定义的变量是全局变量。全局变量可以在程序的任何地方访问。 # 定义全局变量 global_var = 10 def func(): # …

    other 2023年7月28日
    00
  • GDAL 矢量属性数据修改方式(python)

    一、GDAL简介 GDAL是Geospatial Data Abstraction Library的缩写,是一个开源的、独立的数据转换库,支持多种空间数据格式的读写、投影变换和简单的数据编辑操作。GDAL不仅支持矢量数据格式,还支持栅格数据格式。它能读取的格式,如下表: 格式 读写 备注 ESRI Shapefile 部分支持 仅支持点、线和面要素 GeoJ…

    other 2023年6月25日
    00
  • Python字符串字母大小写转换的各种情况详析

    Python字符串字母大小写转换的各种情况详析 在Python中,我们可以使用内置的字符串方法来实现字母大小写的转换。下面将详细讲解各种情况下的转换方法,并提供两个示例说明。 1. 将字符串全部转为大写或小写 要将字符串全部转为大写,可以使用upper()方法;要将字符串全部转为小写,可以使用lower()方法。下面是示例代码: string = \&quo…

    other 2023年8月16日
    00
  • Windows Server 2012 R2或2016无法安装.NET Framework 3.5.1的解决方法

    下面是详细的攻略步骤: 1. 确认Windows Server版本 首先,需要确认所使用的Windows Server版本是2012 R2或2016版,因为只有这两个版本才会出现无法安装.NET Framework 3.5.1的问题。 2. 启用.NET Framework 3.5.1框架 在Windows Server 2012 R2或2016中,默认情况…

    other 2023年6月27日
    00
  • 解决css中的匹配问题

    解决CSS中的匹配问题 简介 在CSS中,选择器用于选择要应用样式的元素。然而,有时候我们可能会遇到选择器匹配问题,即某些选择器无法直接匹配到我们想要的元素。在这种情况下,我们需要使用一些技巧和策略来解决匹配问题。 1. 使用更具体的选择器 当我们遇到匹配问题时,首先要检查所使用的选择器是否足够具体。更具体的选择器可以帮助我们更精确地匹配到目标元素。 示例1…

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