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部分: ...
随机推荐
- C# GDI+学习笔记1
前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...
- CURL --- 命令行浏览器CURL
CURL --- 命令行浏览器CURL CURL --- 命令行浏览器 CURL? 嗯,说来话长了~~~~ 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1)二话不说,先从 ...
- size_type、size_t、differentce_type以及ptrdiff_t
目录(?)[-] size_type size_t different_type ptrdiff_t size_t是unsigned类型,用于指明数组长度或下标,它必须是一个正数,std::siz ...
- 第一个UI脚本--python+selenium
之前一直是用java+selenium做自动化测试的,最近因为工作需要,需要用pyhton+selenium去实现,于是就赶驴上架,熟悉了一下python的语法和脚本的编写过程,下面是一个简单的脚本, ...
- Cocos2d-android (01) 创建一个简单的cocos2d应用程序
下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...
- leetcode:Integer to Roman(整数转化为罗马数字)
Question: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the rang ...
- 三年程序学习之二:(对web初认识)
接着上一篇讲,之后第二天我就来公司上班了,主要是前端,CSS+DIV,table,网站维护之类的,这样的日子过了将近3个星期,一直没什么进展,自己也学不到什么技术,不过我觉得CSS+DIV我算是基础的 ...
- Android学习之散乱的知识点
1. 安卓广告知名平台:有米,哇棒,架势,admob(国外,但效果不好)等,推荐用有米 2. src目录为源文件目录,所有可以被用户修改和创建的Java文件将被存放在这个目录下 3. xml中引用st ...
- erlang 基础知识
一 数据类型 1. 整数 Integer Erlang可表示任意大的整数,大整数自动转换成bignums类型,比固定大小的整数类型相对效率较低. Base#Value 表示基数不是10的整数.如:2# ...
- 【CLR】奇妙的String
- 一.背景 1. 以下代码的HashCode是否相同,它们是否是同个对象: var A = "ab" + "c"; var B = "abc&quo ...