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

许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单
下面我们也来实现一个自定义的右键菜单

首先来创建JSP页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <html>
 3 <head>
 4 <title>右键菜单</title>
 5 <script src="js/jquery.min.js"></script>
 6 </head>
 7 <link rel="stylesheet" type="text/css" href="css/demo.css">
 8 <link rel="stylesheet" type="text/css" href="css/context.standalone.css">
 9 <script src="js/context.js"></script>
10 <script src="js/demo.js"></script>
11 <body>
12     <div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';"></div>
13 </body>
14 </html>

这里来控制一个文本区域内浏览器自带的右键菜单禁用,使用自定义菜单

  1 /**
  2  *@ trimmer Visec·Dana
  3  *@ time 2014-7-23
  4  **/
  5 var context = context || (function () {
  6     var options = {
  7         fadeSpeed: 100,
  8         filter: function ($obj) {
  9         },
 10         above: 'auto',
 11         preventDoubleContext: true,
 12         compress: false
 13     };
 14 
 15     function initialize(opts){
 16         options = $.extend({}, options, opts);
 17         $(document).on('click', 'html', function () {
 18             $('.dropdown-context').fadeOut(options.fadeSpeed, function(){
 19                 $('.dropdown-context').css({display:''}).find('.drop-left').removeClass('drop-left');
 20             });
 21         });
 22         if(options.preventDoubleContext){
 23             $(document).on('contextmenu', '.dropdown-context', function (e) {
 24                 e.preventDefault();
 25             });
 26         }
 27         $(document).on('mouseenter', '.dropdown-submenu', function(){
 28             var $sub = $(this).find('.dropdown-context-sub:first'),
 29                 subWidth = $sub.width(),
 30                 subLeft = $sub.offset().left,
 31                 collision = (subWidth+subLeft) > window.innerWidth;
 32             if(collision){
 33                 $sub.addClass('drop-left');
 34             }
 35         });
 36         
 37     }
 38 
 39     function updateOptions(opts){
 40         options = $.extend({}, options, opts);
 41     }
 42 
 43     function buildMenu(data, id, subMenu){
 44         var subClass = (subMenu) ? ' dropdown-context-sub' : '',
 45             compressed = options.compress ? ' compressed-context' : '',
 46             $menu = $('<ul class="dropdown-menu dropdown-context' + subClass + compressed+'" id="dropdown-' + id + '"></ul>');
 47         var i = 0, linkTarget = '';
 48         for(i; i<data.length; i++){
 49             if (typeof data[i].divider !== 'undefined'){
 50                 $menu.append('<li class="divider"></li>');
 51             } else if (typeof data[i].header !== 'undefined'){
 52                 $menu.append('<li class="nav-header">' + data[i].header + '</li>');
 53             } else {
 54                 if (typeof data[i].href == 'undefined'){
 55                     data[i].href = '#';
 56                 }
 57                 if (typeof data[i].target !== 'undefined'){
 58                     linkTarget = ' target="'+data[i].target+'"';
 59                 }
 60                 if (typeof data[i].subMenu !== 'undefined'){
 61                     $sub = ('<li class="dropdown-submenu"><a tabindex="-1" href="' + data[i].href + '">' + data[i].text + '</a></li>');
 62                 }else{
 63                     $sub = $('<li><a tabindex="-1" href="' + data[i].href + '"'+linkTarget+'>' + data[i].text + '</a></li>');
 64                 }
 65                 if (typeof data[i].action !== 'undefined'){
 66                     var actiond = new Date(),
 67                         actionID = 'event-' + actiond.getTime() * Math.floor(Math.random()*100000),
 68                         eventAction = data[i].action;
 69                     $sub.find('a').attr('id', actionID);
 70                     $('#' + actionID).addClass('context-event');
 71                     $(document).on('click', '#' + actionID, eventAction);
 72                 }
 73                 $menu.append($sub);
 74                 if (typeof data[i].subMenu != 'undefined'){
 75                     var subMenuData = buildMenu(data[i].subMenu, id, true);
 76                     $menu.find('li:last').append(subMenuData);
 77                 }
 78             }
 79             if (typeof options.filter == 'function') {
 80                 options.filter($menu.find('li:last'));
 81             }
 82         }
 83         return $menu;
 84     }
 85     function addContext(selector, data){
 86         var d = new Date(),
 87             id = d.getTime(),
 88             $menu = buildMenu(data, id);
 89         $('body').append($menu);
 90         $(document).on('contextmenu', selector, function (e){
 91             e.preventDefault();
 92             e.stopPropagation();
 93             $('.dropdown-context:not(.dropdown-context-sub)').hide();
 94             $dd = $('#dropdown-' + id);
 95             if (typeof options.above == 'boolean' && options.above) {
 96                 $dd.addClass('dropdown-context-up').css({
 97                     top: e.pageY - 20 - $('#dropdown-' + id).height(),
 98                     left: e.pageX - 13
 99                 }).fadeIn(options.fadeSpeed); 
100             } else if (typeof options.above == 'string' && options.above == 'auto'){
101                 $dd.removeClass('dropdown-context-up');
102                 var autoH = $dd.height() + 12;
103                 if ((e.pageY + autoH) > $('html').height()){
104                     $dd.addClass('dropdown-context-up').css({
105                         top: e.pageY - 20 - autoH,
106                         left: e.pageX - 13
107                     }).fadeIn(options.fadeSpeed);
108                 } else {
109                     $dd.css({ 
110                         top: e.pageY + 10,  
111                         left: e.pageX - 13
112                     }).fadeIn(options.fadeSpeed); 
113                 }
114             }
115         });
116     }
117     function destroyContext(selector) {
118         $(document).off('contextmenu', selector).off('click', '.context-event');
119     }
120     return {
121         init: initialize,
122         settings: updateOptions,
123         attach: addContext,
124         destroy: destroyContext
125     };
126 })();

context.js主要来编写自定义右键菜单对应的功能连接
下面的demo.js则是菜单的编辑与显示的样式

 1 /**
 2  * @trimmer Visec·Dana
 3  * @time 2014-7-23
 4  */
 5 $(document).ready(function(){
 6     /**
 7      * 右键菜单信息
 8      * text 文本内容
 9      * href 链接地址ַ
10      */
11     context.settings({compress: true});   //字体属性大小
12     context.attach('html',[
13         {header: '菜单栏'},
14         {divider: true},      //控制实线
15         {text: '后退', href: '#'},
16         {text: '前进', href: '#'},
17         {divider: true},
18         {text: '菜单信息1', href: '#'},
19         {text: '菜单信息1', href: '#'},
20         {text: '菜单信息1', href: '#'},
21         {text: '菜单信息1', href: '#'},
22         {divider: true},
23         {text: '菜单信息1', href: '#'},
24         {divider: true},
25         {text: '禁用自定义菜单', action: function(e){
26             e.preventDefault();
27             context.destroy('html');
28             alert('确定要禁用吗?');
29         }},
30     ]);
31     context.init({preventDoubleContext: false});  //单击左键关闭右键菜单
32 });

这里是我编写的一个Demo的文件结构图,还有一些CSS文件信息代码,我就不贴了,文件已共享!

 

Demo下载:http://yunpan.cn/Q7BVXNGXdSvYB  访问密码 04d9

posted @ 2014-09-11 13:58  小码哥、iByte  阅读(3917)  评论(2编辑  收藏  举报