如使用原生js自定义右键菜单

简介: 如使用原生js自定义右键菜单

1、右键菜单触发的基本过程

实现自定义右键菜单我们首先需要了解以下内容:

浏览器默认的右键菜单触发的基本过程

  1. 单击右键,菜单出现
  2. 菜单出现,鼠标箭头一直在菜单左上角
  3. 再换个位置点击右键,原菜单消失,新菜单出现在指定位置
  4. 点击左键,中键,菜单消失

以上为大致实现过程,不全面,仅供参考

也许文字过于抽象,我们来看看代码吧:

2、HTML结构

<!--start右键菜单的结构-->
<div id="rightmenu" class="rightmenu">
  <ul>
    <li disabled="disabled">
        <a href="#">返回(B)</a> 
        <span>Alt+向左箭头</span></li>
    <li><a href="#">前进(F)</a> <span>Alt+向右箭头</span></li>
    <li><a href="#">重新加载(R)</a> <span>Ctrl+R</span></li>
  </ul>
  <ul>
    <li><a href="#">另存为(A)...</a> <span>Ctrl+S</span></li>
        <li><a href="#">打印(P)..</a> <span>Ctrl+P</span></li>
    <li><a href="#">投射(C)...</a> <span>Ctrl+R</span></li>
  </ul>
  <ul>
    <li><a href="#">查看你个锤代码(V)</a> <span>Ctrl+U</span></li>
      <li><a href="#">检查你个瓜皮(N)</a> <span>Ctrl+Shift+L</span></li>
  </ul>
</div>
<!--end右键菜单的结构-->
<div class="box"></div>

3、CSS样式

*{
  margin: 0;
  padding: 0;
}
li{
  list-style: none;
}
.rightmenu{
  width: 250px;
  background: #fff;
  border: 1px solid #bababa;
  position: fixed;
  box-sizing: border-box;
  display: none;
}
.rightmenu ul{
  border-bottom: 1px solid #e9e9e9;   
}
.rightmenu ul li{
  height: 30px;
  line-height: 30px;
  color: #000;
  padding: 0 25px;
  box-sizing: border-box;
  margin: 2px 0;
        cursor: default;
}
.rightmenu ul li:hover{
  background: #ebebeb;
}
.rightmenu ul li a{
  font-size: 12px;
  color: #000;
  cursor: default;
  text-decoration: none;
}
.rightmenu ul li span{
  float: right;
  font-size: 12px;
  color: #000;
}
.box{
  width: 100px;
  height: 100px;
  background: red;
}

.rightmenu设置display:none是因为右键菜单本身是隐藏了因为点击了才出现,倘若不加这句,菜单会出现在页面的左上角。

3、js实现过程

分析:


①:浏览器本身就有右键菜单,我们也要做右键菜单,所以应当阻止浏览器的右键,这里可以用到preventDefault(),这个方法有着阻止默认事件的功能,科普一下,什么是默认事件:


例如: 点我可以知道这是可以跳转到百度的,所以是有个跳转时间的,这个事件我们没有去用js实现,他是默认的,所以称之为默认事件,同理,浏览器右键菜单。


②前面我们说了菜单出现,鼠标箭头一直在菜单左上角,这是怎么实现的呢,这涉及到event里面的事件发生坐标了,我们点击的位置就是我们右键点击事件发生的位置,可以用坐标来解释这个位置,clientX(事件发生点和可视区域的位置),offsetX(事件发生点和父级元素的位置),pageX(事件发生点和页面的位置),screenX(事件发生点和屏幕的位置),这里我们用offsetX/Y,因为我们是在BOW中点击,所以具体原因大家百度一下就直道了,我们还是看代码吧,代码里标注的很详细。

<script>
  document.addEventListener('DOMContentLoaded',function(){
  //获取
  var rightMenu=document.getElementById('rightmenu');
  //1.首先将右键默认行为关闭
  window.oncontextmenu=function(event){
    event.preventDefault();
    //2.设置右键行为
    rightMenu.style.display="none";//重置已经block的菜单
    rightMenu.style.display="block";
    rightMenu.style.left=event.offsetX+'px';
      rightMenu.style.top=event.offsetY+'px';
    }
    //3.根据真实浏览器的右键来看左键是可以取消右键菜单的
    document.onclick=function(event){
      rightMenu.style.display="none";
    }
    //4.功能并不完善,需要给每个li写BOM事件,这里暂时不写了
    //5.仔细检查你会发现当右键在自己定义的右键菜单上时,会出现一点小情况,可以自己测试
    })
</script>

以上仅供参考,更多的功能实现都是差不多的原理,好了,结束了。


相关文章
|
5月前
|
开发框架 前端开发 JavaScript
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
|
4月前
|
存储 前端开发 JavaScript
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
40 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
2月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
79 4
|
3月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
44 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
4月前
|
前端开发 程序员
HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)
一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢,今天这篇博客就分享下前端代码如何实现HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)。赶紧学会了,来制作属于我们程序员的浪漫吧!
119 0
HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)
|
5月前
|
JavaScript NoSQL Serverless
函数计算产品使用问题之如何创建一个自定义运行时并指定Node.js版本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
Devops 持续交付 测试技术
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
44 0
|
4月前
|
前端开发 微服务 API
微服务浪潮下的JSF革新:如何在分散式架构中构建统一而强大的Web界面
【8月更文挑战第31天】随着微服务架构的兴起,企业将应用拆分成小型、独立的服务以提高系统可维护性和可扩展性。本文探讨如何在微服务架构下构建和部署JavaServer Faces (JSF) 应用,通过RESTful服务实现前后端分离,提升灵活性和适应性。
65 0
|
4月前
|
JavaScript 前端开发 数据安全/隐私保护
Vue.js 表单处理技巧大揭秘!v-model 与自定义验证综合运用,打造高效表单处理体验!
【8月更文挑战第31天】Vue.js 是一款备受欢迎的前端框架,其表单处理功能强大且灵活。v-model 指令可实现双向数据绑定,简化表单元素值与 Vue 实例数据的同步过程;结合自定义验证规则,则能确保用户输入数据符合特定要求。无论是简单的单字段校验还是复杂的多字段验证,Vue.js 均提供了简洁有效的解决方案,有效提升了表单处理效率及用户体验。通过综合运用 v-model 和自定义验证,开发者能够实时反馈错误信息并控制表单状态,从而增强应用的交互性与可靠性。
69 0