JS案例之1——pager 分页

学习JS大半年之久,第一次自己尝试写一些小插件,写法参考网上某位牛人写代码的思路。

此处代码写的是静态分页。如果需动态分页,还可以修改下。第一次写,还有很多地方可以优化。希望各位大牛踊跃拍砖。

预览图

 

 

源代码

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4 <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
  5 <title> pager demo </title>
  6 <meta name="author" content="rainna" />
  7 <meta name="keywords" content="rainna's js lib" />
  8 <meta name="description" content="pager demo" />
  9 </head>
 10 <style>
 11 *{margin:0;padding:0;}
 12 li{list-style:none;}
 13 .j-curr{color:red;}
 14 
 15 #list,#pager{width:400px;margin:50px auto;text-align:center;line-height:26px;}
 16 #list li{border-bottom:1px solid #eee;}
 17 #pager li{display:inline-block;padding:0 5px;cursor:pointer;}
 18 </style>
 19 <body>
 20 <div id="list">
 21     <ul>
 22         <li>01111111</li>
 23         <li>0222222</li>
 24         <li>0333333</li>
 25         <li>0444444</li>
 26         <li>0555555</li>
 27         <li>0666666</li>
 28         <li>0777777</li>
 29         <li>0888888</li>
 30         <li>0999999</li>
 31         <li>10101010</li>
 32         <li>11111111</li>
 33         <li>12121212</li>
 34         <li>13131313</li>
 35         <li>14141414</li>
 36         <li>15151515</li>
 37         <li>16161616</li>
 38         <li>17171717</li>
 39         <li>18181818</li>
 40         <li>19191919</li>
 41         <li>20202020</li>
 42         <li>01111111</li>
 43         <li>0222222</li>
 44         <li>0333333</li>
 45         <li>0444444</li>
 46         <li>0555555</li>
 47     </ul>
 48 </div>
 49 <div id="pager"></div>
 50 
 51 <script>
 52 var pager = function(){
 53     //公共函数
 54     function T$(id){
 55         return document.getElementById(id);
 56     }
 57     function T$$(root,tag){
 58         return (root || document).getElementsByTagName(tag);
 59     }
 60     function $extend(object1,object2){
 61         for(var p in object2){
 62             object1[p] = object2[p];
 63         }
 64         return object1;
 65     }
 66     function $each(arr, callback, thisp) {
 67         if (arr.forEach){
 68             arr.forEach(callback, thisp);
 69         }else{
 70             for(var i = 0, len = arr.length; i < len; i++){
 71                 callback.call(thisp, arr[i], i, arr);
 72             }
 73         }
 74     }
 75     
 76     //默认参数配置
 77     var defaultOptions = {
 78         elemShowCount:5,     //每页显示条数,默认为5条
 79         pageShowCount:4,     //显示的页码数目,默认显示4个页码
 80         showFirstPageBtnAndLastPageBtn:true,     //是否显示首页,尾页,默认显示
 81         showPrevBtnAndNextBtn:true,    //是否显示上一页,下一页,默认显示
 82         showPageNumTips:true,      //是否显示【1/7页】页面提示,默认显示
 83         showPageNum:true      //是否显示分页的数字,默认显示
 84     };
 85     
 86     //主类构造函数 参数说明:bid为元素容器div的ID,pid为分页容器div的ID,options为重写的默认配置参数
 87     var showPage = function(bid,pid,options){   
 88         var self = this;             
 89         if(!(self instanceof showPage)){
 90             return new showPage(bid,pid,options);
 91         }
 92         self.container = T$(bid);    //元素容器div
 93         self.pagerBox = T$(pid);    //翻页容器div
 94         if(!self.container){
 95             return;                     
 96         }
 97         self.options = $extend(defaultOptions,options||{});
 98         self.elem = T$$(self.container,'li');     //需要分页的元素
 99         self.elemTotalCount = self.elem.length || 0;    //分页元素的总个数
100         self.pageTotalCount = Math.ceil(self.elemTotalCount/self.options.elemShowCount) || 0;   //总页数
101     };
102     
103     showPage.prototype = {
104         constructor:showPage,
105         //显示当页的元素内容,参数currPageNum为当前页码,从0开始
106         showChangeElemCont: function(currPageNum){                     
107             var self = this;     //this为showPage对象
108             var nextPageCount = (currPageNum+1)*self.options.elemShowCount < self.elemTotalCount ? (currPageNum+1)*self.options.elemShowCount : self.elemTotalCount;     //判断为最后一页时,最后一页应该显示的数据条数
109             for(var i=0;i<self.elemTotalCount;i++){
110                 self.elem[i].style.display = 'none';
111             }
112             for(var i=currPageNum*self.options.elemShowCount,l=nextPageCount;i<l;i++){
113                 self.elem[i].style.display = 'block';
114             }
115         },
116         //显示当页的页码内容,参数currPageNum为当前页码,从0开始
117         showChangePageCont: function(currPageNum){                      
118             var self = this;      //this为showPage对象
119             var firstPageHtml = prevPageHtml = pageLinkHtml = nextPageHtml = lastPageHtml = pageTips = '';     //firstPageHtml:首页   prevPageHtml:上一页  pageLinkHtml:页码表   nextPageHtml:下一页  lastPageHtml:尾页   pageTips:页码提示
120             var startPage,endPage;        //startPage:页码列表中的第一页   endPage:页码列表中的最后一页
121             var pageShowMidCount = Math.ceil(self.options.pageShowCount/2);      //页码中间值,当超过这个值时,页码列表发生变化
122             if(self.pageTotalCount <= self.options.pageShowCount){           //总页码数小于等于默认要显示的页码数时,直接在当前页面显示全部的页码
123                 startPage = 0;
124                 endPage = self.pageTotalCount-1;
125             }else{
126                 if(self.options.pageShowCount%2 == 0){
127                     if((currPageNum + 1 - pageShowMidCount) <= 0){       //首页
128                         startPage = 0;
129                         endPage = self.options.pageShowCount-1;
130                     }else if((currPageNum + 1 + pageShowMidCount) >= self.pageTotalCount){            //尾页
131                         startPage = self.pageTotalCount-1 - self.options.pageShowCount + 1;
132                         endPage = self.pageTotalCount-1;
133                     }else{
134                         startPage = currPageNum - pageShowMidCount + 1;
135                         endPage = currPageNum + pageShowMidCount;
136                     }    
137                 }else{
138                     if((currPageNum + 1 - pageShowMidCount) <= 0){       //首页
139                         startPage = 0;
140                         endPage = self.options.pageShowCount-1;
141                     }else if((currPageNum + 1 + pageShowMidCount - 1) >= self.pageTotalCount){            //尾页
142                         startPage = self.pageTotalCount-1 - self.options.pageShowCount + 1;
143                         endPage = self.pageTotalCount-1;
144                     }else{
145                         startPage = currPageNum - pageShowMidCount + 1;
146                         endPage = currPageNum + pageShowMidCount - 1;
147                     }    
148                 }    
149             }
150             
151             //显示首页尾页
152             if(self.options.showFirstPageBtnAndLastPageBtn == true){
153                 firstPageHtml = '<li>首页</li>';
154                 lastPageHtml =     '<li>尾页</li>';    
155             }
156             //显示上一页下一页
157             if(self.options.showPrevBtnAndNextBtn == true){
158                 if(currPageNum != 0) prevPageHtml = '<li>上一页</li>';       //首页不显示上一页
159                 if(currPageNum != self.pageTotalCount-1) nextPageHtml = '<li>下一页</li>';      //尾页不显示最后一页
160             }
161             //显示页码数字链接
162             for(var i=startPage,l=endPage;i<=l;i++){
163                 if(currPageNum==i){
164                     pageLinkHtml += '<li class="j-curr">' + (i+1) + '</li>';
165                 }else{
166                     pageLinkHtml += '<li>' + (i+1) + '</li>';
167                 }
168             }
169             //显示页码提示信息
170             if(self.options.showPageNumTips == true){
171                 pageTips = '<span>' +(currPageNum+1) + '/' + self.pageTotalCount + '</span>';
172             }
173             //拼出页码元素的整体内容
174             self.pagerBox.innerHTML = firstPageHtml + prevPageHtml + pageLinkHtml + nextPageHtml + lastPageHtml + pageTips;    
175 
176             var elems = T$$(self.pagerBox,'li');
177             $each(elems, function(o, i) {
178                 o.onclick = function() {
179                     if(o.innerText == '首页'){
180                         self.showChangeElemCont(0);
181                         self.showChangePageCont(0);
182                     }else if(o.innerText == '尾页'){
183                         self.showChangeElemCont(self.pageTotalCount-1);
184                         self.showChangePageCont(self.pageTotalCount-1);
185                     }else if(o.innerText == '上一页'){
186                         self.showChangeElemCont(currPageNum-1);
187                         self.showChangePageCont(currPageNum-1);
188                     }else if(o.innerText == '下一页'){
189                         self.showChangeElemCont(currPageNum+1);
190                         self.showChangePageCont(currPageNum+1);
191                     }else{
192                         index = parseInt(o.innerText) - 1;
193                         self.showChangeElemCont(index);
194                         self.showChangePageCont(index);
195                     }        
196                 }
197             });
198         }
199     };
200     
201     return{
202         onShowPage:function(bid,pid,options){
203             //调用主类
204             var st = new showPage(bid,pid,options);
205             st.showChangeElemCont(0);
206             st.showChangePageCont(0);
207         }
208     }
209 }();
210 
211 pager.onShowPage('list','pager',{elemShowCount:4,pageShowCount:5});
212 </script>
213 </body>
214 </html>

源码下载:Download

posted @ 2014-07-17 12:42  ZRainna  阅读(1810)  评论(2编辑  收藏  举报