pagination分页插件

最近做了个项目,有用到分页, 这类插件应该是很常用的, 虽然网上很多现成的分页插件, 但是还是想着自己写一个, 给自己积累点东西, 顺便练练手, 写了差不多3个小时左右, 代码如下:

 

代码:

  1 <!DOCTYPE HTML>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>分页插件</title>
  6     <style type="text/css">
  7         body{padding: 0px; margin: 0px;}
  8         .content{width: 980px; margin: 0 auto; padding-top: 50px;}        
  9         ul{margin:0px; padding:0px;}
 10         ul li{margin:0px; padding:0px; list-style:none; float:left;}
 11     </style>
 12 </head>
 13 <body>
 14     <div class="content">
 15         <p>当前页: <input type="text" id="txtPageIndex" /></p>
 16         <p>总页数: <input type="text" id="txtPageCount" /></p>
 17         <p><button id="btnSubmit">submit</button></p>
 18         <br />
 19         <br />
 20         
 21         <p>输出:</p>
 22         <div id="pageBox">
 23         
 24         </div>
 25     </div>
 26 
 27 <script type="text/javascript">
 28     function byID(id){
 29         return document.getElementById(id);
 30     }
 31     
 32     var ui = {};
 33         ui.btnSubmit = byID('btnSubmit');
 34         ui.txtPageIndex = byID('txtPageIndex');
 35         ui.txtPageCount = byID('txtPageCount');
 36         ui.pageBox = byID('pageBox');
 37     
 38     ui.btnSubmit.onclick = function(){
 39         var pageIndex = ui.txtPageIndex.value;
 40         var pageCount = ui.txtPageCount.value;
 41         
 42         var options = {
 43             pageIndex: parseInt(pageIndex),
 44             pageCount: parseInt(pageCount),
 45             container: ui.pageBox
 46         };
 47         
 48         if(options.pageCount > 0){
 49             var page = new pagination(options);
 50                 page.init();
 51         }else{
 52             alert('总页数不能小于0');
 53         }
 54         
 55     };
 56     
 57     function pagination(options){
 58         this.pageIndex = options.pageIndex || 1;
 59         this.pageCount = options.pageCount;
 60         this.showPage = options.showPage || 3;
 61         this.container = options.container; 
 62     }
 63     
 64     pagination.prototype = {
 65         init: function(){
 66             /*初始化检查当前页是否合理*/
 67             this.pageIndex = this.pageIndex < 1 ? 1 : this.pageIndex;
 68             this.pageIndex = this.pageIndex > this.pageCount ? this.pageCount : this.pageIndex;
 69             
 70             /*渲染UI*/
 71             this.render();    
 72         },
 73         render: function(){
 74             var pageList, setting;
 75                 
 76                 pageList = [];                
 77                 setting = this.getSetting(this.pageIndex);
 78                 pageList.push('<ul class="pagination">');                
 79                 
 80                 if(this.pageIndex > 1){
 81                     pageList.push('<li><button value="' + setting.prev + '">上一页</button></li>');
 82 
 83                     if(setting.start > 1){                        
 84                         pageList.push('<li><button value="1">1</button></li>');                        
 85                     }
 86 
 87                     if(setting.start > 2){                        
 88                         pageList.push('<li>...</li>');
 89                     }
 90                 }else{                    
 91                     pageList.push('<li><button value="1" disabled="disabled">上一页</button></li>');                    
 92                 }
 93 
 94                 for (var i = setting.start; i <= setting.end; i++) {                    
 95                     if(i == this.pageIndex){
 96                         pageList.push('<li><button value="' + i + '" disabled="disabled">' + i + '</button></li>');                        
 97                     }else{                        
 98                         pageList.push('<li><button value="' + i + '">' + i + '</button></li>');    
 99                     }
100                 };
101 
102                 if(this.pageIndex < this.pageCount){
103                     if(setting.end < this.pageCount){
104                         if(setting.end < (this.pageCount - 1)){
105                             pageList.push('<li>...</li>');
106                         }
107                         
108                         pageList.push('<li><button value="' + this.pageCount + '">' + this.pageCount + '</button></li>');
109                     }
110                     
111                     pageList.push('<li><button value="' + setting.next + '">下一页</button></li>');
112                 }else{                    
113                     pageList.push('<li><button value="' + this.pageCount + '" disabled="disabled">下一页</button></li>');
114                 }
115 
116                 pageList.push('</ul>');
117                 this.container.innerHTML = pageList.join('\n');
118                 this.regEvent();
119         },
120         regEvent: function(){
121             /*事件注册*/
122             var _this = this;
123             var button = this.container.getElementsByTagName('button');
124             
125             for(var i = 0; i < button.length; i++){
126                 button[i].onclick = function(){
127                     _this.change(parseInt(this.value));
128                 };
129             }            
130         },
131         change: function(index){
132             /*当前页改变时触发*/
133             this.pageIndex = index;
134             this.render();
135             this.onChange(index);
136         },
137         getSetting: function(index){
138             var start, end, prev, next, s, e;
139 
140                 s = 0;
141                 e = 0;
142                 
143                 start = index - this.showPage;
144                 end = index + this.showPage;
145 
146                 if(start < 1){
147                     s = Math.abs(start) + 1;
148                     start = 1;
149                 }
150 
151                 if(end > this.pageCount){
152                     e = end - this.pageCount;
153                     end = this.pageCount;
154                 }
155 
156                 if(s > 0 && e <= 0){
157                     e = s + end;
158                     end = e > this.pageCount ? this.pageCount : e;
159                 }else if(e > 0 && s <= 0){
160                     s = start - e;
161                     start = s < 1 ? 1: s;
162                 }                
163 
164                 prev = index > start ? index - 1 : 1;
165                 next = index < end ? index + 1 : end;
166                 
167                 /*核心算法, 根据当前页计算出显示的起始页和截止页, 上一页, 下一页 这些数据*/                
168                 return {start: start, end: end, prev: prev, next: next};
169         },
170         onChange: function(index){
171             /*空函数, 可覆盖*/
172             console.log(index);
173         }
174     };
175     
176     
177     
178 </script>    
179 </body>
180 </html>

 

posted @ 2014-05-20 19:42  火柴人  Views(1786)  Comments(0Edit  收藏  举报