Files
leanote/public/js/contextmenu/jquery.contextmenu-min.js
2014-10-22 16:20:45 +08:00

1 line
5.4 KiB
JavaScript

LEA.cmroot=1;(function($){function returnfalse(){return false}$.fn.contextmenu=function(option){var cmroot="contextmenu"+LEA.cmroot;LEA.cmroot++;option=$.extend({alias:cmroot,width:150},option);var ruleName=null,target=null,groups={},mitems={},actions={},showGroups=[],itemTpl='<div class="b-m-$[type]" unselectable="on"><div class="clearfix cm-item"><div class="b-m-icon pull-left"><i class="fa $[faIcon]"></i>$[imgIcon]</div><div class="pull-left cm-text"><span class="c-text" unselectable="on">$[text]</span></div></div></div>';itemNoIconTpl="<div class='b-m-$[type]' unselectable=on><nobr unselectable=on><span align='absmiddle'></span><span class='c-text' unselectable=on>$[text]</span></nobr></div>";var gTemplet=$("<div/>").addClass("b-m-mpanel").attr("unselectable","on").css("display","none");var iTemplet=$("<div/>").addClass("b-m-item").attr("unselectable","on");var sTemplet=$("<div/>").addClass("b-m-split");var $body=$("body");var itemsCache={};var buildGroup=function(obj){groups[obj.alias]=this;this.gidx=obj.alias;this.id=obj.alias;if(obj.disable){this.disable=obj.disable;this.className="b-m-idisable"}$(this).width(obj.width).click(function(){}).mousedown(returnfalse).appendTo($body);obj=null;return this};var buildItem=function(obj){var T=this;T.title=obj.text;T.idx=obj.alias;T.gidx=obj.gidx;T.data=obj;var imgIcon="";if(obj.icon){imgIcon='<img src="'+obj.icon+'"/>'}obj.imgIcon=imgIcon;if(obj.icon){T.innerHTML=itemTpl.replace(/\$\[([^\]]+)\]/g,function(){return obj[arguments[1]]})}else{T.innerHTML=itemTpl.replace(/\$\[([^\]]+)\]/g,function(){return obj[arguments[1]]})}if(obj.disable){T.disable=obj.disable;T.className="b-m-idisable"}obj.items&&(T.group=true);obj.action&&(actions[obj.alias]=obj.action);mitems[obj.alias]=T;T=obj=null;return this};var addItems=function(gidx,items,parentAlias){var tmp=null;var len=items.length;for(var i=0;i<len;i++){var item=items[i];if(item.type=="splitLine"){tmp=sTemplet.clone()[0]}else{if(!item.alias){if(parentAlias){item.alias=parentAlias+"."+item.text}else{item.alias=item.text}}item.gidx=gidx;if(item.type=="group"&&!item.action){buildGroup.apply(gTemplet.clone()[0],[item]);itemsCache[item.alias]=item.items;item.type="arrow";tmp=buildItem.apply(iTemplet.clone()[0],[item])}else{if(item.type=="group"){buildGroup.apply(gTemplet.clone()[0],[item]);itemsCache[item.alias]=item.items;item.type="arrow";tmp=buildItem.apply(iTemplet.clone()[0],[item])}else{item.type="ibody";tmp=buildItem.apply(iTemplet.clone()[0],[item])}var thisItem=item;(function(thisItem,tmp){$(tmp).click(function(e){if(!this.disable){if($.isFunction(actions[this.idx])){actions[this.idx].call(this,target,thisItem)}hideMenuPane();$(target).removeClass("contextmenu-hover")}return false})})(thisItem,tmp)}$(tmp).bind("contextmenu",returnfalse).hover(overItem,outItem)}groups[gidx].appendChild(tmp);tmp=item=item.items=null}gidx=items=null};var overItem=function(e){if(this.disable)return false;hideMenuPane.call(groups[this.gidx]);if(this.group){var pos=$(this).offset();var width=$(this).outerWidth();showMenuGroup.apply(groups[this.idx],[pos,width,this])}this.className="b-m-ifocus";return false};var outItem=function(e){if(this.disable)return false;if(!this.group){this.className="b-m-item"}return false};var showMenuGroup=function(pos,width,t){var $this=$(this);if($this.html()==""){addItems(t.idx,itemsCache[t.idx],t.idx)}var bwidth=$body.width();var bheight=document.documentElement.clientHeight-10;bheight=bheight<0?100:bheight;var mwidth=$(this).outerWidth();var mheight=$(this).outerHeight()-10;mheight=mheight<0?100:mheight;var mwidth=$(this).outerWidth();pos.left=pos.left+width+mwidth>bwidth?pos.left-mwidth<0?0:pos.left-mwidth:pos.left+width;pos.top=pos.top+mheight>bheight?pos.top-mheight+(width>0?25:0)<0?0:pos.top-mheight+(width>0?25:0):pos.top;$(this).css(pos).show().css("max-height",bheight);showGroups.push(this.gidx)};var hideMenuPane=function(){var alias=null;for(var i=showGroups.length-1;i>=0;i--){if(showGroups[i]==this.gidx)break;alias=showGroups.pop();groups[alias].style.display="none";mitems[alias]&&(mitems[alias].className="b-m-item")}};function applyRule(rule){for(var i in mitems)disable(i,!rule.disable);for(var i=0;i<rule.items.length;i++)disable(rule.items[i],rule.disable);ruleName=rule.name}function disable(alias,disabled){var item=mitems[alias];if(!item||!item.lastChild){return}item.className=(item.disable=item.lastChild.disabled=disabled)?"b-m-idisable":"b-m-item"}function showMenu(e,menutarget){target=menutarget;showMenuGroup.call(groups[cmroot],{left:e.pageX,top:e.pageY},0);if(!$(target).hasClass("item-active")){$(target).addClass("contextmenu-hover")}$(document).one("click",function(){hideMenuPane();$(target).removeClass("contextmenu-hover")})}var $root=$("#"+option.alias);var root=null;if($root.length==0){root=buildGroup.apply(gTemplet.clone()[0],[option]);root.applyrule=applyRule;root.showMenu=showMenu;addItems(option.alias,option.items)}else{root=$root[0]}function onShowMenu(e){var bShowContext=option.onContextMenu&&$.isFunction(option.onContextMenu)?option.onContextMenu.call(this,e):true;if(bShowContext){if(option.onShow&&$.isFunction(option.onShow)){option.onShow.call(this,root)}root.showMenu(e,this)}if(e){e.preventDefault()}return false}var me=$(option.parent).on("contextmenu",option.children,function(e){onShowMenu.call(this,e)});if(option.rule){applyRule(option.rule)}var out={destroy:function(){me.unbind("contextmenu")},showMenu:function(e,target){onShowMenu.call(target,e)}};return out}})(jQuery);