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部分: ...
随机推荐
- ajax连接池和XMLHttpRequest
连接池 我们公司在路由和交换机web界面和后端交互全部采用的是自己封装的ajax组件完成的,组件有点老了,代码风格和其中的某些用法现在看起来都有点不习惯.今天把这个组件的核心部分的ajax连接池记录下 ...
- 安卓 安装 platforms 的时候报错--访问 url 出错
强制使用http 访问连接,并在hosts中添加地址,即可 问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com ...
- JSON 教程学习进度备忘
书签:跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1. ______________ 知识点:1 ...
- 现代浏览器内置的可等效替代jQuery的功能
jQuery的体积在不断的增大.新功能要不断增加,这是必然结果.虽然从版本1.8.3开始的瘦身效果明显,但不可否认的是,对于移动手机端的网 页开发,它仍然是不可接受的.当然,jQuery不是铁板一块, ...
- jQuery文档加载完毕的几种写法
js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...
- Delphi 调用外部程序并等待其运行结束
转自:http://blog.csdn.net/xieyunc/article/details/4140620 如何让Delphi调用外部程序并等待其运行结束 1. uses Window ...
- Vmware虚拟机的网络设置
设置宿主机器的Vmnat8网络适配器. 设置IP地址如图所示 设置虚拟机的的网络 选择NAT方式 启动虚拟机,设置虚拟机的网络适配器
- Mcafee两个Mac版本之间的区别
近期打算为Mac安装个杀毒软件,由于自己windows平台下用的是VSE,所以Mac平台也首选Mcafee家的东西了.到Mcafee官网下载点一看,有以下几个版本可以用在Mac上: 有点懵了,查看了一 ...
- ZOJ 3596Digit Number(BFS+DP)
一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...
- 将php配置为服务
将以下代码保存为php-fpm,修改路径为自己的路径(有php.ini的) #!/bin/bash # # Startup script for the PHP-FPM server. # # chk ...