原生js自定义右键菜单

 更新时间:2021年09月08日 10:01:30   作者:纸 飞机  
这篇文章主要为大家详细介绍了原生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>

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 在多个页面使用同一个HTML片段《续》

    在多个页面使用同一个HTML片段《续》

    上一篇文章中我们使用textarea来模拟AJAX的返回结果,造成了一些误解。 这里我们首先用asp.net的Generic Handler做一个简单的后台来重现这个AJAX过程。
    2011-03-03
  • JavaScript 装逼指南(js另类写法)

    JavaScript 装逼指南(js另类写法)

    如何写JavaScript才能逼格更高呢?怎样才能、让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句原来还可以这样写呢?下面列出一些在JavaScript时的装逼技巧,也可说是非常实用的写法
    2020-05-05
  • JavaScript如何将时间戳转化为年月日时分秒格式

    JavaScript如何将时间戳转化为年月日时分秒格式

    这篇文章主要给大家介绍了关于JavaScript如何将时间戳转化为年月日时分秒格式的相关资料,在前端的日常工作当中,时间戳的使用也是不少的,有时后端返回给我们的数据是一个时间戳,我们需要转换成年月日,时分秒的形式展示在页面当中,需要的朋友可以参考下
    2023-11-11
  • JavaScript实现短信倒计时60s

    JavaScript实现短信倒计时60s

    本文给大家分享一段实例代码给大家详细介绍了JavaScript实现短信倒计时60s功能,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10
  • TreeView 用法(有代码)(asp.net)

    TreeView 用法(有代码)(asp.net)

    TreeView 用法,后台结合asp.net需要的朋友可以参考下。
    2011-07-07
  • 微信小程序开发之获取用户信息的两种方法

    微信小程序开发之获取用户信息的两种方法

    小程序可以通过微信官方提供的登录方法方便地获取微信提供的用户身份标识,进而开发者可以进行下一步操作,下面这篇文章主要给大家介绍了关于微信小程序开发之获取用户信息的两种方法,需要的朋友可以参考下
    2022-03-03
  • 使用flutter创建可移动的stack小部件功能

    使用flutter创建可移动的stack小部件功能

    本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完成可拖动功能,需要的朋友可以参考下
    2021-10-10
  • 用JS提交参数创建form表单在FireFox中遇到的问题

    用JS提交参数创建form表单在FireFox中遇到的问题

    在一个前端页面上,需要通过JavaScript来提交参数,使用JS创建form表单,将参数append到表单中进行提交,接下来将介绍如何操作与实现
    2013-01-01
  • 详解CocosCreator中几种计时器的使用方法

    详解CocosCreator中几种计时器的使用方法

    这篇文章主要介绍了CocosCreator中几种计时器的使用方法,推荐使用schedule,功能多些,销毁时还能自动移除
    2021-04-04
  • JavaScript实现table切换的插件封装

    JavaScript实现table切换的插件封装

    这篇文章主要为大家详细介绍了JavaScript实现table切换的插件封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论