• 使用JavaScript实现分页效果


      应公司需求,有时需要制作静态页面网站,而一旦涉及到文章的分页,实现起来非常麻烦,自己又刚入门,对js不是很熟悉,所以就拿来练练手。

      首先页面结构如下,分别展示数据跟分页:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Document</title>
     6     <style>
     7         ol, ul {
     8             list-style: none;
     9         }
    10         li {
    11             float:left;
    12             margin:0 10px;
    13         }
    14         ol li {
    15             cursor:pointer;
    16             padding:1px 5px;
    17             background:#eee;
    18             border:1px solid #ccc;
    19         }
    20         ol li.on {
    21             background:#f00;
    22             color:#fff;
    23             border-color:#f00;
    24         }
    25         span {
    26             color:#f00;
    27         }
    28     </style>
    29 </head>
    30 <body>
    31     <ul id="data">
    32         <li>
    33             <img src="1.jpg" alt="服饰 —— 服装模板" />
    34             <h2>服饰 —— 服装模板<span>NO.A001</span></h2>
    35         </li>
    36         <li>
    37             <img src="1.jpg" alt="服饰 —— 服装模板" />
    38             <h2>服饰 —— 服装模板<span>NO.A001</span></h2>
    39         </li>
    40     </ul>
    41     <div style="clear:both;"></div>
    42     <ol id="page">
    43         <li>1</li>
    44         <li>2</li>
    45     </ol>
    46 
    47     <script src="data.js"></script>
    48 </body>
    49 </html>

       在data.js中创建一个数据,用于存储数据:

    var dataList = [
        {
            "_title": "服饰 —— 服装模板",
            "_no": "A001",
            "_url": "1.jpg"
        },
        {
            "_title": "农业 —— 蔬菜模板",
            "_no": "A002",
            "_url": "2.jpg"
        },
        {
            "_title": "汽车 —— 轮胎模板",
            "_no": "A003",
            "_url": "3.jpg"
        },
        {
            "_title": "服饰 —— 服装模板",
            "_no": "A004",
            "_url": "1.jpg"
        },
        {
            "_title": "农业 —— 蔬菜模板",
            "_no": "A005",
            "_url": "2.jpg"
        },
        {
            "_title": "汽车 —— 轮胎模板",
            "_no": "A006",
            "_url": "3.jpg"
        },
        {
            "_title": "服饰 —— 服装模板",
            "_no": "A007",
            "_url": "1.jpg"
        },
        {
            "_title": "农业 —— 蔬菜模板",
            "_no": "A008",
            "_url": "2.jpg"
        },
        {
            "_title": "汽车 —— 轮胎模板",
            "_no": "A009",
            "_url": "3.jpg"
        }
    ];

        思路:创建一个对象,对象中设置三个方法:

          1、分页导航按钮

          2、页面数据展示

          3、分页导航按钮点击事件

        首先,创建构造函数,分别存储:页面的元素、数组数据、当前页及每页显示多少条数据:

     1 // 获取id
     2 function $$(id) {
     3     return document.getElementById(id);
     4 }
     5 
     6 // 设置构造函数
     7 function SetData() {
     8     this.elCon =  $$("data");        // 页面内容元素
     9     this.elPage = $$("page");        // 分页导航元素
    10     this.data = dataList;        // 数据列表
    11     this.i = 0;            // 从第几条开始取数据(0代表第一条)
    12     this.strNav = "";    // 存储分页导航选项
    13     this.view = 2;        // 默认一页显示多少
    14 }

        1、分页导航按钮: 创建原型方法,定义分页函数。先获取数据长度,之后除以每页显示多少条数据,再向上取整 得出分页导航,插入页面中:

    // 设置原型方法
    SetData.prototype = {
        constructor: SetData,    // 指向构造函数
        // 分页函数
        setPageNav: function() {
            var len = this.data.length;
            for (var i = 0; i < Math.ceil(len/this.view); i++) {
                // 设置分页
                this.strNav += "<li>"+(i+1)+"</li>";
            }
            // 插入分页
            this.elPage.innerHTML = this.strNav;
            this.elPage.getElementsByTagName("li")[0].className = "on";
        }
    };

        2、页面数据展示:取得当前页面加上每页显示条数,得出从哪开始取。 然后循环取出对应数据,加入strHTML变量中,再插入页面

     1 // 页面数据
     2     setPageData: function() {
     3         var num = this.i+this.view,
     4             // 如果超过长度,则获取最后的长度
     5             len = (num < this.data.length) ? num : this.data.length,
     6             strHTML = "";    // 初始化,用于存储内容
     7         // 遍历获取数据并设置当前页面内容
     8         for (this.i; this.i < len; this.i++) {
     9             var _url = this.data[this.i]._url,
    10                 _no = this.data[this.i]._no,
    11                 _title = this.data[this.i]._title;
    12             // 设置对应的属性及内容
    13             strHTML += "<li>"+
    14                 "<img src="+_url+" alt="+_title+" title="+_title+" />"+
    15                 "<h2>"+_title+"<span>NO."+_no+"</span></h2>"+
    16             "</li>
    ";
    17         }
    18         this.elCon.innerHTML = strHTML;
    19     }

         3、分页导航按钮点击事件:获取分页按钮,循环绑定事件并在点击时设置当前所在位置 "_self.i = cur * _self.view" , 之后调用页面数据函数,使其重新获取数据

     1 // 设置分页按钮
     2     setBtn: function() {
     3         // 获取分页按钮
     4         var li = this.elPage.getElementsByTagName("li"),
     5             len = li.length,
     6             _self = this;    // 保存对象
     7         // 遍历并绑定按钮事件
     8         for (var i = 0; i < len; i++) {
     9             // 闭包绑定
    10             (function(cur) {
    11                 li[cur].onclick = function() {
    12                     // 移除存在当前类的样式
    13                     for (var j = 0; j < len; j++) {
    14                         // 使用className 为了兼容IE7以下
    15                         if (li[j].getAttribute("class") == "on" || li[j].getAttribute("className") == "on") {
    16                             li[j].className = "";
    17                             break;        // 退出循环
    18                         }
    19                     }
    20                     li[cur].className = "on";    // 设置当前位置
    21                     _self.i = cur * _self.view;    // 设置当前页
    22                     _self.setPageData();        // 调用获取内容行数
    23                 }
    24             })(i);
    25         }
    26     }

        定义方法之后,实例化对象并调用对应方法往页面插入数据,所有代码如下:

      1 var dataList = [
      2     {
      3         "_title": "服饰 —— 服装模板",
      4         "_no": "A001",
      5         "_url": "1.jpg"
      6     },
      7     {
      8         "_title": "农业 —— 蔬菜模板",
      9         "_no": "A002",
     10         "_url": "2.jpg"
     11     },
     12     {
     13         "_title": "汽车 —— 轮胎模板",
     14         "_no": "A003",
     15         "_url": "3.jpg"
     16     },
     17     {
     18         "_title": "服饰 —— 服装模板",
     19         "_no": "A004",
     20         "_url": "1.jpg"
     21     },
     22     {
     23         "_title": "农业 —— 蔬菜模板",
     24         "_no": "A005",
     25         "_url": "2.jpg"
     26     },
     27     {
     28         "_title": "汽车 —— 轮胎模板",
     29         "_no": "A006",
     30         "_url": "3.jpg"
     31     },
     32     {
     33         "_title": "服饰 —— 服装模板",
     34         "_no": "A007",
     35         "_url": "1.jpg"
     36     },
     37     {
     38         "_title": "农业 —— 蔬菜模板",
     39         "_no": "A008",
     40         "_url": "2.jpg"
     41     },
     42     {
     43         "_title": "汽车 —— 轮胎模板",
     44         "_no": "A009",
     45         "_url": "3.jpg"
     46     }
     47 ];
     48 
     49 
     50 // 获取id
     51 function $$(id) {
     52     return document.getElementById(id);
     53 }
     54 
     55 // 设置构造函数
     56 function SetData() {
     57     this.elCon =  $$("data");        // 页面内容元素
     58     this.elPage = $$("page");        // 分页导航元素
     59     this.data = dataList;        // 数据列表
     60     this.i = 0;            // 从第几条开始取数据(0代表第一条)
     61     this.strNav = "";    // 存储分页导航选项
     62     this.view = 2;        // 默认一页显示多少
     63 }
     64 // 设置原型方法
     65 SetData.prototype = {
     66     constructor: SetData,    // 指向构造函数
     67     // 分页函数
     68     setPageNav: function() {
     69         var len = this.data.length;
     70         for (var i = 0; i < Math.ceil(len/this.view); i++) {
     71             // 设置分页
     72             this.strNav += "<li>"+(i+1)+"</li>";
     73         }
     74         // 插入分页
     75         this.elPage.innerHTML = this.strNav;
     76         this.elPage.getElementsByTagName("li")[0].className = "on";
     77     },
     78     // 页面数据
     79     setPageData: function() {
     80         var num = this.i+this.view,
     81             // 如果超过长度,则获取最后的长度
     82             len = (num < this.data.length) ? num : this.data.length,
     83             strHTML = "";    // 初始化,用于存储内容
     84         // 遍历获取数据并设置当前页面内容
     85         for (this.i; this.i < len; this.i++) {
     86             var _url = this.data[this.i]._url,
     87                 _no = this.data[this.i]._no,
     88                 _title = this.data[this.i]._title;
     89             // 设置对应的属性及内容
     90             strHTML += "<li>"+
     91                 "<img src="+_url+" alt="+_title+" title="+_title+" />"+
     92                 "<h2>"+_title+"<span>NO."+_no+"</span></h2>"+
     93             "</li>
    ";
     94         }
     95         this.elCon.innerHTML = strHTML;
     96     },
     97     // 设置分页按钮
     98     setBtn: function() {
     99         // 获取分页按钮
    100         var li = this.elPage.getElementsByTagName("li"),
    101             len = li.length,
    102             _self = this;    // 保存对象
    103         // 遍历并绑定按钮事件
    104         for (var i = 0; i < len; i++) {
    105             // 闭包绑定
    106             (function(cur) {
    107                 li[cur].onclick = function() {
    108                     // 移除存在当前类的样式
    109                     for (var j = 0; j < len; j++) {
    110                         // 使用className 为了兼容IE7以下
    111                         if (li[j].getAttribute("class") == "on" || li[j].getAttribute("className") == "on") {
    112                             li[j].className = "";
    113                             break;        // 退出循环
    114                         }
    115                     }
    116                     li[cur].className = "on";    // 设置当前位置
    117                     _self.i = cur * _self.view;    // 设置当前页
    118                     _self.setPageData();        // 调用获取内容行数
    119                 }
    120             })(i);
    121         }
    122     }
    123 };
    124 
    125 // 初始化对象
    126 var setData = new SetData();
    127 setData.setPageNav();        // 设置分页导航
    128 setData.setPageData();        // 设置分页内容
    129 setData.setBtn();            // 设置分页按钮

      

      (2014-11-27 11:30 根据指导,学习了一下,重新优化更新代码)

      主要更改部分:this.i 为当前页码、点击事件改为事件委托、数据参数为形参传入、初始化函数更改!以下为更改部分:

     1 /*************传参数**************/
     2 function SetData(elCon,elPage,data) {
     3     this.elCon =  $$(elCon);        // 页面内容元素
     4     this.elPage = $$(elPage);        // 分页导航元素
     5     this.data = data;        // 数据列表
     6 }
     7 
     8 /**********当前页码计算***********/
     9 // 获取当前所在页面
    10 var num = this.i*this.view,
    11 // 如果超过长度,则获取最后的长度
    12 len = (num+this.view < this.data.length) ? num+this.view : this.data.length;
    13 // 遍历获取数据并设置当前页面内容
    14 for (var i = num; i < len; i++) { ... }
    15 
    16 /***********事件委托***********/
    17 // 添加点击事件
    18 this.elPage.onclick = function(ev) {
    19     var ev = ev || window.event,
    20          target = ev.target || ev.srcElement;
    21     // 如果点击的是LI
    22     if (target && target.nodeName === "LI") { ... }
    23 }
    24 
    25 /***********初始化*************/
    26 init: function() {
    27     this.setPageNav();        // 设置分页导航
    28     this.setPageData();        // 设置分页内容
    29     this.setBtn();            // 设置分页按钮
    30 }
    31 // 初始化对象
    32 var setData = new SetData("data","page",dataList);
    33 setData.init();        // 初始化数据   

      感谢指导,学习了! 具体全部更改后代码如下:

      1 var dataList = [
      2     {
      3         "_title": "服饰 —— 服装模板",
      4         "_no": "A001",
      5         "_url": "1.jpg"
      6     },
      7     {
      8         "_title": "农业 —— 蔬菜模板",
      9         "_no": "A002",
     10         "_url": "2.jpg"
     11     },
     12     {
     13         "_title": "汽车 —— 轮胎模板",
     14         "_no": "A003",
     15         "_url": "3.jpg"
     16     },
     17     {
     18         "_title": "服饰 —— 服装模板",
     19         "_no": "A004",
     20         "_url": "1.jpg"
     21     },
     22     {
     23         "_title": "农业 —— 蔬菜模板",
     24         "_no": "A005",
     25         "_url": "2.jpg"
     26     },
     27     {
     28         "_title": "汽车 —— 轮胎模板",
     29         "_no": "A006",
     30         "_url": "3.jpg"
     31     },
     32     {
     33         "_title": "服饰 —— 服装模板",
     34         "_no": "A007",
     35         "_url": "1.jpg"
     36     },
     37     {
     38         "_title": "农业 —— 蔬菜模板",
     39         "_no": "A008",
     40         "_url": "2.jpg"
     41     },
     42     {
     43         "_title": "汽车 —— 轮胎模板",
     44         "_no": "A009",
     45         "_url": "3.jpg"
     46     }
     47 ];
     48 
     49 
     50 // 获取id
     51 function $$(id) {
     52     return document.getElementById(id);
     53 }
     54 
     55 // 设置构造函数
     56 function SetData(elCon,elPage,data) {
     57     this.elCon =  $$(elCon);        // 页面内容元素
     58     this.elPage = $$(elPage);        // 分页导航元素
     59     this.data = data;        // 数据列表
     60     this.strNav = "";    // 存储分页导航选项
     61     this.i = 0;            // 当前页
     62     this.view = 2;        // 默认一页显示多少
     63 }
     64 // 设置原型方法
     65 SetData.prototype = {
     66     constructor: SetData,    // 指向构造函数
     67     // 分页函数
     68     setPageNav: function() {
     69         var len = this.data.length;
     70         for (var i = 0; i < Math.ceil(len/this.view); i++) {
     71             // 设置分页
     72             this.strNav += "<li>"+(i+1)+"</li>";
     73         }
     74         // 插入分页
     75         this.elPage.innerHTML = this.strNav;
     76         this.elPage.getElementsByTagName("li")[0].className = "on";
     77     },
     78     // 页面数据
     79     setPageData: function() {
     80         // 获取当前所在页面
     81         var num = this.i*this.view,
     82             // 如果超过长度,则获取最后的长度
     83             len = (num+this.view < this.data.length) ? num+this.view : this.data.length,
     84             strHTML = "";    // 初始化,用于存储内容
     85         // 遍历获取数据并设置当前页面内容
     86         for (var i = num; i < len; i++) {
     87             var _url = this.data[i]._url,
     88                 _no = this.data[i]._no,
     89                 _title = this.data[i]._title;
     90             // 设置对应的属性及内容
     91             strHTML += "<li>"+
     92                 "<img src="+_url+" alt="+_title+" title="+_title+" />"+
     93                 "<h2>"+_title+"<span>NO."+_no+"</span></h2>"+
     94             "</li>
    ";
     95         }
     96         this.elCon.innerHTML = strHTML;
     97     },
     98     // 设置分页按钮
     99     setBtn: function() {
    100         // 获取分页按钮
    101         var li = this.elPage.getElementsByTagName("li"),
    102             len = li.length,
    103             _self = this;    // 保存对象
    104         // 添加点击事件
    105         this.elPage.onclick = function(ev) {
    106             var ev = ev || window.event,
    107                 target = ev.target || ev.srcElement;
    108             // 如果点击的是LI
    109             if (target && target.nodeName === "LI") {
    110                 var cur = parseInt(target.innerHTML);        // 获取当前点击事件内容
    111                 // 遍历内容,移除当前类
    112                 for (var j = 0; j < len; j++) {
    113                     // 使用className 为了兼容IE7以下
    114                     if (li[j].getAttribute("class") === "on" || li[j].getAttribute("className") === "on") {
    115                         li[j].className = "";
    116                         break;        // 退出循环
    117                     }
    118                 }
    119                 li[cur-1].className = "on";    // 设置当前位置
    120                 _self.i = cur-1;            // 设置当前页
    121                 _self.setPageData();        // 调用获取内容函数
    122             }
    123         }
    124     },
    125     // 初始化
    126     init: function() {
    127         this.setPageNav();        // 设置分页导航
    128         this.setPageData();        // 设置分页内容
    129         this.setBtn();            // 设置分页按钮
    130     }
    131 };
    132 
    133 // 初始化对象
    134 var setData = new SetData("data","page",dataList);
    135 setData.init();        // 初始化数据

      实例访问地址:http://morong.sinaapp.com/page

      总结: 刚入门js,实现这个功能从中也学习了一些知识,技术需要不断的积累练习与总结,希望大神对以上代码给予指导!

    始终相信努力奋斗的意义,因为那是本质问题。
  • 相关阅读:
    android gridview画分割线,如图:
    Devexpress 之gridControl
    Devexpress 之gridControl双击行事件
    Devexpress之popupMenu
    Devexpress之dxErrorProvider
    DevExpress之lookupedit
    Devexpress 汉化 代码 zt
    Devexpress之DateEdit学习,可选择日期时 zt
    Devexpress之barManager
    devpress 很好的中文论坛
  • 原文地址:https://www.cnblogs.com/morong/p/4123671.html
Copyright © 2020-2023  润新知