原生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>

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

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

(0)

相关推荐

  • JS实现仿Windows7风格的网页右键菜单效果代码

    本文实例讲述了JS实现仿Windows7风格的网页右键菜单效果代码.分享给大家供大家参考.具体如下: 这是一款JS仿Windows7风格的网页右键菜单,可以多级展开的右键菜单,原生JS.可参考性强,学习JavaScript的朋友不可错过.本菜单用户体验极佳,兼容性良好,无jQuery. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-win7-style-web-right-menu-codes/ 具体代码如下: <!DOCTYPE htm

  • 深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制

    我记得在刚开始接触动态HTML及JavaScript时就接触过关于鼠标右键屏蔽的脚本代码,当时这些代码很多会用在防止浏览者未经允许的复制网页上的文字或者其他内容,后来的实际应用证明这种做法是不符合用户体验的,而且破解的方法也有很多,比如我曾经写过一篇文章讲解如何解除网页禁止复制的办法. 由此可见,限制右键及复制是不明智的做法,但是今天我仍然要谈谈关于禁止网页复制.右键菜单的事儿,因为随着网页APP技术的发展,网页应用和桌面应用之间的界限越来越模糊,有一些桌面程序实际上是由网页配合JavaScri

  • JS组件Bootstrap ContextMenu右键菜单使用方法

    今天来总结下bootstrap的一个小组件的应用.好了,不说废话,进入正题吧. 一.ContextMenu介绍 一个需求:表格行调序,支持多选调序,并且可以不连续多选.什么意思呢?先来看看需要实现的效果图: 需求是:需要将选中的6.8.9行移动到第2行和第3行之间.撇开业务不说,单纯从技术层面来说,要想使用最少操作达到上述效果,博主想到了右键功能,如果能够在第2行或者第3行上面点击鼠标右键,通过右键菜单功能将选中的行移动到相应的位置,这样是不是最简单呢.说做咱就做,于是找组件,搜索"bootst

  • JavaScript 对任意元素,自定义右键菜单的实现方法

    一.一些概念: 1.鼠标事件有一个botton属性:返回一个整数,用于表示点击的是哪个鼠标按键. BUG:在IE和标准DOM的鼠标事件中,唯一一个button属性值相同的是"单击右键"事件,都返回2. 2.事件onmousedown:表示鼠标按键按下的动作. 事件oncontextmenu:点击鼠标触发的另一个事件. 3.中断默认事件处理函数的方法:IE中设置returnValue=false;  标准DOM中调用preventDefault()方法. 4.事件对象:①在IE中,事件对

  • ExtJs grid行 右键菜单的两种方法

    在这下边: 方法一 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="gridContextMenu.aspx.cs" Inherits="gridContextMenu" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &

  • js右键菜单效果代码

    将以下代码添加到<head>与</head>之间  ---------------------------------- <script language='javascript'>  /*******以下内容可以修改***************/  var mname=new Array(  "首  页",  "修  改",  "下  载",  "删  除",  "新  建&q

  • js捕获鼠标右键菜单中的粘帖事件实现代码

    比如点击菜单中的"粘帖"后事件如何捕获  问题解决了! 用的jQuery中的paste事件,这里需要注意,如想获得粘帖文本要使用setTimeout控制下时间. 复制代码 代码如下: $("#input").bind('paste', function(e) { var el = $(this); setTimeout(function() { var text = $(el).val(); alert(text); }, 100); }); 貌似是在1.4版后加上

  • js 右键菜单,支持不同对象不同菜单(兼容IE、Firefox)

    里面的代码修改也比较简单. ddd .DreamMenu { position:absolute; visibility:hidden; z-index:100; overflow:hidden; width:150px; background-color:buttonface; border:dimgray 1px solid !important; border:buttonhighlight menu menu buttonhighlight 2px outset; padding:1px

  • js禁止页面复制功能禁用页面右键菜单示例代码

    <body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: 复制代码 代码如下: <script type="text/javascript"> document.body.onselectstart=document.body.oncontextmenu=function(){ return false;} </script> 注意这段代码必须放在

  • js实现右键菜单功能

    本文解决的问题:1.实现右键菜单功能代码:2.阻止默认事件的实际应用. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>右键菜单</title> <style type="text/css"> #menu { position: fixed; left:0; top:0;

随机推荐