`
shadowlin
  • 浏览: 47224 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jquery 右键菜单(ContextMenu)插件

阅读更多
目前做的项目需要在页面里面用右键菜单,在网上找到两种jquery的右键菜单插件,但是都有各种问题。所以就自己动手把两种插件结合了下。

修改后的右键菜单插架可以根据绑定的触发页面元素不同,复用同一个菜单使之根据触发页面元素有不同的行为。
支持多个个触发页面元素复用同一个菜单时,分开禁用或恢复禁用菜单或某些菜单项目。

一些说明:
1.菜单的样式由css文件contextMenu.css决定,可以根据需要自行修改,请根据实际情况设定z-index的值,保证菜单在最高的一层
2.请将菜单直接放于body下,至少不要让菜单的样式需要受除body外的样式来决定,因为在绑定的时候会把菜单移动到body下面。
3.这个插件是我根据http://www.trendskitchens.co.nz/jquery/contextmenu/和
http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/在后者的基础上修改的。
4.目前粗略测试在ie8,chrome,firefox下面工作正常.
5.例子和js代码打包在附件的文件中

下面是一个例子:

<!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-Type" content="text/html; charset=utf-8" />

		<link href="css/ContextMenu.css" rel="stylesheet" type="text/css" />



		<script src="js/lib/jquery-1.4.2.min.js" type="text/javascript"></script>

		<script src="js/lib/jquery.contextMenu.js" type="text/javascript"></script>



		<script type="text/javascript">

			$(document).ready(function() {



				 	$("#trigger1").contextMenu({

				 		menuId: 'contextMenu',

				 		onContextMenuItemSelected:function(menuItemId, $triggerElement){

				 			alert('trigger1'+menuItemId+' '+$triggerElement.attr('id'))

						},

						onContextMenuShow:function($triggerElement){

							alert('trigger1'+$triggerElement.attr('id'))

						},

						showShadow:false

				    });

				     $("#trigger1").disableContextMenuItems(['edit']) 

				    //$("#trigger1").enableContextMenuItems(['edit']) //解除某个菜单项的屏蔽

				    //$("#trigger1").disableContextMenu(); //屏蔽菜单

				    

				    $("#trigger2").contextMenu({

				 		menuId: 'contextMenu',

				 		onContextMenuItemSelected:function(menuItemId, $triggerElement){

				 			alert('trigger2'+menuItemId+' '+$triggerElement.attr('id'))

						},

						onContextMenuShow:function($triggerElement){

							alert('trigger2'+$triggerElement.attr('id'))

						}

				    });

				     $("#trigger2").disableContextMenuItems(['delete'])  //屏蔽某个菜单项

				     //$("#trigger2").enableContextMenuItems(['delete']) //解除某个菜单项的屏蔽



			})



		</script>





	</head>



	<body>

		<ul id="contextMenu" class="contextMenu">

				<li id="delete" class="delete">

					<a>删除</a>

				</li>

				<li id="edit" class="edit">

					<a>修改</a>

				</li>

		</ul>

		<div id="trigger1" style="width:100px;height:100px;background-color:green">trigger1</div>

		<div id="trigger2" style="width:100px;height:100px;background-color:green">trigger2</div>

	</body>

</html>



插件的代码如下:
// 原作者信息:
// jQuery Context Menu Plugin
//
// Version 1.01
//
// Cory S.N. LaViska
// A Beautiful Site (http://abeautifulsite.net/)
//
// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
//
// Terms of Use
//
// This plugin is dual-licensed under the GNU General Public License
//   and the MIT License and is copyright A Beautiful Site, LLC.
//
// mod信息:
// modified by shadowlin 2011-03-02


if(jQuery)(function(){
	//全局变量
	var $shadow;
	var defaults={
		menuId:null,
		onContextMenuItemSelected:function(menuItemId, $triggerElement) {    		
		},
		onContextMenuShow:function($triggerElement){
		},
		showShadow:true,
		fadeInSpeed:150,
		fadeOutSpeed:75
	}
	$.extend($.fn, {
		contextMenu: function(o) {
			// Defaults
			if( o.menuId == undefined ) return false;//如果没有menuId则退出
			if( o.fadeInSpeed == undefined ) o.fadeInSpeed = defaults.fadeInSpeed;
			if( o.fadeOutSpeed == undefined ) o.fadeOutSpeed =  defaults.fadeOutSpeed;
			if( o.showShadow == undefined ) o.showShadow =  defaults.showShadow;
			// 0 needs to be -1 for expected results (no fade)
			if( o.fadeInSpeed == 0 ) o.fadeInSpeed = -1;
			if( o.fadeOutSpeed == 0 ) o.fadeOutSpeed = -1;
			// Loop each context menu
			var $menu = $('#' + o.menuId);
			//把menu移动到body下面,避免计算位置的时候出现问题
			if($menu.data('isMovedToBody')!=true){//只移动一次
				$menu.appendTo('body').data('isMovedToBody',true);
			}
			if(!$shadow){
				$shadow = $('<div></div>').css( {
					backgroundColor : '#000',
					position : 'absolute',
					opacity : 0.4
				}).appendTo('body').hide();
			}
			$(this).each(function(){
				var $triggerElement = $(this);
				$triggerElement.data('contextMenu',{
					$menu:$menu,
					isEnabled:true,
					disabledMenuItemIdList:[]
				})
				// Add contextMenu class
				$menu.addClass('contextMenu');
				$triggerElement.unbind('contextmenu').bind('contextmenu',function(e){
					var $currentTriggerElement=$(this);
					var contextMenu=$currentTriggerElement.data('contextMenu');
					//检查菜单是否被屏蔽
					if($currentTriggerElement.data('contextMenu').isEnabled===false) return false;
					//如果有定义onContextMenuShow,在显示前调用
					if(typeof o.onContextMenuShow=='function'){
						o.onContextMenuShow($currentTriggerElement);
					}
					//显示右键菜单
					showMenu(e);
					//绑定菜单项
					$menu.find('li').removeClass('disabled');
					var disabledMenuItemIdList=contextMenu.disabledMenuItemIdList;
					var queryStr='';
					if(disabledMenuItemIdList.length>0){
						var strDisabledMenuItemIdList='';
						for(var index in disabledMenuItemIdList){
							var disabledMenuItemId=disabledMenuItemIdList[index];
							if(index==0){
								strDisabledMenuItemIdList+='#'+disabledMenuItemId;
							}else{
								strDisabledMenuItemIdList+=',#'+disabledMenuItemId;
							}
						}
						
						queryStr='li:not('+strDisabledMenuItemIdList+')';
						$menu.find(strDisabledMenuItemIdList).addClass('disabled');
					}else{
						queryStr='li';
					}
					$menu.find('li').find('a').unbind('click');
					$menu.find(queryStr).find('a').bind('click',$currentTriggerElement,function(event){
						// Callback
						var callback=o.onContextMenuItemSelected;
						if(typeof callback=='function' ){
							callback( $(this).parent().attr('id'),event.data);
						}
						hideMenu();
						return false;
					});
					$(document).unbind('mousedown').bind('mousedown',function(event) {
						if($(event.target).parents('#'+o.menuId).html()==null){
							hideMenu();
						}
					});
					//阻止默认右键菜单
					return false;
				})
				// Disable text selection
				if( $.browser.mozilla ) {
					$menu.each( function() { $(this).css({ 'MozUserSelect' : 'none' }); });
				} else if( $.browser.msie ) {
					$menu.each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); });
				} else {
					$menu.each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); });
				}
			});
			
			function showMenu(event){
				//显示菜单
				$menu.css({
					'left' : event.pageX,
					'top' : event.pageY
				}).fadeIn(o.fadeInSpeed);
				//显示阴影
				if(o.showShadow){
					$shadow.css('zIndex',$menu.css('zIndex')-1);
					$shadow.css( {
						width : $menu.outerWidth(),
						height : $menu.outerHeight(),
						left : event.pageX + 2,
						top : event.pageY + 2
					}).fadeIn(o.fadeInSpeed);
				}

			}
			
			function hideMenu(){
				$menu.fadeOut(o.fadeOutSpeed);
				if(o.showShadow){
					$shadow.fadeOut(o.fadeOutSpeed);
				}
			}
			return $(this);
		},
		
		/**
		 * 参数为id数组,如无参数则disable全部
		 */
		disableContextMenuItems: function(o) {
			$(this).each(function(){
				var contextMenu=$(this).data('contextMenu');
				var $menu=contextMenu.$menu;
				if(o==undefined) {
					var list=[];
					$menu.find('li').each(function(){
						var menuItemId=$(this).attr('id');
						list.push(menuItemId);
					})
					contextMenu.disabledMenuItemIdList=list
				}else{
					contextMenu.disabledMenuItemIdList=o
				}
			})
			return( $(this) );
		},
		
		// Enable context menu items on the fly
		enableContextMenuItems: function(o) {
			$(this).each(function(){
				var contextMenu=$(this).data('contextMenu');
				var $menu=contextMenu.$menu;
				if(o==undefined) {
					contextMenu.disabledMenuItemIdList=[]
				}else{
					contextMenu.disabledMenuItemIdList=$.grep(contextMenu.disabledMenuItemIdList,function(value,index){
						if($.inArray(value,o)!=-1){
							return false;
						}else{
							return true
						}
						
					})
				}
			})
			return( $(this) );
		},
		
		// Disable context menu(s)
		disableContextMenu: function() {
			$(this).each( function() {
				var contextMenu=$(this).data('contextMenu');
				contextMenu.isEnabled=false;
			});
			return( $(this) );
		},
		
		// Enable context menu(s)
		enableContextMenu: function() {
			$(this).each( function() {
				var contextMenu=$(this).data('contextMenu');
				contextMenu.isEnabled=true;
			});
			return( $(this) );
		},
		
		// Destroy context menu(s)
		destroyContextMenu: function() {
			$(this).each( function() {
				$(this).removeData('contextMenu');
			});
			return( $(this) );
		}
		
	});
})(jQuery);
分享到:
评论
5 楼 编程的石头 2012-08-15  
做的很好,感谢楼主
4 楼 yiyi_2 2011-03-11  
mark下,不错的东东
3 楼 qiankun 2011-03-10  
最近正在找右键菜单的东西,正好先研究下
2 楼 shadowlin 2011-03-09  
lqixv 写道
下载来看了,功能菜单都不错。只是做的 demo 难看了点,点击时的提示信息不太好清楚。不过,demo 做得好看与否与你的右键菜单无关。支持一下!

:)demo没太认真写,其实就是我当时自己测试用的。
我主要是合并了几个现有的contextMenu的功能,按照自己使用的时候的需求修改了一下。
1 楼 lqixv 2011-03-08  
下载来看了,功能菜单都不错。只是做的 demo 难看了点,点击时的提示信息不太好清楚。不过,demo 做得好看与否与你的右键菜单无关。支持一下!

相关推荐

    jquery-contextMenu右键(左键)菜单插件

    `jQuery-contextMenu`是一款强大的JavaScript插件,专为创建功能丰富的上下文菜单而设计,能够处理大量的元素。这款插件不仅支持传统的右键点击触发,还可以根据需求设置为左键点击显示菜单,极大地提升了用户的交互...

    jquery右键菜单插件

    `jQuery contextmenu` 插件就是这样一个工具,它允许开发者轻松创建自定义的右键菜单。本文将详细探讨如何使用这个基于 `jQuery` 的插件,以及如何根据描述中的内容进行修改和定制。 1. **jQuery contextmenu 插件...

    Jquery右键菜单插件ContextJS

    **jQuery右键菜单插件ContextJS详解** 在网页开发中,右键菜单通常是增强用户体验的一种常见功能,它能提供快捷的操作选项。`ContextJS`是一个专门为jQuery设计的右键菜单插件,允许开发者轻松地为网页元素添加...

    jquery右键菜单实现

    而"jQuery右键菜单实现"是一个常见的需求,它允许用户在网页元素上右击鼠标时弹出一个自定义的菜单,提供额外的功能或选项。这个功能通常通过jQuery插件来实现,例如`jQuery contextMenu`。 `jQuery contextMenu`是...

    jquery 右键菜单功能

    **一、理解jQuery右键菜单的基本原理** jQuery右键菜单功能主要是通过监听鼠标右键点击事件(`contextmenu`)来触发自定义的菜单展示。当用户在网页上右键点击时,JavaScript会阻止浏览器默认的右键菜单弹出,然后...

    BootstrapContextMenu是一款非常实用的基于Bootstrap的jQuery右键上下文菜单插件

    Bootstrap Context Menu是一款非常实用的基于Bootstrap的jQuery右键上下文菜单插件。该右键菜单插件可以在多种元素上触发,也可以配合Font Awesome字体图标一起使用,非常的方便。

    Jquery 右键菜单插件、css样式

    最后,`jquery.contextmenu.js` 可能是一个预封装好的 jQuery 插件,用于简化右键菜单的实现。这样的插件通常提供了一些配置选项,允许开发者定制菜单的内容、样式、行为等。使用插件的好处是减少代码重复,提高代码...

    jquery插件ContextMenu设置右键菜单

    而jQuery插件,特别是ContextMenu插件,可以让开发者方便地为网页元素添加右键菜单功能。 ContextMenu插件允许我们创建定制的右键菜单,并且对菜单进行各项设置,比如菜单的显示方式、触发元素、菜单项的内容、菜单...

    jQuery右键菜单插件context.js.zip

    《jQuery右键菜单插件context.js的深度解析与应用》 在前端开发中,交互体验是提升用户体验的关键一环,而右键菜单作为常见的交互元素,能够为用户提供便捷的操作选项。jQuery作为一个轻量级的JavaScript库,其丰富...

    jQuery右键菜单contextMenu使用实例

    根据提供的文件信息,可以总结出以下关于jQuery右键菜单contextMenu使用实例的知识点: 1. jQuery插件介绍:contextMenu是一款用于实现自定义右键菜单的jQuery插件。它允许用户通过右键操作来触发预定义的菜单选项...

    jQuery右键菜单插件jQueryContextMenu.zip

    用于创建右键弹出菜单的jQuery插件。   标签:jQuery

    Jquery-右键菜单插件

    **jQuery右键菜单插件详解** 在Web开发中,用户交互是至关重要的,而右键菜单作为用户界面的一部分,能够提供便捷的操作入口。jQuery作为一款强大的JavaScript库,为开发者提供了丰富的插件,使得创建自定义右键...

    基于jquery的鼠标右键菜单插件

    ### 三、jQuery右键菜单插件的工作原理 1. **事件监听**:插件首先会监听鼠标右键点击事件,这通常是`contextmenu`事件。 2. **阻止默认行为**:当用户右键点击时,插件会阻止浏览器默认的右键菜单显示。 3. **动态...

    jquery 右键菜单

    实现jQuery右键菜单的一个关键库是`jQuery.contextMenu`插件,该插件提供了方便的API来创建和管理右键菜单。`jQuery.contextMenu`允许开发者定义菜单的配置,包括菜单项、图标、回调函数等。例如,你可以这样使用: ...

    jquery右键菜单

    要使用这个jQuery右键菜单,首先需要在HTML文档头部引入jQuery库和contextmenu插件的CSS及JS文件。接着,通过jQuery的选择器找到想要添加右键菜单的元素,然后调用`.contextmenu()`方法并传递配置选项。配置选项可以...

    基于jquery的网页右键菜单设置,js多级菜单

    相比于传统的HTML菜单,jQuery右键菜单可以更方便地实现动态加载和自定义样式,同时支持多级结构,以满足复杂的需求。 "js多级菜单设置"是指在右键菜单中嵌套子菜单,形成层次结构。例如,一级菜单可以是“编辑”、...

    JQuery之ContextMenu(右键菜单)

    本篇文章将深入探讨jQuery中的ContextMenu插件,这是一种实现右键菜单功能的方法,能够为网页提供更丰富的交互体验。 一、jQuery及其ContextMenu插件简介 jQuery是一个轻量级的JavaScript库,它通过其简洁的API使得...

Global site tag (gtag.js) - Google Analytics