(function(window, $, undefined) { $.fn.sidebar = function(options) { var defaults = { menuoverevent: 'mouseover', menuleaveevent: 'mouseleave', foldevent: 'click', menuThumbnailSelector: ".menu-thumbnail", menumeta: ['flow', 'account', 'common', 'recent'], //menudata中数据顺序必须和menudata顺序保持一致 menudata: [{ menu: 'flow', title: '业务流程管理', content: [ '货前管理', '货中管理', '货后管理', '其他' ] }, { menu: 'account', title: '核算', content: [ '还款计算排定', '逾期呆滞利息计算', '财务核算' ] }, { menu: 'common', title: '常用', content: [ '合同', '合作商', '风险分类', '交易流水', '账务流水', '抵制押贷款' ] }, { menu: 'recent', title: '最近访问', content: [ '合同', '合作商', '财务核算' ] }] }; settings = $.extend({}, defaults, options); return this.each(function() { return new Sidebar(this, settings); }); }; function Sidebar(el, settings) { this.$el = $(el); this.settings = settings; this.$menulist = this.$el.find('.menu'); this.$thumbnailBox = this.$el.find(settings.menuThumbnailSelector); this.init(); } Sidebar.prototype = { init: function() { this.createView(); this.attachEvents(); }, createView:function () { var index=this.settings.menumeta.indexOf('common'); var data=this.settings.menudata[index]; var $commonBox=this.$el.find('.common'); var $title=$('<h3>'+data.title+'</h3>'); var $lists=$('<ul>'); $.each(data.content,function (index,val) { $lists.append($('<li><a href=""><i></i>' + val + '</a></li>')); }); $commonBox.append($title).append($lists); }, attachEvents: function() { var _self = this; _self.$menulist.on('show', $.proxy(_self.showMenu,_self)); _self.$menulist.on('hide', $.proxy(_self.hideMenu,_self)); _self.$menulist.on(_self.settings.menuoverevent, function() { _self.$menulist.trigger('show',this); }); _self.$menulist.on(_self.settings.menuleaveevent, function(e) { if (checkPointerInDiv(e, _self.$thumbnailBox[0])) { $(this).addClass('on'); return; } _self.$menulist.trigger('hide',this); }); _self.$thumbnailBox.on(_self.settings.menuleaveevent, function(e) { _self.$menulist.trigger('hide',this); }); }, createMenu: function(eventElem) { var menuIndex = this.settings.menumeta.indexOf($(eventElem).data('menu')); var menuData = this.settings.menudata[menuIndex]; var $box = $('<div class=' + menuData.menu + '></div'); var $title = $('<h3>' + menuData.title + '</h3>'); var $lists = $('<ul>'); $.each(menuData.content, function(index, val) { $lists.append($('<li><i></i>' + val + '</li>')); }); if ($(eventElem).hasClass('menu-thumb')) { $box.append($title); } $box.append($lists); this.$thumbnailBox.html(''); this.$thumbnailBox.append($box).css({ left: this.$el.width(), top: $(eventElem).offset().top }); }, showMenu: function(e, eventElem) { this.createMenu(eventElem); this.$thumbnailBox.show(); }, hideMenu: function(e, eventElem) { this.$menulist.removeClass('on'); this.$thumbnailBox.hide(); } }; function checkPointerInDiv(event, elem) { var _posX = event.clientX, _posY = event.clinetY; var elemX1 = elem.offsetLeft, elemY1 = elem.offsetTop; var elemX2 = elemX1 + elem.offsetWidth, elemY2 = elemY1 + elem.offsetHeight; if (_posX < elemX1 || _posX > elemX2 || _posY < elemY1 || _posY > elemY2) { return false; } return true; } }(window, jQuery));