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; font-weight: bold;">>trigger1</div>
- <div id="trigger2" style="width:100px;height:100px; font-weight: bold;">>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);
Jquery 右键菜单(ContextMenu)插件使用记录的更多相关文章
- jQuery右键菜单contextMenu实例
URL: http://www.cnblogs.com/whitewolf/archive/2011/09/28/2194795.html http://www.blogjava.net/superc ...
- jQuery右键菜单contextMenu使用实例
在最近项目中需要频繁的右键菜单操作.我采用了contextMenu这款jQuery插件. 参考网址:http://www.jb51.net/article/58709.htm 官网demo http: ...
- jQuery右键菜单ContextMenu使用笔记
插件下载地址:http://www.trendskitchens.co.nz/jquery/contextmenu/jquery.contextmenu.r2.packed.js 和http://ww ...
- 几款jQuery右键菜单插件介绍
在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单. 类似右键菜单的组件网上很多.一般而言,改变浏览器的默认菜单应当 ...
- jquery右键菜单
点击这里体验效果 如果要屏蔽页面原来的右键菜单,请设置disable_native_context_menu:true 以下是源代码: <!DOCTYPE html> <html&g ...
- ExtJS配置TabPanel的鼠标右键菜单(ContextMenu)功能
更新记录 2022年6月14日 发布. 2022年6月13日 初稿. TabPanel的鼠标右键菜单(ContextMenu)功能介绍 开源的TabPanel组件很少做到拖拽调整tab顺序功能的,支持 ...
- 【WPF】右键菜单ContextMenu可点击区域太小的问题
问题描述 正常使用右键菜单ContextMenu时,如果菜单项是不变的,可以直接在XAML中写死,如下是给一个Button按钮添加了右键菜单功能. <Button Content="T ...
- 几款jQuery右键菜单插件
1.jQuery Very Simple ContextMenu Plugin 2.ContextJS Project Page:http://lab.jakiestfu.com/contextjs/ ...
- js(jquery)右键菜单插件的实现
今天开发一个项目的时候需要一个模拟鼠标右键菜单的功能.也就是在网页点击鼠标右键的时候不是弹出系统的菜单而是我们制定的内容.这样可以拓展右键的功能.实现过程不多说了,写出来的代码和效果如下: js部分: ...
随机推荐
- ylb:表的结构的修改和基本约束
ylbtech-SQL Server:SQL Server-表的结构的修改和基本约束 SQL Server 表的结构的修改和基本约束. 1,表的结构的修改和基本约束返回顶部 use master go ...
- 基于XMPP协议的手机多方多端即时通讯方案
一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...
- Free Candies
题意: 有4堆东西,每堆有n个每个有一个颜色,现在有一个篮子最多能装5个不同的颜色的东西,每次都从堆顶拿,当篮子出现两个相同颜色,可以获得这两个东西,求获得的最大数量 分析: 因为就4推,可以把各堆的 ...
- 关于Cygwin的x-Server的自动运行以及相关脚本修改
常常需要用到远端服务器的图形工具,如果在windows端没用xserver的话,很多程序无法运行.一个特殊的例子,emacs在没用xserver的时候,是直接在终端中打开的,如果不修改cygwin.b ...
- opencv3.0 在 android 上的使用
下载 OpenCV-3.0.0-android-sdk-1.zip 打开 intellj,新建立一个 android 工程后选择工程属性,导入模块(Import module from externa ...
- 类 .xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- python堡垒机
堡垒机 windows下安装python3的paramiko模块后一些报错总结: error: Unable to find vcvarsall.bat [官网对此问题的描述] : https://d ...
- php 解压 .gz 文件
在百度搜索到的 PharData 类和 ZipArchive 都是解压不了 .gz 的文件的,后来在 google 搜索到解决方法,问题解决. try { $phar = new PharData($ ...
- intel xdk 打ios的ipa包
1.打包 2.点击edit.下载csr文件,然后上传到苹果开发者网址,生成cer文件 上面两步搞完,把最后的按钮设置成"yes" 3.上传配置文件
- 第三百二十七天 how can I 坚持
都没心情学习了,睡觉.太失败了. 好了,你赢了,最怕女人不说话了,我妈一生气就不说话,有点怕我妈,你想删就把我删了吧,我不怪你. 给你个善意的建议,任何事情都要有度,过犹而不及,你是属于那种比较听家 ...