• 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

  • 相关阅读:
    failonerror on MSBuild
    近期Windows Mobile问题汇总
    android的文件操作 sdcard和rom
    用实际库存数调整批次保留最新的批次
    各种布局layout
    javascript让ui线程让出时间片的模型
    android ListView控件操作绑定数据、单击事件
    Pocket PC 模拟器上网设置
    android单元测试
    打电话发短信
  • 原文地址:https://www.cnblogs.com/zourong/p/3850764.html
Copyright © 2020-2023  润新知