自定义右键菜单

自定义右键菜单

  技术一般水平有限,有什么错的地方,望大家指正。   

  自定义右键菜单,对于一些ERP系统,功能操作比较多,所以我们通常把常用的几个功能放在自定义的右键菜单里方便用户使用。

  实现自定义菜单很简单,首先我们要屏蔽原始的右键菜单,自定义菜单出现在鼠标的位置,点击隐藏自定义菜单,过程就是这样的。

*{margin:0;padding:0}
a{text-decoration:none}
ul li{list-style:none}
.menu{border:1px solid black;border-radius:5px;display:inline-block;position:fixed;top:100px;left:550px;overflow:hidden;padding-bottom:10px;box-shadow:0 0 10px 0;z-index:999;display:none;background:white}
.menu ul li{height:30px;width:100%}
.menu ul li a{height:30px;display:inline-block;width:100%;text-align:left;line-height:30px;padding:5px 10px}
.menu li a:hover{background-color:#EEF5E2}
  <div class="menu" id="demo">
    <ul>
        <li><a href="#">向录入员发送消息</a></li>
        <li><a href="#">发送选中作业</a></li>
        <li><a href="#">设置作业状态</a></li>
        <li><a href="#">哈哈哈哈哈</a></li>
        <li><a href="#">嘻嘻嘻嘻嘻</a></li>
        <li><a href="#">呵呵呵呵呵呵</a></li>
    </ul>
  </div>

  1.屏蔽原始的右键菜单

  在JS中提供了一个事件来完成这件事就是oncontextmenu,这个是事件绑定的区域在点击右键时将不会再出现原始右键菜单:

document.oncontextmenu = function(){
  return false;
}

  2.获取自定义菜单的大小

  自定义菜单初始是隐藏的,对于隐藏的元素我们是没有办法来获取它的宽高的。我们可以先将菜单元素设置为visibility:hidden,获取到元素的宽高后在去掉这个属性:

  function getHideDOMWH(obj){
      //obj为菜单元素的DOM对象
      var wh = {};
      obj.style.visibility = "hidden";
      wh.w = obj.scrollWidth;
      wh.h = obj.scrollHeight;
      obj.style.visibility = null;
      return wh;
  }

  3.自定义菜单出现在当前鼠标的位置

  首先我们就需要获取当前的鼠标的位置,当前鼠标位置就是自定义菜单出现的位置。同时要注意距右侧距离或者距下面的距离不足以显示菜单的情况:

document.onmousedown = function(e){
    //obj为菜单元素DOM对象
    var e = e || window.event;
    if(e.button==2){
        var left = e.clientX;
        var top = e.clientY;
        var windowHeight = document.body.scrollHeight;
        var windowWidth = document.body.scrollWidth;
        var wh = getHideDOMWH(obj);
        var contentHeight = wh.h;
        var contentWidth = wh.w;
        obj.style.left = windowWidth-left>contentWidth?left+"px":windowWidth-contentWidth+"px";
        obj.style.top = windowHeight-top>contentHeight?top+"px":top-contentHeight+"px";
        obj.style.display = "inline-block";
    }
}

  当浏览器窗口的宽度减去光标点击时距离左边的距离小于菜单的宽度的时候,说明光标距离右边的距离已经不足以显示菜单了,我们就让菜单的紧贴右侧,此时菜单的left值为浏览器窗口的宽度减去菜单的宽度。当浏览器窗口的高度减去光标距离上侧的距离小于菜单的高度时,说明此时光标距离下面的距离不足以显示菜单了,此时菜单的top值为光标距离上面的距离减去菜单的高度。

  4.无论是点击菜单元素还是其他元素都隐藏菜单

document.onclick = function(){
    //obj为菜单元素DOM对象
    obj.style.display = "none";
}

  为了使用方便我们可以将上面的这个过程封装成一个方法,或者在原生JS的Element的原型上扩展一个方法(IE7及以下是会报错的),或者是JQ的原型上,这里我们封装一个方法。

  function contextMenu(obj){
      //obj为DOM对象
      document.oncontextmenu = function(){
          return false;
      }
      document.onmousedown = function(e){
          var e = e||window.event;
          if(e.button==2){
              var mouseX = e.clientX;
              var mouseY = e.clientY;
              var wh = getObjWH(obj);
              var contentW = wh.w;
              var contentH = wh.h;
              var documentW = document.body.scrollWidth;
              var documentH = document.body.scrollHeight;
              obj.style.left = documentW-mouseX<contentW?documentW-contentW+"px":mouseX+"px";
              obj.style.top = documentH-mouseY<contentH?mouseY-contentH+"px":mouseY+"px";
              obj.style.display = "inline-block";
          }

      }
      document.onclick = function(){
          obj.style.display = "none";
      }
      function getObjWH(obj){
          var wh = {};
          obj.style.visibility = "hidden";
          wh.w = obj.scrollWidth;
          wh.h = obj.scrollHeight;
          obj.style.visibility = null;
          return wh;
      }
  }

  我们所有的事件都是绑定在document上的而事件我们通常会使用冒泡机制,如果我们在某个元素上设置了取消冒泡则会有一些问题,我们需要做一些针对性的处理。

时间: 2024-08-05 19:31:53

自定义右键菜单的相关文章

阻止右键菜单(阻止默认事件)&amp;&amp;跟随鼠标移动(大图展示)&amp;&amp;自定义右键菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

jquery 自定义右键菜单

如果要自定义右键菜单,那么就需要禁止原本的右键菜单,代码如下 document.oncontextmenu = new Function("return false;");//禁止右键默认菜单 该自定义右键菜单是基于jquery上的 html+css: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title&g

[ActionScript 3.0] 自定义右键菜单

将自定义右键菜单的一些属性和方法归纳到AddRightMenu.as,通过实例化此类,调用相关方法即可测试! 1 package 2 { 3 import flash.display.Sprite; 4 import flash.events.ContextMenuEvent; 5 import flash.net.navigateToURL; 6 import flash.net.URLRequest; 7 import flash.ui.ContextMenu; 8 import flash

【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体验,让用户使用软件更加的简便,今天我们就来基于Bootstrap来开发自己的自定义右键菜单. 一.首先,准备好自定义菜单,供单击右键展示: 菜单默认不可见,可以通过 style="display:block" 进行调试预览; <ul class="dropdown-menu

自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <html> 3 <head> 4 <title>右键菜单</title> 5 <s

javascript自定义右键菜单代码

javascript自定义右键菜单代码: 右键菜单这个再熟悉不过了,使用电脑的话每天几乎都要操作上千遍右键菜单,下面分享一段自定义右键菜单的代码实例,希望能够给需要相关内容的朋友带来帮助,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao

js之自定义右键菜单

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义右键菜单</title> <style> body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{ m

仿EXCEL插件,智表ZCELL产品V1.7 版本发布,增加自定义右键菜单功能

详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,主要解决了自定义右键菜单事件的支持,并新增了公式中自定义函数传参.快捷键剪切等功能,欢迎大家体验使用. 本次版本更新内容如下: 版本: V1.7发布日期:2019-07-05 1.优化公式中的自定义函数,增加传入参数的支持. 2.增加剪切快捷键CTL+X支持功能. 3.增加自定义右键菜单功能,用户可以自定义开发右键功能,通过BindEvents接口实现. 4.新增获取单元格是否合并单元格接口GetC

Flex 自定义右键菜单

在flex开发中往往会遇到这样的需求,去掉flash内置的所有右键菜单,使用自定义菜单. 经过google的搜索,终于找到了可行的办法. 基本思路是,在flex脚本中执行javascript代码,找到当前加载的flash对象,捕捉并阻止对象的鼠标点击事件,进而达到阻止flex内置菜单的功能. 注意点: flash对象的wmode必须设置为opaque flash对象的id和name属性均要设置,并且值相等.这样可以保证兼容所有浏览器. ExternalInterface.objectID //在