2025-05-25

很早以前寫過一個Jquery分頁組件,但是當時寫的組件有個缺點,當時的JS插件是這樣設計的:比如:點擊  –>  查詢按鈕 —> 發ajax請求 返回總頁數和所有數據,然後拿到總頁數去調用我分頁代碼,去計算共多少頁及顯示頁碼按鈕,然後在回調成功後,再接著發Ajax請求,把所有的數據請求回來。這樣就有一個缺點,每次點擊查詢按鈕後 會連續發2個AJAX請求,對我們前端性能肯定不友好。所以今天晚上對他們重新封裝瞭下,當然以前的邏輯沒有變,隻是多加瞭一個配置項及幾行代碼,初始化的時候換瞭一種方式初始化。如下JSFiddle:

 

 JSFiddle地址如下:點擊頁碼,然後使用火狐或者谷歌控制臺查看我打印的數據,嘿嘿!

 

 配置參數如下:

   container

'',   頁碼容器 默認為空 必填

 perPage 10,     一頁多少條數據 默認情況下10條數據

 curIndex 1,      當前的索引 從第幾開始 默認從第一頁開始

 itemCount '' ,   記錄總數 默認為空 必填 開發需要返回的

 totalPages 0,     共多少頁 需要開發返回總數進行計算的

 buttonAmount 10,     每頁顯示按鈕的數量

 isAutoClick true,     上一頁 下一頁是否封裝在裡面作為點擊 默認為true       新增的參數。

 所有的JS代碼如下:

 

復制代碼

      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 += '<p 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 += "</p>";

 

            // 把分頁放到容器裡面 

            $(_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事件 做其他的事情,如下:

 

復制代碼

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);

            });

        }

});

復制代碼

第二種方式 優點:點擊查詢按鈕後 隻發一次請求 請求成功後 初始化分頁代碼, 再接著寫點擊某一頁的代碼,因為還沒有點擊 所以一開始時候隻請求一次。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *