JS重構分頁javascript
很早之前寫過一個Jquery分頁組件,可是當時寫的組件有個缺點,當時的JS插件是這樣設計的:好比:點擊 --> 查詢按鈕 ---> 發ajax請求 返回總頁數和全部數據,而後拿到總頁數去調用我分頁代碼,去計算共多少頁及顯示頁碼按鈕,而後在回調成功後,再接着發Ajax請求,把全部的數據請求回來。這樣就有一個缺點,每次點擊查詢按鈕後 會連續發2個AJAX請求,對咱們前端性能確定不友好。因此今天晚上對他們從新封裝了下,固然之前的邏輯沒有變,只是多加了一個配置項及幾行代碼,初始化的時候換了一種方式初始化。以下JSFiddle:html
JSFiddle地址以下:點擊頁碼,而後使用火狐或者谷歌控制檯查看我打印的數據,嘿嘿!前端
配置參數以下:java
全部的JS代碼以下:ajax
function Pagination(){ this.config = { container : '', // 頁碼容器 perPage : 10, // 一頁多少條數據 默認狀況下10條數據 curIndex : 1, // 當前的索引 從第幾開始 itemCount : 100, // 記錄總數 默認設爲100條 totalPages : 0, // 總頁數 buttonAmount : 10, // 每頁顯示按鈕的數量 isAutoClick : true // 上一頁 下一頁是否封裝在裏面做爲點擊 默認爲true }; }; Pagination.prototype = { constructor:Pagination, init: function(customConfig,callback){ this.config = $.extend(this.config, customConfig || {}); var _self = this, _config = _self.config; _self._query(callback); return this; }, _query: function(callback){ var _self = this, _config = _self.config; var start, end, html = '', str = ''; _self._calculate(); start = Math.max(1,_config.curIndex - parseInt(_config.buttonAmount/2)); end = Math.min(_config.totalPages,start + _config.buttonAmount - 1); str += '<div class="PagerView">'; // 若是總頁數大於1的話 if(_config.totalPages > 1) { if(_config.curIndex != 1) { str += '<a href="javascript://1"><span>|<</span></a>'; str += '<a href="javascript://' + (_config.curIndex-1) + '"><span><<</span></a>'; }else { str += '<span>|<</span>'; str += '<span><<</span>'; } } for(var i = start; i <= end; i+=1) { if(i == _config.curIndex) { str += '<span class="on">' + i + "</span>"; }else { str += '<a href="javascript://' + i + '"><span>' + i + "</span></a>"; } } if(_config.totalPages > 1){ if(_config.curIndex != _config.totalPages){ str += '<a href="javascript://' + (_config.curIndex+1) + '"><span>>></span></a>'; str += '<a href="javascript://' + _config.totalPages + '"><span>>|</span></a>'; }else{ str += '<span>>></span>'; str += '<span>>|</span>'; } } str += ' 一共' + _config.totalPages + '頁, ' + _config.itemCount + '條記錄 '; str += "</div>"; // 把分頁放到容器裏面 $(_config.container).html(str); if(_config.isAutoClick){ //點擊某一項分頁的時候 var a_list = $(_config.container + ' a'); for(var i=0; i<a_list.length; i++){ a_list[i].onclick = function(){ var index = $(this).attr('href'); if(index != undefined && index != ''){ index = parseInt(index.replace('javascript://', '')); _self.click(index,callback); } }; } } return this; }, _getSelectValue: function(select){ var idx = select.selectedIndex, //獲取選中的索引 option, value; if(idx > -1) { option = select.options[idx]; //獲取選中的option元素 console.log(option); value = option.attributes.value; return (value && value.specified) ? option.value : option.text; } return null; }, click: function(index,callback) { var _self = this, _config = _self.config; _config.curIndex = index; _self._query(callback); callback && $.isFunction(callback) && callback(_config); return this; }, /** * 在顯示以前計算各類頁碼變量的值. */ _calculate: function(){ var _self = this, _config = _self.config; // 計算總頁數 = parseInt(Math.ceil(記錄總數/每頁多少條數據),10) _config.totalPages = parseInt(Math.ceil(_config.itemCount/_config.perPage),10); _self.curIndex = parseInt(_self.curIndex,10); if(_self.curIndex > _config.totalPages) { _self.curIndex = _config.totalPages; } } };
調用的方式以下:前端性能
1. 第一種仍是原來的初始化方式:也就是 isAutoClick參數默認爲true 全部的點擊在分頁代碼內部作了處理,缺點:每次點擊查詢按鈕後 會連續發2次ajax請求。sAutoClick性能
var pager = new Pagination().init({ container: '#pager' },function(cfg){ console.log(cfg); });
2. 第二種初始化方式 是剛剛新增的,傳參isAutoClick false 而後實例化後 接着在外部調用click事件 作其餘的事情,以下:this
var pager = new Pagination().init({ container: '#pager', isAutoClick: false }); //點擊某一項分頁的時候 $("#pager").delegate('a','click',function(){ var curIndex = $(this).attr('href'); if(curIndex != undefined && curIndex != ''){ curIndex = parseInt(curIndex.replace('javascript://', '')); pager.click(curIndex,function(cfg){ console.log(cfg); }); } });
第二種方式 優勢:點擊查詢按鈕後 只發一次請求 請求成功後 初始化分頁代碼, 再接着寫點擊某一頁的代碼,由於尚未點擊 因此一開始時候只請求一次。spa
DEMO下載.net