jquery.menu.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. /**
  2. * EasyUI for jQuery 1.6.10
  3. *
  4. * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved.
  5. *
  6. * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
  7. * To use it on other terms please contact us: info@jeasyui.com
  8. *
  9. */
  10. (function($){
  11. $(function(){
  12. $(document).unbind(".menu").bind("mousedown.menu",function(e){
  13. var m=$(e.target).closest("div.menu,div.combo-p");
  14. if(m.length){
  15. return;
  16. }
  17. $("body>div.menu-top:visible").not(".menu-inline").menu("hide");
  18. _1($("body>div.menu:visible").not(".menu-inline"));
  19. });
  20. });
  21. function _2(_3){
  22. var _4=$.data(_3,"menu").options;
  23. $(_3).addClass("menu-top");
  24. _4.inline?$(_3).addClass("menu-inline"):$(_3).appendTo("body");
  25. $(_3).bind("_resize",function(e,_5){
  26. if($(this).hasClass("easyui-fluid")||_5){
  27. $(_3).menu("resize",_3);
  28. }
  29. return false;
  30. });
  31. var _6=_7($(_3));
  32. for(var i=0;i<_6.length;i++){
  33. _b(_3,_6[i]);
  34. }
  35. function _7(_8){
  36. var _9=[];
  37. _8.addClass("menu");
  38. _9.push(_8);
  39. if(!_8.hasClass("menu-content")){
  40. _8.children("div").each(function(){
  41. var _a=$(this).children("div");
  42. if(_a.length){
  43. _a.appendTo("body");
  44. this.submenu=_a;
  45. var mm=_7(_a);
  46. _9=_9.concat(mm);
  47. }
  48. });
  49. }
  50. return _9;
  51. };
  52. };
  53. function _b(_c,_d){
  54. var _e=$(_d).addClass("menu");
  55. if(!_e.data("menu")){
  56. _e.data("menu",{options:$.parser.parseOptions(_e[0],["width","height"])});
  57. }
  58. if(!_e.hasClass("menu-content")){
  59. _e.children("div").each(function(){
  60. _f(_c,this);
  61. });
  62. $("<div class=\"menu-line\"></div>").prependTo(_e);
  63. }
  64. _10(_c,_e);
  65. if(!_e.hasClass("menu-inline")){
  66. _e.hide();
  67. }
  68. _11(_c,_e);
  69. };
  70. function _f(_12,div,_13){
  71. var _14=$(div);
  72. var _15=$.extend({},$.parser.parseOptions(_14[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(_14.attr("disabled")?true:undefined),text:$.trim(_14.html()),onclick:_14[0].onclick},_13||{});
  73. _15.onclick=_15.onclick||_15.handler||null;
  74. _14.data("menuitem",{options:_15});
  75. if(_15.separator){
  76. _14.addClass("menu-sep");
  77. }
  78. if(!_14.hasClass("menu-sep")){
  79. _14.addClass("menu-item");
  80. _14.empty().append($("<div class=\"menu-text\"></div>").html(_15.text));
  81. if(_15.iconCls){
  82. $("<div class=\"menu-icon\"></div>").addClass(_15.iconCls).appendTo(_14);
  83. }
  84. if(_15.id){
  85. _14.attr("id",_15.id);
  86. }
  87. if(_15.onclick){
  88. if(typeof _15.onclick=="string"){
  89. _14.attr("onclick",_15.onclick);
  90. }else{
  91. _14[0].onclick=eval(_15.onclick);
  92. }
  93. }
  94. if(_15.disabled){
  95. _16(_12,_14[0],true);
  96. }
  97. if(_14[0].submenu){
  98. $("<div class=\"menu-rightarrow\"></div>").appendTo(_14);
  99. }
  100. }
  101. };
  102. function _10(_17,_18){
  103. var _19=$.data(_17,"menu").options;
  104. var _1a=_18.attr("style")||"";
  105. var _1b=_18.is(":visible");
  106. _18.css({display:"block",left:-10000,height:"auto",overflow:"hidden"});
  107. _18.find(".menu-item").each(function(){
  108. $(this)._outerHeight(_19.itemHeight);
  109. $(this).find(".menu-text").css({height:(_19.itemHeight-2)+"px",lineHeight:(_19.itemHeight-2)+"px"});
  110. });
  111. _18.removeClass("menu-noline").addClass(_19.noline?"menu-noline":"");
  112. var _1c=_18.data("menu").options;
  113. var _1d=_1c.width;
  114. var _1e=_1c.height;
  115. if(isNaN(parseInt(_1d))){
  116. _1d=0;
  117. _18.find("div.menu-text").each(function(){
  118. if(_1d<$(this).outerWidth()){
  119. _1d=$(this).outerWidth();
  120. }
  121. });
  122. _1d=_1d?_1d+40:"";
  123. }
  124. var _1f=_18.outerHeight();
  125. if(isNaN(parseInt(_1e))){
  126. _1e=_1f;
  127. if(_18.hasClass("menu-top")&&_19.alignTo){
  128. var at=$(_19.alignTo);
  129. var h1=at.offset().top-$(document).scrollTop();
  130. var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight();
  131. _1e=Math.min(_1e,Math.max(h1,h2));
  132. }else{
  133. if(_1e>$(window)._outerHeight()){
  134. _1e=$(window).height();
  135. }
  136. }
  137. }
  138. _18.attr("style",_1a);
  139. _18.show();
  140. _18._size($.extend({},_1c,{width:_1d,height:_1e,minWidth:_1c.minWidth||_19.minWidth,maxWidth:_1c.maxWidth||_19.maxWidth}));
  141. _18.find(".easyui-fluid").triggerHandler("_resize",[true]);
  142. _18.css("overflow",_18.outerHeight()<_1f?"auto":"hidden");
  143. _18.children("div.menu-line")._outerHeight(_1f-2);
  144. if(!_1b){
  145. _18.hide();
  146. }
  147. };
  148. function _11(_20,_21){
  149. var _22=$.data(_20,"menu");
  150. var _23=_22.options;
  151. _21.unbind(".menu");
  152. for(var _24 in _23.events){
  153. _21.bind(_24+".menu",{target:_20},_23.events[_24]);
  154. }
  155. };
  156. function _25(e){
  157. var _26=e.data.target;
  158. var _27=$.data(_26,"menu");
  159. if(_27.timer){
  160. clearTimeout(_27.timer);
  161. _27.timer=null;
  162. }
  163. };
  164. function _28(e){
  165. var _29=e.data.target;
  166. var _2a=$.data(_29,"menu");
  167. if(_2a.options.hideOnUnhover){
  168. _2a.timer=setTimeout(function(){
  169. _2b(_29,$(_29).hasClass("menu-inline"));
  170. },_2a.options.duration);
  171. }
  172. };
  173. function _2c(e){
  174. var _2d=e.data.target;
  175. var _2e=$(e.target).closest(".menu-item");
  176. if(_2e.length){
  177. _2e.siblings().each(function(){
  178. if(this.submenu){
  179. _1(this.submenu);
  180. }
  181. $(this).removeClass("menu-active");
  182. });
  183. _2e.addClass("menu-active");
  184. if(_2e.hasClass("menu-item-disabled")){
  185. _2e.addClass("menu-active-disabled");
  186. return;
  187. }
  188. var _2f=_2e[0].submenu;
  189. if(_2f){
  190. $(_2d).menu("show",{menu:_2f,parent:_2e});
  191. }
  192. }
  193. };
  194. function _30(e){
  195. var _31=$(e.target).closest(".menu-item");
  196. if(_31.length){
  197. _31.removeClass("menu-active menu-active-disabled");
  198. var _32=_31[0].submenu;
  199. if(_32){
  200. if(e.pageX>=parseInt(_32.css("left"))){
  201. _31.addClass("menu-active");
  202. }else{
  203. _1(_32);
  204. }
  205. }else{
  206. _31.removeClass("menu-active");
  207. }
  208. }
  209. };
  210. function _33(e){
  211. var _34=e.data.target;
  212. var _35=$(e.target).closest(".menu-item");
  213. if(_35.length){
  214. var _36=$(_34).data("menu").options;
  215. var _37=_35.data("menuitem").options;
  216. if(_37.disabled){
  217. return;
  218. }
  219. if(!_35[0].submenu){
  220. _2b(_34,_36.inline);
  221. if(_37.href){
  222. location.href=_37.href;
  223. }
  224. }
  225. _35.trigger("mouseenter");
  226. _36.onClick.call(_34,$(_34).menu("getItem",_35[0]));
  227. }
  228. };
  229. function _2b(_38,_39){
  230. var _3a=$.data(_38,"menu");
  231. if(_3a){
  232. if($(_38).is(":visible")){
  233. _1($(_38));
  234. if(_39){
  235. $(_38).show();
  236. }else{
  237. _3a.options.onHide.call(_38);
  238. }
  239. }
  240. }
  241. return false;
  242. };
  243. function _3b(_3c,_3d){
  244. _3d=_3d||{};
  245. var _3e,top;
  246. var _3f=$.data(_3c,"menu").options;
  247. var _40=$(_3d.menu||_3c);
  248. $(_3c).menu("resize",_40[0]);
  249. if(_40.hasClass("menu-top")){
  250. $.extend(_3f,_3d);
  251. _3e=_3f.left;
  252. top=_3f.top;
  253. if(_3f.alignTo){
  254. var at=$(_3f.alignTo);
  255. _3e=at.offset().left;
  256. top=at.offset().top+at._outerHeight();
  257. if(_3f.align=="right"){
  258. _3e+=at.outerWidth()-_40.outerWidth();
  259. }
  260. }
  261. if(_3e+_40.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){
  262. _3e=$(window)._outerWidth()+$(document).scrollLeft()-_40.outerWidth()-5;
  263. }
  264. if(_3e<0){
  265. _3e=0;
  266. }
  267. top=_41(top,_3f.alignTo);
  268. }else{
  269. var _42=_3d.parent;
  270. _3e=_42.offset().left+_42.outerWidth()-2;
  271. if(_3e+_40.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){
  272. _3e=_42.offset().left-_40.outerWidth()+2;
  273. }
  274. top=_41(_42.offset().top-3);
  275. }
  276. function _41(top,_43){
  277. if(top+_40.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
  278. if(_43){
  279. top=$(_43).offset().top-_40._outerHeight();
  280. }else{
  281. top=$(window)._outerHeight()+$(document).scrollTop()-_40.outerHeight();
  282. }
  283. }
  284. if(top<0){
  285. top=0;
  286. }
  287. return top;
  288. };
  289. _40.css(_3f.position.call(_3c,_40[0],_3e,top));
  290. _40.show(0,function(){
  291. if(!_40[0].shadow){
  292. _40[0].shadow=$("<div class=\"menu-shadow\"></div>").insertAfter(_40);
  293. }
  294. _40[0].shadow.css({display:(_40.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:_40.css("left"),top:_40.css("top"),width:_40.outerWidth(),height:_40.outerHeight()});
  295. _40.css("z-index",$.fn.menu.defaults.zIndex++);
  296. if(_40.hasClass("menu-top")){
  297. _3f.onShow.call(_3c);
  298. }
  299. });
  300. };
  301. function _1(_44){
  302. if(_44&&_44.length){
  303. _45(_44);
  304. _44.find("div.menu-item").each(function(){
  305. if(this.submenu){
  306. _1(this.submenu);
  307. }
  308. $(this).removeClass("menu-active");
  309. });
  310. }
  311. function _45(m){
  312. m.stop(true,true);
  313. if(m[0].shadow){
  314. m[0].shadow.hide();
  315. }
  316. m.hide();
  317. };
  318. };
  319. function _46(_47,_48){
  320. var _49=null;
  321. var fn=$.isFunction(_48)?_48:function(_4a){
  322. for(var p in _48){
  323. if(_4a[p]!=_48[p]){
  324. return false;
  325. }
  326. }
  327. return true;
  328. };
  329. function _4b(_4c){
  330. _4c.children("div.menu-item").each(function(){
  331. var _4d=$(this).data("menuitem").options;
  332. if(fn.call(_47,_4d)==true){
  333. _49=$(_47).menu("getItem",this);
  334. }else{
  335. if(this.submenu&&!_49){
  336. _4b(this.submenu);
  337. }
  338. }
  339. });
  340. };
  341. _4b($(_47));
  342. return _49;
  343. };
  344. function _16(_4e,_4f,_50){
  345. var t=$(_4f);
  346. if(t.hasClass("menu-item")){
  347. var _51=t.data("menuitem").options;
  348. _51.disabled=_50;
  349. if(_50){
  350. t.addClass("menu-item-disabled");
  351. t[0].onclick=null;
  352. }else{
  353. t.removeClass("menu-item-disabled");
  354. t[0].onclick=_51.onclick;
  355. }
  356. }
  357. };
  358. function _52(_53,_54){
  359. var _55=$.data(_53,"menu").options;
  360. var _56=$(_53);
  361. if(_54.parent){
  362. if(!_54.parent.submenu){
  363. var _57=$("<div></div>").appendTo("body");
  364. _54.parent.submenu=_57;
  365. $("<div class=\"menu-rightarrow\"></div>").appendTo(_54.parent);
  366. _b(_53,_57);
  367. }
  368. _56=_54.parent.submenu;
  369. }
  370. var div=$("<div></div>").appendTo(_56);
  371. _f(_53,div,_54);
  372. };
  373. function _58(_59,_5a){
  374. function _5b(el){
  375. if(el.submenu){
  376. el.submenu.children("div.menu-item").each(function(){
  377. _5b(this);
  378. });
  379. var _5c=el.submenu[0].shadow;
  380. if(_5c){
  381. _5c.remove();
  382. }
  383. el.submenu.remove();
  384. }
  385. $(el).remove();
  386. };
  387. _5b(_5a);
  388. };
  389. function _5d(_5e,_5f,_60){
  390. var _61=$(_5f).parent();
  391. if(_60){
  392. $(_5f).show();
  393. }else{
  394. $(_5f).hide();
  395. }
  396. _10(_5e,_61);
  397. };
  398. function _62(_63){
  399. $(_63).children("div.menu-item").each(function(){
  400. _58(_63,this);
  401. });
  402. if(_63.shadow){
  403. _63.shadow.remove();
  404. }
  405. $(_63).remove();
  406. };
  407. $.fn.menu=function(_64,_65){
  408. if(typeof _64=="string"){
  409. return $.fn.menu.methods[_64](this,_65);
  410. }
  411. _64=_64||{};
  412. return this.each(function(){
  413. var _66=$.data(this,"menu");
  414. if(_66){
  415. $.extend(_66.options,_64);
  416. }else{
  417. _66=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_64)});
  418. _2(this);
  419. }
  420. $(this).css({left:_66.options.left,top:_66.options.top});
  421. });
  422. };
  423. $.fn.menu.methods={options:function(jq){
  424. return $.data(jq[0],"menu").options;
  425. },show:function(jq,pos){
  426. return jq.each(function(){
  427. _3b(this,pos);
  428. });
  429. },hide:function(jq){
  430. return jq.each(function(){
  431. _2b(this);
  432. });
  433. },destroy:function(jq){
  434. return jq.each(function(){
  435. _62(this);
  436. });
  437. },setText:function(jq,_67){
  438. return jq.each(function(){
  439. var _68=$(_67.target).data("menuitem").options;
  440. _68.text=_67.text;
  441. $(_67.target).children("div.menu-text").html(_67.text);
  442. });
  443. },setIcon:function(jq,_69){
  444. return jq.each(function(){
  445. var _6a=$(_69.target).data("menuitem").options;
  446. _6a.iconCls=_69.iconCls;
  447. $(_69.target).children("div.menu-icon").remove();
  448. if(_69.iconCls){
  449. $("<div class=\"menu-icon\"></div>").addClass(_69.iconCls).appendTo(_69.target);
  450. }
  451. });
  452. },getItem:function(jq,_6b){
  453. var _6c=$(_6b).data("menuitem").options;
  454. return $.extend({},_6c,{target:$(_6b)[0]});
  455. },findItem:function(jq,_6d){
  456. if(typeof _6d=="string"){
  457. return _46(jq[0],function(_6e){
  458. return $("<div>"+_6e.text+"</div>").text()==_6d;
  459. });
  460. }else{
  461. return _46(jq[0],_6d);
  462. }
  463. },appendItem:function(jq,_6f){
  464. return jq.each(function(){
  465. _52(this,_6f);
  466. });
  467. },removeItem:function(jq,_70){
  468. return jq.each(function(){
  469. _58(this,_70);
  470. });
  471. },enableItem:function(jq,_71){
  472. return jq.each(function(){
  473. _16(this,_71,false);
  474. });
  475. },disableItem:function(jq,_72){
  476. return jq.each(function(){
  477. _16(this,_72,true);
  478. });
  479. },showItem:function(jq,_73){
  480. return jq.each(function(){
  481. _5d(this,_73,true);
  482. });
  483. },hideItem:function(jq,_74){
  484. return jq.each(function(){
  485. _5d(this,_74,false);
  486. });
  487. },resize:function(jq,_75){
  488. return jq.each(function(){
  489. _10(this,_75?$(_75):$(this));
  490. });
  491. }};
  492. $.fn.menu.parseOptions=function(_76){
  493. return $.extend({},$.parser.parseOptions(_76,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}]));
  494. };
  495. $.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_25,mouseleave:_28,mouseover:_2c,mouseout:_30,click:_33},position:function(_77,_78,top){
  496. return {left:_78,top:top};
  497. },onShow:function(){
  498. },onHide:function(){
  499. },onClick:function(_79){
  500. }};
  501. })(jQuery);