/** * Author: meimeidev */ !function($){ var MMGrid = function (element, options) { this._id = (((1 + Math.random()) * 0x10000) | 0).toString(16); this._loadCount = 0; this.opts = options; this._initLayout($(element)); this._initHead(); this._initOptions(); this._initEvents(); this._setColsWidth(); if(this.opts.fullWidthRows){ this._fullWidthRows(); } //初始化插件 for(var i=0; i< this.opts.plugins.length; i++){ var plugin = this.opts.plugins[i]; plugin.init($.extend(element, this)); } if(options.autoLoad){ var that = this; this.opts = options; setTimeout(function(){ if(options.url){ that.load(); }else{ that.load(options.items); } },0); //chrome style problem } }; //see: http://tanalin.com/en/articles/ie-version-js/ var browser = function(){ var isIE=!!window.ActiveXObject; var isIE10 = isIE && !!window.atob; var isIE9 = isIE && document.addEventListener && !window.atob; var isIE8 = isIE && document.querySelector && !document.addEventListener; var isIE7 = isIE && window.XMLHttpRequest && !document.querySelector; var isIE6 = isIE && !window.XMLHttpRequest; return { isIE: isIE , isIE6: isIE6 , isIE7: isIE7 , isIE8: isIE8 , isIE9: isIE9 , isIE10: isIE10 }; }(); MMGrid.prototype = { _initLayout: function($el){ var opts = this.opts; var $elParent = $el.parent(); var elIndex = $el.index(); var mmGrid = [ '
', '', '
', '
', '
', '
', '
', '
', '', '
', '
', '', '
'+ this.opts.noDataText +'
', '
', '
', '
', '
'+ this.opts.loadingText +'
', '
', '
' ]; //fix in IE7,IE6 if(browser.isIE7 || browser.isIE6){ $el.prop('cellspacing',0); } //cached object var $mmGrid = $(mmGrid.join('')); this.$mmGrid = $mmGrid; this.$style = $mmGrid.find('style'); this.$headWrapper = $mmGrid.find('.mmg-headWrapper'); this.$head = $mmGrid.find('.mmg-head'); this.$backboard = $mmGrid.find('.mmg-backboard'); this.$bodyWrapper = $mmGrid.find('.mmg-bodyWrapper'); this.$body = $el.removeAttr("style").addClass('mmg-body'); this._insertEmptyRow(); this.$body.appendTo(this.$bodyWrapper); //放回原位置 if(elIndex === 0 || $elParent.children().length == 0){ $elParent.prepend(this.$mmGrid); }else{ $elParent.children().eq(elIndex-1).after(this.$mmGrid); } // fix in ie6 if(browser.isIE6 && (!opts.width || opts.width === 'auto')){ $mmGrid.width('100%'); $mmGrid.width($mmGrid.width() - ($mmGrid.outerWidth(true) - $mmGrid.width())); }else{ $mmGrid.width(opts.width); } if(browser.isIE6 && (!opts.height || opts.height === 'auto')){ $mmGrid.height('100%'); $mmGrid.height($mmGrid.height() - ($mmGrid.outerHeight(true) - $mmGrid.height())); }else{ $mmGrid.height(opts.height); } if(opts.checkCol){ var chkHtml = opts.multiSelect ? '' : ''; opts.cols.unshift({title:chkHtml,width: 20, align: 'center' ,lockWidth: true, checkCol: true, renderer:function(){ return ''; }}); } if(opts.indexCol){ opts.cols.unshift({title:'#',width: opts.indexColWidth, align: 'center' ,lockWidth: true, indexCol:true, renderer:function(val,item,rowIndex){ return ''; }}); } } ,_expandCols: function(cols){ var newCols = []; if(!cols){ return newCols; } for(var colIndex=0; colIndex'); titleHtml.push('
'); titleHtml.push(''); if(col.titleHtml){ titleHtml.push(col.titleHtml); }else{ titleHtml.push(col.title); } titleHtml.push('
'); if(!col.lockWidth) titleHtml.push('
'); titleHtml.push('
'); }else{ var displayColsLength = col.cols.length; $.each(col.cols, function(index, item){ if(item.hidden){ displayColsLength--; } }); if(displayColsLength === 0){ col.hidden = true; } titleHtml.push(''); titleHtml.push('
'); titleHtml.push(''); if(col.titleHtml){ titleHtml.push(col.titleHtml); }else{ titleHtml.push(col.title); } titleHtml.push('
'); titleHtml.push('
'); } return titleHtml.join(""); } , _initHead: function(){ var that = this; var opts = this.opts; var $head = this.$head; if(opts.cols){ var theadHtmls = ['']; //获取标题深度 var titleDeep = that._titleDeep(opts.cols); for(var deep=1; deep<= titleDeep; deep++){ var cols = that._colsWithTitleDeep(opts.cols, deep); theadHtmls.push(''); for(var colIndex=0; colIndex< cols.length; colIndex++){ var col = cols[colIndex]; theadHtmls.push(this._titleHtml(col, titleDeep-deep+1)); } theadHtmls.push(''); } theadHtmls.push(''); $head.html(theadHtmls.join('')); } var $ths = this._expandThs(); var expandCols = this._expandCols(opts.cols); $.each($ths,function(index){ if(!expandCols[index].width){ expandCols[index].width = 100; } $.data(this,'col-width',expandCols[index].width); $.data(this,'col',expandCols[index]); }); var $mmGrid = this.$mmGrid; var $headWrapper = this.$headWrapper; var $bodyWrapper = this.$bodyWrapper; if(opts.height !== 'auto'){ $bodyWrapper.height($mmGrid.height() - $headWrapper.outerHeight(true)); } //初始化排序状态 if(opts.sortName){ for(var colIndex=0; colIndex< expandCols.length; colIndex++){ var col = expandCols[colIndex]; if(col.sortName === opts.sortName || col.name === opts.sortName){ var $th= $ths.eq(colIndex); $.data($th.find('.mmg-title')[0],'sortStatus',opts.sortStatus); $th.find('.mmg-sort').addClass('mmg-'+opts.sortStatus); } } } } , _initOptions: function(){ var opts = this.opts; var $mmGrid = this.$mmGrid; var $headWrapper = this.$headWrapper; var $backboard = this.$backboard; $mmGrid.find('a.mmg-btnBackboardDn').css({ 'top': $headWrapper.outerHeight(true) }).slideUp('fast'); var cols = this._leafCols(); if(cols){ var bbHtml = ['

显示列

']; for(var colIndex=0; colIndex'); if(col.title){ bbHtml.push(col.title); }else{ bbHtml.push('未命名'); } bbHtml.push(''); } $backboard.append($(bbHtml.join(''))); } } , _initEvents: function(){ var that = this; var opts = this.opts; var $mmGrid = this.$mmGrid; var $headWrapper = this.$headWrapper; var $head = this.$head; var $bodyWrapper = this.$bodyWrapper; var $body = this.$body; var $backboard = this.$backboard; var $ths = this._expandThs(); var expandCols = this._expandCols(opts.cols); var leafCols = this._leafCols(); //调整浏览器 if(opts.width === 'auto' || opts.height === 'auto' || (typeof opts.width === 'string' && opts.width.indexOf('%') === opts.width.length-1) || typeof opts.height === 'string' && opts.height.indexOf('%') === opts.height.length-1){ $(window).on('resize', function(){ that.resize(); }); } //滚动条事件 $bodyWrapper.on('scroll', function(){ $head.css('left',- $(this).scrollLeft()); }); //向下按钮 var $btnBackboardDn = $mmGrid.find('a.mmg-btnBackboardDn').on('click', function(){ var backboardHeight = $mmGrid.height() - $headWrapper.outerHeight(true); if(opts.height === 'auto'&& opts.backboardMinHeight !== 'auto' && backboardHeight < opts.backboardMinHeight){ backboardHeight = opts.backboardMinHeight; } $backboard.height(backboardHeight); if(opts.height === 'auto'){ $mmGrid.height($headWrapper.outerHeight(true) + $backboard.outerHeight(true)); } $backboard.slideDown(); $btnBackboardDn.slideUp('fast'); that._hideMessage(); }); $body.on('mouseenter', function(){ $btnBackboardDn.slideUp('fast'); }); $mmGrid.on('mouseleave', function(){ $btnBackboardDn.slideUp('fast'); }); $headWrapper.on('mouseenter',function(){ if($backboard.is(':hidden') && opts.showBackboard){ $btnBackboardDn.slideDown('fast'); } }); //向上按钮 $mmGrid.find('a.mmg-btnBackboardUp').on('click', function(){ $backboard.slideUp().queue(function(next){ if(!that.rowsLength() || (that.rowsLength() === 1 && $body.find('tr.emptyRow').length === 1)){ that._showNoData(); } if(opts.height === 'auto'){ $mmGrid.height('auto'); } next(); }); }); //隐藏列 $backboard.on('click', ':checkbox', function(){ var index = $backboard.find('label').index($(this).parent()); //最后一个不隐藏 var last = 1; if(opts.checkCol){ last = last + 1; } if(opts.indexCol){ last = last + 1; } if($backboard.find('label :checked').length < last){ this.checked = true; return; } var col = leafCols[index]; if(this.checked){ col.hidden = false; }else{ col.hidden = true; } var $ths = $head.find('th'); for(var colIndex=$ths.length-1; colIndex>=0; colIndex--){ var $th = $ths.eq(colIndex); var iCol = $th.data('col'); if(iCol.cols){ var hidden = true; var colspan = 0; $.each(iCol.cols,function(index,item){ if(!item.hidden){ hidden = false; colspan++; } }); //IE bug if(colspan !== 0){ $th.prop('colspan',colspan); } iCol.hidden = hidden; } } that._setColsWidth(); $backboard.height($mmGrid.height() - $headWrapper.outerHeight(true)); if(opts.height !== 'auto'){ $bodyWrapper.height($mmGrid.height() - $headWrapper.outerHeight(true)); } $mmGrid.find('a.mmg-btnBackboardDn').css({ 'top': $headWrapper.outerHeight(true) }) }); //排序事件 $head.on('click', '.mmg-title', function(){ var $this = $(this); var $titles = $ths.find('.mmg-title'); //当前列不允许排序 var col =$this.parent().parent().data('col'); if(!col.sortable){ return; } //取得当前列下一个排序状态 var sortStatus = $.data(this, 'sortStatus') === 'asc' ? 'desc' : 'asc'; //清除排序状态 $.each($titles, function(){ $.removeData(this,'sortStatus'); }); $ths.find('.mmg-sort').removeClass('mmg-asc').removeClass('mmg-desc'); //设置当前列排序状态 $.data(this, 'sortStatus', sortStatus); $this.siblings('.mmg-sort').addClass('mmg-'+sortStatus); if(opts.url && opts.remoteSort){ that.load() }else{ that._nativeSorter($.inArray(col, leafCols), sortStatus); that._setStyle(); } }).on('mousedown', '.mmg-colResize', function(e){ //调整列宽 var $resize = $(this); var start = e.pageX; var $colResizePointer = $mmGrid.find('.mmg-colResizePointer') .css('left', e.pageX - $headWrapper.offset().left).show(); var scrollLeft = $head.position().left; var $colResizePointerBefore = $mmGrid.find('.mmg-colResizePointer-before') .css('left', $resize.parent().parent().position().left + scrollLeft).show(); //取消文字选择 document.selection && document.selection.empty && ( document.selection.empty(), 1) || window.getSelection && window.getSelection().removeAllRanges(); document.body.onselectstart = function () { return false; }; $headWrapper.css('-moz-user-select','none'); $mmGrid.on('mousemove', function(e){ $colResizePointer.css('left', e.pageX - $headWrapper.offset().left); }).on('mouseup', function(e){ //改变宽度 var $th = $resize.parent().parent(); var width = $th.width() + e.pageX - start; $.data($th[0], 'col-width', width); that._setColsWidth(); $headWrapper.mouseleave(); }).on('mouseleave',function(){ $mmGrid.off('mouseup').off('mouseleave').off('mousemove'); $colResizePointer.hide(); $colResizePointerBefore.hide(); document.body.onselectstart = function(){ return true;//开启文字选择 }; $headWrapper.css('-moz-user-select','text'); }); }); //选中事件 var $body = this.$body; $body.on('click','td',function(e){ var $this = $(this); var event = jQuery.Event("cellSelected"); event.target = e.target; that.$body.triggerHandler(event, [$.data($this.parent()[0], 'item'), $this.parent().index(), $this.index()]); if(event.isPropagationStopped()){ return; } if(!$this.parent().hasClass('selected')){ that.select($this.parent().index()); }else{ that.deselect($this.parent().index()); } }); $body.on('click','tr > td .mmg-check',function(e){ e.stopPropagation(); var $this = $(this); if(this.checked){ that.select($($this.parents('tr')[0]).index()); }else{ that.deselect($($this.parents('tr')[0]).index()); } }); //checkbox列 if(opts.checkCol){ $head.find('th .checkAll').on('click', function(){ if(this.checked){ that.select('all'); }else{ that.deselect('all'); } }); } //IE6不支持hover if (browser.isIE6){ $body.on('mouseenter','tr', function () { $(this).toggleClass('hover'); }).on('mouseleave','tr', function () { $(this).toggleClass('hover'); }); }; } , _rowHtml: function(item, rowIndex){ var opts = this.opts; var expandCols = this._expandCols(opts.cols); var leafCols = this._leafCols(); if($.isPlainObject(item)){ var trHtml = []; trHtml.push(''); for(var colIndex=0; colIndex < leafCols.length; colIndex++){ var col = leafCols[colIndex]; trHtml.push(''); if(col.renderer){ trHtml.push(col.renderer(item[col.name],item,rowIndex)); }else{ trHtml.push(item[col.name]); } trHtml.push(''); }; trHtml.push(''); return trHtml.join(''); } } , _populate: function(items){ var opts = this.opts; var $body = this.$body; this._hideMessage(); if(items && items.length !== 0 && opts.cols){ var tbodyHtmls = []; tbodyHtmls.push(''); for(var rowIndex=0; rowIndex < items.length; rowIndex++){ var item = items[rowIndex]; tbodyHtmls.push(this._rowHtml(item, rowIndex)); } tbodyHtmls.push(''); $body.empty().html(tbodyHtmls.join('')); var $trs = $body.find('tr'); for(var rowIndex=0; rowIndex < items.length; rowIndex++){ $.data($trs.eq(rowIndex)[0],'item',items[rowIndex]); } }else{ this._insertEmptyRow(); this._showNoData(); } this._setStyle(); if(opts.fullWidthRows && this._loadCount <= 1){ this._fullWidthRows(); } } , _insertEmptyRow: function(){ var $body = this.$body; $body.empty().html(' '); } , _removeEmptyRow: function(){ var $body = this.$body; $body.find('tr.emptyRow').remove(); } /* 生成列类 */ , _genColClass: function(colIndex){ return 'mmg'+ this._id +'-col'+colIndex; } , _setStyle: function(){ var $head = this.$head; var $ths = this._expandThs(); var $body = this.$body; var leafCol = this._leafCols(); //head $ths.eq(0).addClass('first'); $ths.eq(-1).addClass('last'); //body $body.find('tr,td').removeClass('even') .removeClass('colSelected').removeClass('colSelectedEven'); $body.find('tr:odd').addClass('even'); var sortIndex = $.inArray($head.find('.mmg-title').filter(function(){ return $.data(this,'sortStatus') === 'asc' || $(this).data('sortStatus') === 'desc'; }).parent().parent().data('col'), leafCol); $body.find('tr > td:nth-child('+(sortIndex+1)+')').addClass('colSelected') .filter(':odd').addClass('colSelectedEven'); this._resizeHeight(); } , _setColsWidth: function(){ var opts = this.opts; var $style = this.$style; var $head = this.$head; var $bodyWrapper = this.$bodyWrapper; var $body = this.$body; var $ths = this._expandThs(); var expandCols = this._expandCols(opts.cols); var scrollTop = $bodyWrapper.scrollTop(); var scrollLeft = $head.position().left; $bodyWrapper.width(9999); $body.width('auto'); var styleText = []; for(var colIndex=0; colIndex<$ths.length; colIndex++){ var $th = $ths.eq(colIndex); styleText.push('.mmGrid .'+this._genColClass(colIndex) + ' {'); var width = $.data($th[0],'col-width'); styleText.push('width: '+ width +'px;'); styleText.push('max-width: '+ width +'px;'); var col = expandCols[colIndex]; if(col.align){ styleText.push('text-align: '+col.align+';'); } if(col.hidden){ styleText.push('display: none; '); } styleText.push(' }'); } $body.detach(); try{ $style.text(styleText.join('')); }catch(error){ $style[0].styleSheet.cssText = styleText.join('');//IE fix } $body.width($head.width()-2); $bodyWrapper.width('100%'); $bodyWrapper.append($body); //调整滚动条 $bodyWrapper.scrollLeft(-scrollLeft); if($bodyWrapper.scrollLeft() === 0){ $head.css('left', 0); } $bodyWrapper.scrollTop(scrollTop); } , _fullWidthRows: function(){ var opts = this.opts; var $bodyWrapper = this.$bodyWrapper; var $mmGrid = this.$mmGrid; var $head = this.$head; var scrollWidth = $bodyWrapper.width() - $bodyWrapper[0].clientWidth; if(scrollWidth && browser.isIE){ scrollWidth = scrollWidth + 1; } var fitWidth = $mmGrid.width() - $head.width() - scrollWidth; if(fitWidth < -20){ return; } var thsArr = []; var $ths = this._leafThs(); var leafCol = this._leafCols(); for(var i=0; i< leafCol.length; i++){ var col = leafCol[i]; var $th = $ths.eq(i); if(!col.lockWidth && $th.is(':visible')){ thsArr.push($th); } } var increaseWidth = Math.floor(fitWidth / thsArr.length); var maxColWidthIndex = 0; for(var i=0; i< thsArr.length; i++){ var $th = thsArr[i]; var colWidth = $.data($th[0], 'col-width') + increaseWidth; $.data($th[0], 'col-width', colWidth); var maxColWidth = $.data(thsArr[maxColWidthIndex][0], 'col-width'); if(maxColWidth < colWidth){ maxColWidthIndex = i; } } var remainWidth = fitWidth - increaseWidth * thsArr.length; var maxColWidth = $.data(thsArr[maxColWidthIndex][0], 'col-width'); $.data(thsArr[maxColWidthIndex][0], 'col-width', maxColWidth + remainWidth); this._setColsWidth(); } , _showLoading: function(){ var $mmGrid = this.$mmGrid; $mmGrid.find('.mmg-mask').show(); var $loading = $mmGrid.find('.mmg-loading'); $loading.css({ 'left': ($mmGrid.width() - $loading.width()) / 2, 'top': ($mmGrid.height() - $loading.height()) / 2 }).show(); } , _hideLoading: function(){ var $mmGrid = this.$mmGrid; $mmGrid.find('.mmg-mask').hide(); $mmGrid.find('.mmg-loading').hide(); } , _showNoData: function(){ this._showMessage(this.opts.noDataText); } , _showLoadError: function(){ this._showMessage(this.opts.loadErrorText); } , _showMessage: function(msg){ var $mmGrid = this.$mmGrid; var $headWrapper = this.$headWrapper; var $message = $mmGrid.find('.mmg-message'); $message.css({ 'left': ($mmGrid.width() - $message.width()) / 2, 'top': ($mmGrid.height() + $headWrapper.height() - $message.height()) / 2 }).text(msg).show(); } , _hideMessage: function(){ var $mmGrid = this.$mmGrid; $mmGrid.find('.mmg-message').hide(); } , _nativeSorter: function(colIndex, sortStatus){ var leafCols = this._leafCols(); var col = leafCols[colIndex]; this.$body.find('tr > td:nth-child('+(colIndex+1)+')') .sortElements(function(a, b){ var av = $.text($(a)); var bv = $.text($(b)); //排序前转换 if(col.type === 'number'){ av = parseFloat(av); bv = parseFloat(bv); }else{ //各个浏览器localeCompare的结果不一致 return sortStatus === 'desc' ? -av.localeCompare(bv) : av.localeCompare(bv); } return av > bv ? (sortStatus === 'desc' ? -1 : 1) : (sortStatus === 'desc' ? 1 : -1); }, function(){ return this.parentNode; }); } , _refreshSortStatus: function(){ var $ths = this.$head.find('th'); var sortColIndex = -1; var sortStatus = ''; $ths.find('.mmg-title').each(function(index, item){ var status = $.data(item, 'sortStatus'); if(status){ sortColIndex = index; sortStatus = status; } }); var sortStatus = sortStatus === 'desc' ? 'asc' : 'desc'; if(sortColIndex >=0){ $ths.eq(sortColIndex).find('.mmg-title').data('sortStatus',sortStatus).click(); } } , _loadAjax: function(args){ var that = this; var opts = this.opts; var params = {}; //opt的params可以使函数,例如收集过滤的参数 if($.isFunction(opts.params)){ var p = opts.params(); if(!p){ return; } params = $.extend(params, p); }else if($.isPlainObject(opts.params)){ //modify by gzshangtao if(args){ opts.params = $.extend(params, args); } params = $.extend(params, opts.params); } if(opts.remoteSort){ var sortName = ''; var sortStatus = ''; var $titles = this.$head.find('.mmg-title'); for(var colIndex=0; colIndex<$titles.length; colIndex++){ var status = $.data($titles[colIndex], 'sortStatus'); if(status){ var col = $titles.eq(colIndex).parent().parent().data('col'); sortName = col.sortName ? col.sortName : col.name; sortStatus = status; } } if(sortName){ params.sort = sortName+'.'+sortStatus; } } //插件参数合并 var pluginParams = {}; for(var i=0; i< this.opts.plugins.length; i++){ var plugin = this.opts.plugins[i]; $.extend(pluginParams, plugin.params()); } params = $.extend(params, pluginParams); //合并load的参数 params = $.extend(params, args); that._showLoading(); $.ajax({ type: opts.method, url: opts.url, data: params, dataType: 'json', cache: opts.cache }).done(function(data){ try{ //获得root对象 var items = data; if($.isArray(data[opts.root])){ items = data[opts.root]; } that._populate(items); that._hideLoading(); if(!opts.remoteSort){ that._refreshSortStatus(); } if(data && $.isArray(data[opts.root])){ data = $.extend(args, data); } that.$body.triggerHandler('loadSuccess', data); }catch(e){ that._hideLoading(); that._showLoadError(); throw e; } }).fail(function(data){ that._hideLoading(); that._showLoadError(); that.$body.triggerHandler('loadError', data); }); } , _loadNative: function(args){ this._populate(args); this._refreshSortStatus(); this.$body.triggerHandler('loadSuccess', args); } , load: function(args){ try{ var modify = 'gzshangtao'; var opts = this.opts; this._hideMessage(); this._loadCount = this._loadCount + 1 ; if($.isArray(args)){ //加载本地数据 this._loadNative(args); }else if(opts.url){ this._loadAjax(args); }else if(opts.items){ this._loadNative(opts.items); }else{ this._loadNative([]); } }catch(e){ this._showLoadError(); throw e; } } //重设尺寸--modify by gzshangtao , resize: function(_opts){ if(_opts && _opts.width)this.opts.width = _opts.width; if(_opts && _opts.height)this.opts.height = _opts.height; var opts = this.opts; var $mmGrid = this.$mmGrid; var $headWrapper = this.$headWrapper; var $bodyWrapper = this.$bodyWrapper; // fix in ie6 if(browser.isIE6 && (!opts.width || opts.width === 'auto')){ $mmGrid.width('100%'); $mmGrid.width($mmGrid.width() - ($mmGrid.outerWidth(true) - $mmGrid.width())); }else{ $mmGrid.width(opts.width); } if(opts.height !== 'auto'){ if(browser.isIE6 && (!opts.height || opts.height === 'auto')){ $mmGrid.height('100%'); $mmGrid.height($mmGrid.height() - ($mmGrid.outerHeight(true) - $mmGrid.height())); }else{ $mmGrid.height(opts.height); } $bodyWrapper.height($mmGrid.height() - $headWrapper.outerHeight(true)); } //调整message var $message = $mmGrid.find('.mmg-message'); if($message.is(':visible')){ $message.css({ 'left': ($mmGrid.width() - $message.width()) / 2, 'top': ($mmGrid.height() + $headWrapper.height() - $message.height()) / 2 }); } //调整loading var $mask = $mmGrid.find('.mmg-mask'); if($mask.is(':visible')){ $mask.width($mmGrid.width()).height($mmGrid.height()); var $loadingWrapper = $mmGrid.find('.mmg-loading'); $loadingWrapper.css({ 'left': ($mmGrid.width() - $loadingWrapper.width()) / 2, 'top': ($mmGrid.height() - $loadingWrapper.height()) / 2 }) } $bodyWrapper.trigger('scroll'); this._resizeHeight(); } , _resizeHeight: function(){ var opts = this.opts; var $bodyWrapper = this.$bodyWrapper; var $body= this.$body; if(opts.height === 'auto' && browser.isIE7){ $bodyWrapper.height('auto'); if($bodyWrapper.width() < $body.width()){ $bodyWrapper.height($bodyWrapper.height() + $bodyWrapper.height() - $bodyWrapper[0].clientHeight + 1); } } } //选中 , select: function(args){ var opts = this.opts; var $body = this.$body; var $head = this.$head; if(typeof args === 'number'){ var $tr = $body.find('tr').eq(args); if(!opts.multiSelect){ $body.find('tr.selected').removeClass('selected'); if(opts.checkCol){ $body.find('tr > td').find('.mmg-check').prop('checked',''); } } if(!$tr.hasClass('selected')){ $tr.addClass('selected'); if(opts.checkCol){ $tr.find('td .mmg-check').prop('checked','checked'); } } }else if(typeof args === 'function'){ $.each($body.find('tr'), function(index){ if(args($.data(this, 'item'), index)){ var $this = $(this); if(!$this.hasClass('selected')){ $this.addClass('selected'); if(opts.checkCol){ $this.find('td .mmg-check').prop('checked','checked'); } } } }); }else if(args === undefined || (typeof args === 'string' && args === 'all')){ $body.find('tr.selected').removeClass('selected'); $body.find('tr').addClass('selected'); $body.find('tr > td').find('.mmg-check').prop('checked','checked'); }else{ return; } if(opts.checkCol){ var $checks = $body.find('tr > td').find('.mmg-check'); if($checks.length === $checks.filter(':checked').length){ $head.find('th .checkAll').prop('checked','checked'); } } } //取消选中 , deselect: function(args){ var opts = this.opts; var $body = this.$body; var $head = this.$head; if(typeof args === 'number'){ $body.find('tr').eq(args).removeClass('selected'); if(opts.checkCol){ $body.find('tr').eq(args).find('td .mmg-check').prop('checked',''); } }else if(typeof args === 'function'){ $.each($body.find('tr'), function(index){ if(args($.data(this, 'item'), index)){ $(this).removeClass('selected'); if(opts.checkCol){ $(this).find('td .mmg-check').prop('checked',''); } } }); }else if(args === undefined || (typeof args === 'string' && args === 'all')){ $body.find('tr.selected').removeClass('selected'); if(opts.checkCol){ $body.find('tr > td').find('.mmg-check').prop('checked',''); } }else{ return; } $head.find('th .checkAll').prop('checked',''); } , selectedRows: function(){ var $body = this.$body; var selected = []; $.each($body.find('tr.selected'), function(index ,item){ selected.push($.data(this,'item')); }); return selected; } , selectedRowsIndex: function(){ var $body = this.$body; var $trs = this.$body.find('tr') var selected = []; $.each($body.find('tr.selected'), function(index){ selected.push($trs.index(this)); }); return selected; } , rows: function(){ var $body = this.$body; var items = []; $.each($body.find('tr'), function(){ items.push($.data(this,'item')); }); return items; } , row: function(index){ var $body = this.$body; if(index !== undefined && index >= 0){ var $tr = $body.find('tr').eq(index); if($tr.length !== 0){ return $.data($tr[0],'item'); } } } , rowsLength: function(){ var $body = this.$body; var length = $body.find('tr').length; if(length === 1 && $body.find('tr.emptyRow').length === 1){ return 0; } return length; } //添加数据,第一个参数可以为数组 , addRow: function(item, index){ var $tbody = this.$body.find('tbody'); if($.isArray(item)){ for(var i=item.length-1; i >= 0; i--){ this.addRow(item[i], index); } return ; } if(!$.isPlainObject(item)){ return ; } this._hideMessage(); this._removeEmptyRow(); var $tr; if(index === undefined || index < 0){ $tr = $(this._rowHtml(item, this.rowsLength())); $tbody.append($tr); }else{ $tr = $(this._rowHtml(item, index)); if(index === 0){ $tbody.prepend($tr); }else{ var $before = $tbody.find('tr').eq(index-1); //找不到就插到最后 if($before.length === 0){ $tbody.append($tr); }else{ $before.after($($tr)); } } } $tr.data('item', item); this._setStyle(); this.$body.triggerHandler('rowInserted', [item, index]); } //更新行内容,两个参数都必填 , updateRow: function(item, index){ var opts = this.opts; var $tbody = this.$body.find('tbody'); if(!$.isPlainObject(item)){ return ; } var oldItem = this.row(index); var $tr = $tbody.find('tr').eq(index); var checked = $tr.find('td:first :checkbox').is(':checked'); $tr.html(this._rowHtml(item, index).slice(4,-5)); if(opts.checkCol){ $tr.find('td:first :checkbox').prop('checked',checked); } $tr.data('item', item); this._setStyle(); this.$body.triggerHandler('rowUpdated', [oldItem, item, index]); } //删除行,参数可以为索引数组 , removeRow: function(index){ var that = this; var $tbody = that.$body.find('tbody'); if($.isArray(index)){ for(var i=index.length-1; i >= 0; i--){ that.removeRow(index[i]); } return ; } if(index === undefined){ var $trs = $tbody.find('tr'); for(var i=$trs.length-1; i >= 0; i--){ that.removeRow(i); } }else{ var item = that.row(index); $tbody.find('tr').eq(index).remove(); this.$body.triggerHandler('rowRemoved', [item, index]); } this._setStyle(); if(this.rowsLength() === 0){ this._showNoData(); this._insertEmptyRow(); } } }; $.fn.mmGrid = function(){ if(arguments.length === 0 || typeof arguments[0] === 'object'){ var option = arguments[0] , data = this.data('mmGrid') , options = $.extend(true, {}, $.fn.mmGrid.defaults, option); if (!data) { data = new MMGrid(this, options); this.data('mmGrid', data); } return $.extend(true, this, data); } if(typeof arguments[0] === 'string'){ var data = this.data('mmGrid'); var fn = data[arguments[0]]; if(fn){ var args = Array.prototype.slice.call(arguments); return fn.apply(data,args.slice(1)); } } }; $.fn.mmGrid.defaults = { width: 'auto' , height: '280px' , cols: [] , url: false , params: {} , method: 'POST' , cache: false , root: 'items' , items: [] , autoLoad: true , remoteSort: false , sortName: '' , sortStatus: 'asc' , loadingText: '正在载入...' , noDataText: '没有数据' , loadErrorText: '数据加载出现异常' , multiSelect: false , checkCol: false , indexCol: false , indexColWidth: 40 , fullWidthRows: false , nowrap: false , showBackboard: true , backboardMinHeight: 125 , plugins: [] //插件 插件必须实现 init($mmGrid)和params()方法,参考mmPaginator }; // event : loadSuccess(e,data), loadError(e, data), cellSelected(e, item, rowIndex, colIndex) // rowInserted(e,item, rowIndex), rowUpdated(e, oldItem, newItem, rowIndex), rowRemoved(e,item, rowIndex) // $.fn.mmGrid.Constructor = MMGrid; // see: http://james.padolsey.com/javascript/sorting-elements-with-jquery/ $.fn.sortElements = (function(){ var sort = [].sort; return function(comparator, getSortable) { getSortable = getSortable || function(){return this;}; var placements = this.map(function(){ var sortElement = getSortable.call(this), parentNode = sortElement.parentNode, nextSibling = parentNode.insertBefore( document.createTextNode(''), sortElement.nextSibling ); return function() { if (parentNode === this) { throw new Error( "You can't sort elements if any one is a descendant of another." ); } parentNode.insertBefore(this, nextSibling); parentNode.removeChild(nextSibling); }; }); return sort.call(this, comparator).each(function(i){ placements[i].call(getSortable.call(this)); }); }; })(); }(window.jQuery); !function($){ var MMPaginator = function(element, options){ this.$el = $(element); this.opts = options; }; MMPaginator.prototype = { _initLayout: function(){ var that = this; var $el = this.$el; var opts = this.opts; $el.addClass("mmPaginator"); var pgHtmls = [ '
', '', '
' ]; $el.append($(pgHtmls.join(''))); this.$totalCountLabel = $el.find('.totalCountLabel'); this.$pageList = $el.find('.pageList'); this.$limitList = $el.find('.limit select'); var $limitList = this.$limitList $.each(opts.limitList, function(){ var $option = $('') .prop('value',this) .text(that.formatString(opts.limitLabel,[this])); $limitList.append($option); }); $limitList.on('change', function(){ $el.data('page', 1); that.$mmGrid.load(); }); } , _plain: function(page, totalCount, limit){ var that = this; var $el = this.$el; var $pageList = this.$pageList; var totalPage = totalCount % limit === 0 ? parseInt(totalCount/limit) : parseInt(totalCount/limit) + 1; totalPage = totalPage ? totalPage : 0; if(totalPage === 0){ page = 1; }else if(page > totalPage){ page = totalPage; }else if(page < 1 && totalPage != 0){ page = 1; } // var $prev = $(''); if(page<=1){ $prev.addClass('disable'); }else{ $prev.find('a').on('click', function(){ $el.data('page', page-1); that.$mmGrid.load(); }); } $pageList.append($prev); ///// var list = [1]; if(page > 4 ){ list.push('...'); } for(var i= 0; i < 5; i++){ var no = page - 2 + i; if(no > 1 && no <= totalPage-1){ list.push(no); } } if(page+1 < totalPage-1){ list.push('...'); } if(totalPage>1){ list.push(totalPage); } $.each(list, function(index, item){ var $li = $('
  • '); if(item === '...'){ $li.addClass('').html('...'); }else if(item === page){ $li.addClass('active').find('a').text(item); }else{ $li.find('a').text(item).prop('title','第'+item+'页').on('click', function(e){ $el.data('page', item); that.$mmGrid.load(); }); } $pageList.append($li); }); // var $next = $(''); if(page>=totalPage){ $next.addClass('disable'); }else{ $next.find('a').on('click', function(){ $el.data('page', page+1); that.$mmGrid.load(); }); } $pageList.append($next); } , _search: function(page, totalCount, limit){ } , load: function(params){ var $el = this.$el; var $limitList = this.$limitList; var opts = this.opts; if(!params){ params = {}; } var page = params[opts.pageParamName]; if(page === undefined || page === null){ page = $el.data('page'); } $el.data('page', page); var totalCount = params[opts.totalCountName]; if(totalCount === undefined){ totalCount = 0; } $el.data('totalCount', totalCount); var limit = params[opts.limitParamName]; if(!limit){ limit = $limitList.val(); } this.$limitList.val(limit); this.$totalCountLabel.html(this.formatString(opts.totalCountLabel,[totalCount])); this.$pageList.empty(); this._plain(page, totalCount, this.$limitList.val()); } , formatString: function(text, args){ return text.replace(/{(\d+)}/g, function(match, number) { return typeof args[number] != 'undefined' ? args[number] : match ; }); } , params: function(){ var opts = this.opts; var $el = this.$el; var $limitList = this.$limitList; var params = {}; params[opts.pageParamName] = $el.data('page'); params[opts.limitParamName] = $limitList.val(); return params; } , init: function($grid){ var that = this; var opts = that.opts; this.$mmGrid = $grid; this._initLayout(); this.$mmGrid.on('loadSuccess', function(e, data){ that.load(data); }); var params = {}; params[opts.totalCountName] = 0; params[opts.pageParamName] = opts.page; params[opts.limitParamName] = opts.limit; this.load(params); if($grid.opts.indexCol){ var indexCol = $grid.opts.cols[0]; indexCol.renderer = function(val,item,rowIndex){ var params = that.params(); return ''; }; } } }; $.fn.mmPaginator = function(){ if(arguments.length === 0 || typeof arguments[0] === 'object'){ var option = arguments[0] , data = this.data('mmPaginator') , options = $.extend(true, {}, $.fn.mmPaginator.defaults, option); if (!data) { data = new MMPaginator(this[0], options); this.data('mmPaginator', data); } return $.extend(true, this, data); } if(typeof arguments[0] === 'string'){ var data = this.data('mmPaginator'); var fn = data[arguments[0]]; if(fn){ var args = Array.prototype.slice.call(arguments); return fn.apply(data,args.slice(1)); } } }; $.fn.mmPaginator.defaults = { style: 'plain' , totalCountName: 'totalCount' , page: 1 , pageParamName: 'page' , limitParamName: 'limit' , limitLabel: '每页{0}条' , totalCountLabel: '共{0}条记录' , limit: undefined , limitList: [20, 30, 40, 50] }; $.fn.mmPaginator.Constructor = MMPaginator; }(window.jQuery);