menu.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. 
  2. //{ id, text, parentId?, href?, hrefTarget?, icon, iconCls, cls, expanded, children }
  3. var Menu_Id = 1;
  4. var Menu = function (element, options) {
  5. this.element = $(element);
  6. this.options = $.extend(true, {}, this.options, options);
  7. this.init();
  8. }
  9. var open_li = null;
  10. var open_el = null;
  11. var sel_li = null;
  12. Menu.prototype = {
  13. options: {
  14. data: null,
  15. itemclick: null
  16. },
  17. loadData: function (data) {
  18. this.options.data = data || [];
  19. this.refresh();
  20. },
  21. refresh: function () {
  22. this._render();
  23. },
  24. init: function () {
  25. var me = this,
  26. opt = me.options,
  27. el = me.element;
  28. //el.addClass('menu');
  29. me.loadData(opt.data);
  30. el.on('click', '.menu-title', function (event) {
  31. var el = $(event.currentTarget);
  32. var li = el.parent();
  33. var item = me.getItemByEvent(event);
  34. //alert(item);
  35. // me.toggleItem(item);
  36. //alert(li + "," + open_li);
  37. //if (open_li.getAttribute("data-id") == li.getAttribute("data-id")) {
  38. // li.toggleClass('open');
  39. //} else {
  40. // if (open_li != null) {
  41. // if(open_li.attr("data-id") == li.attr("data-id"))
  42. // open_li.toggleClass('open');
  43. // }
  44. // else li.toggleClass('open');
  45. // open_li = li;
  46. //}
  47. if (open_el != null) {
  48. if (open_el.attr("data-id") == el.attr("data-id")) {
  49. open_li.toggleClass("open");
  50. open_li = null;
  51. open_el = null;
  52. return;
  53. }
  54. open_li.toggleClass("open");
  55. open_li = null;
  56. open_el = null;
  57. }
  58. li.toggleClass('open');
  59. open_li = li;
  60. open_el = el;
  61. //li.toggleClass('open');
  62. if (opt.itemclick) opt.itemclick.call(me, item);
  63. });
  64. el.on('click', '.menu-sec-title', function (event) {
  65. var el = $(event.currentTarget);
  66. var li = el.parent();
  67. var item = me.getSecItemByEvent(event);
  68. //alert(item);
  69. // me.toggleItem(item);
  70. if (sel_li != null) sel_li.toggleClass('sel');
  71. li.toggleClass('sel');
  72. sel_li = li;
  73. if (opt.itemclick) opt.itemclick.call(me, item);
  74. });
  75. },
  76. _render: function () {
  77. var data = this.options.data || [];
  78. var html = this._renderItems(data, null);
  79. this.element.html(html);
  80. },
  81. _renderItems: function (items, parent) {
  82. var s = '<ul class="' + (parent ? "menu-submenu" : "menu") + '">';
  83. for (var i = 0, l = items.length; i < l; i++) {
  84. var item = items[i];
  85. s += this._renderItem(item,(parent?1:0));
  86. }
  87. s += '</ul>';
  88. return s;
  89. },
  90. _renderItem: function (item, idx) {
  91. idx = idx || 0;
  92. var me = this,
  93. hasChildren = item.children && item.children.length > 0;
  94. var s = '<li class="' + (hasChildren ? 'has-children' : '') + '">'; //class="menu-item" open, expanded?
  95. if ( idx > 0) s += '<a class="menu-sec-title" data-id="' + item.id + '" ';
  96. else s += '<a class="menu-title" data-id="' + item.id + '" ';
  97. // if (item.href) {
  98. // s += 'href="' + item.href + '" target="' + (item.hrefTarget || '') + '"';
  99. // }
  100. s += '>';
  101. s += '<i class="menu-icon fa ' + item.iconCls + '"></i>';
  102. s += '<span class="menu-text">' + item.text + '</span>';
  103. if (hasChildren) {
  104. s += '<span class="menu-arrow fa"></span>';
  105. }
  106. s += '</a>';
  107. if (hasChildren) {
  108. s += me._renderItems(item.children, item);
  109. }
  110. s += '</li>';
  111. return s;
  112. },
  113. getItemByEvent: function (event) {
  114. var el = $(event.target).closest('.menu-title');
  115. var id = el.attr("data-id");
  116. return this.getItemById(id);
  117. },
  118. getSecItemByEvent: function (event) {
  119. var el = $(event.target).closest('.menu-sec-title');
  120. var id = el.attr("data-id");
  121. return this.getItemById(id);
  122. },
  123. getItemById: function (id) {
  124. var me = this,
  125. idHash = me._idHash;
  126. if (!idHash) {
  127. idHash = me._idHash = {};
  128. function each(items) {
  129. for (var i = 0, l = items.length; i < l; i++) {
  130. var item = items[i];
  131. if (item.children) each(item.children);
  132. idHash[item.id] = item;
  133. }
  134. }
  135. each(me.options.data);
  136. }
  137. return me._idHash[id];
  138. }
  139. };