jquery.menu.js 11 KB

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