二十一、面向对象案例

面向对象框架格式

下面以自动轮播图(插件)为例
写插件潜规则:构造函数中保存标签等属性,原型方法中使用一个个功能

<style>       //-------------------------------------------轮播图样式
* {padding:0px;margin:0px;}
.box {width:500px;height:180px;overflow: hidden; position: relative;}
ul {
    list-style:none;
    position: absolute;
    bottom: 10px;
    left: 50%;
    margin-left: -60px;
}
ul li {
    float: left;
    width: 10px;
    height:10px;
    background: #fff;
    border-radius: 50%;
    margin-right: 10px;
     }
ul li.active {background: blue;}
</style>

<body>          //---------------------------------------轮播图元素结构
<div class="box">
    <img src="./imgs/img1.jpg" alt="">
    <ul>
        <li class="active"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>  
</body>    
  
<script src="./lbt.js"></script> //-------------------------------------------------引入插件

  <script>
    let lbt1=new Lbt(".box")     //在构造函数Lbt()身上new一个对象,()内传入装轮播图的父元素,构造函数Lbt内写轮播图的所有功能
  </script>

创建构造函数,构造函数中保存标签等属性,原型方法中使用一个个功能

function Lbt(el) {  //------------------------- el element 元素  也就是获取页面中的标签对象(大盒子)
	
	this.el = document.querySelector(el)// -------------------------------------保存父标签
  this.num=1 //-------------------------将轮播图图片序号初始化
   this.t=null //----------------------------承接定时器的变量
    this.init() // ----------------------------启动插件(启动器)
}

Lbt.prototype.init = function() { // -----------------------------调用轮播图所有功能的方法全部封装在启动器中
                                 //---------------------注意:构造函数中的this == 创建的对象
    this.changeImg()//-----------------调用图片自动轮播方法
   
    this.setYQ() // --------------------调用同步圆点随图片自动轮播方法
   
    this.yqOver() //----------------调用鼠标移入停止轮播方法
  
    this.yqOut() //-------------------调用鼠标移出继续轮播的方法   
}

Lbt.prototype.changeImg = function() {}//------向构造函数Lbt()中封装图片自动轮播的方法
Lbt.prototype.setYQ = function() {}//------向构造函数Lbt()中封装圆点同步图片的方法
Lbt.prototype.yqOver= function() {}//------向构造函数Lbt()中封装鼠标移入停止轮播方法
Lbt.prototype.yqOut= function() {}//------向构造函数Lbt()中封装鼠标移出继续轮播的方法  

上面是面向对象写轮播图的大概框架,下面是实际代码

轮播图

html结构部分

<style>
    * {padding:0px;margin:0px;}
    .box {width:500px;height:280px;overflow: hidden; position: relative;}
    ul {
        list-style:none;
        position: absolute;
        bottom: 100px;
        left: 50%;
        margin-left: -60px;
    }
    ul li {
        float: left;
        width: 10px;
        height:10px;
        background: #fff;
        border-radius: 50%;
        margin-right: 10px;
    }
    ul li.active {background: blue;}
    </style>
    
    
    <div class="box">
        <img src="./images/img1.jpg" alt="">
        <ul>
            <li class="active"></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    
    <script src="./lbt.js"></script>
    <script>
    let lbt=new Lbt(".box")
    </script>

js功能部分

function Lbt(el){
    this.el=document.querySelector(el)//获取页面中的标签对象(大盒子)
    this.num=1                        //将图片序号初始化
    this.t=null                       //承接定时器的变量
    
    this.init()                       //启动插件
}


Lbt.prototype.init=function(){        //调用轮播图所有功能的方法全部封装在启动器中
    this.changeImg()       //调用图片自动轮播的方法
    this.changeYq()        //调用圆点同步图片的方法
    this.yqOver()       //调用鼠标移入停止轮播,
    this.yqOut()        //调用鼠标移出继续轮播的方法   
}


Lbt.prototype.changeImg=function(){      //封装图片自动轮播的方法
    this.t=setInterval(()=>{
            this.num++
            if(this.num==7)this.num=1
            let imgObj=this.el.querySelector("img")
            imgObj.src=`./images/img${this.num}.jpg` 
            this.changeYq()
    },1000)  
}


Lbt.prototype.changeYq=function(){      //封装圆点同步图片的方法
    let ypObj=this.el.querySelectorAll("ul li")
    ypObj.forEach((item,index)=>{
        item.removeAttribute("class")
    }); 
    ypObj[this.num-1].setAttribute("class","active")
}


Lbt.prototype.yqOver=function(){      //调用鼠标移入停止轮播方法
    let boxObj=document.querySelector("div")
    boxObj.onmouseover=()=>{
        clearInterval(this.t)
    }
}

Lbt.prototype.yqOut=function(){      //调用鼠标移出继续轮播的方法  
    let boxObj=document.querySelector("div")
    boxObj.onmouseout=()=>{
        this.changeImg() 
    }
}

效果图
在这里插入图片描述

tab选项卡

html结构部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>神龙教主</title>
<style>
* {margin: 0;padding: 0;}
ul, ol, li {list-style: none;}
.box {width: 600px;height: 400px;border: 10px solid #333;margin: 30px auto; display: flex;flex-direction: column;}
.box > ul { width: 100%;  height: 40px;display: flex; }
.box > ul > li {flex: 1;display: flex;justify-content: center;align-items: center;font-size: 30px;color: #fff;background-color: hotpink;}
.box > ul > li.active {background-color: orange;}
.box > ol {flex: 1;position: relative;}
.box > ol > li {width: 100%;height: 100%;position: absolute;top: 0;left: 0;background-color: skyblue;color: #fff;font-size: 100px;display: flex;justify-content: center;align-items: center;display: none;}
.box > ol > li.active {display: flex;}
</style>
</head>
<body>
    <!-- tab选项卡1 -->
    <div class="box box1">
        <!-- 标题 -->
        <ul>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <!-- 内容 -->
        <ol>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ol>
    </div>

    
    <!-- tab选项卡2 -->
    <div class="box box2">
        <!-- 标题 -->
        <ul>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <!-- 内容 -->
        <ol>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ol>
    </div>

    
    <!-- tab选项卡3 -->
    <div class="box box3">
        <!-- 标题 -->
        <ul>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <!-- 内容 -->
        <ol>
            <li class="active">1</li>
            <li>2</li>
            <li>3</li>
        </ol>
    </div>
<script src="./tab.js"></script>
<script>
 let tab1 = new Tab('.box1')
 let tab2 = new Tab('.box2')
 let tab3 = new Tab('.box3')
</script>

js功能部分:

function Tab(el) { // element 标签
    // 构造函数中一般保存插件的属性
    this.el = document.querySelector(el)
    // 当前移入的下标
    this.index = 0

    
    // 默认启动(启动器)
    this.init()
}

Tab.prototype.init = function() {
    // 1. Tab头移入绑定事件
    this.over()
    // 2. Tab头移除所有class,给当前加
    // 3. Tab内容移除所有class,给当前加
}

// Tab头移入绑定事件
Tab.prototype.over = function() {
    // 获取所有UL LI
    let ulLiObjs = this.el.querySelectorAll('ul li')
    // 遍历
    ulLiObjs.forEach((item, index) => {
        // 绑定移入事件
        // item.addEventListener('mouseover', function() {
        item.addEventListener('mouseover', () => {
                // 1. 保存当前下标
                this.index = index
                // 2. 调用Tab头移除所有class,给当前加样式的方法
                this.tabHeaderChange()
                // 3. 调用Tab内容移除所有class,给当前加样式的方法
                this.tabMainChange()
        })
    })
}

// 2. 封装Tab头移除所有class,给当前加样式的方法
Tab.prototype.tabHeaderChange = function(){
    // 获取
    let tabHeaderObjs = this.el.querySelectorAll('ul li')
    // 遍历移除
    tabHeaderObjs.forEach((item, index) =>{
        item.removeAttribute('class')
    })
    // 给当前的加
    tabHeaderObjs[this.index].setAttribute('class', 'active')
}

// 3. 封装Tab内容移除所有class,给当前加样式的方法
Tab.prototype.tabMainChange = function() {
    // 获取
    let tabMainObjs = this.el.querySelectorAll('ol li')
    // 遍历移除
    tabMainObjs.forEach((item, index) =>{
        item.removeAttribute('class')
    })
    // 给当前的加
    tabMainObjs[this.index].setAttribute('class', 'active')
}

效果图:
在这里插入图片描述

(分页效果)实战案例细分析

■分页(面向过程)
初始化
在这里插入图片描述
思路

步骤1:在页面写一个div标签
步骤2:通过css增加样式(w800 h40 border 1px 实现 黑色  外边距 30px 居中)

结构代码:

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

分页标签(展示)
在这里插入图片描述

let pageTag = {
first: ‘首页’,
prev: ‘上一页’,
list: null, // 后期放分页页码
next: ‘下一页’,
last: ‘末页’,
};

思路

步骤1:通过forin来遍历对象  目的 动态创建p标签
步骤2:在循环体中
	1-创建p标签,
	2-创建内容,
	3-将内容追加到p标签中 ,
	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
	5-将p标签追加到div标签对象里面

分页标签代码

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

<script>
// 一、全局变量
let pageTag = {
    first: '首页',
    prev: '上一页',
    list: null,     // 后期放分页页码
    next: '下一页',
    last: '末页',
};
let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'

// 二、显示分页标签
// 步骤1:通过forin来遍历对象  目的 动态创建p标签
for (let tag in pageTag) { // tag
    // console.log(tag) 对象的键tag 对象的值pageTag[tag]
    // 步骤2:在循环体中
    // 	1-创建p标签,
    let pObj = document.createElement('p')
    // 	2-创建内容,
    let textObj = document.createTextNode(pageTag[tag])
    // 	3-将内容追加到p标签中 ,
    pObj.appendChild(textObj)
    // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
    pObj.style.margin = '0px 5px'
    pObj.style.padding = '0px 5px'
    pObj.style.border = '1px solid black'
    pObj.style.display = 'inline-block'
    // 	5-将p标签追加到div标签对象里面
    divObj.appendChild(pObj)
}
</script>

分页页码(难 - 1显示页码)

需求:将页码(1-100)创建出来,然后放到null这个标签里面
在这里插入图片描述
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓效果如下↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓效果如下↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
在这里插入图片描述

let pageInfo = {// 分页页码的数据
    pageNum:  15,     // 当前页数
    pageSize: 10,    // 每页显示条数  
    totalData: 1000, // 总条数 
    totalPage: 100,  // 总页数 = 向上取整(总条数 / 每页显示条数)
}

pageInfo.totalPage = Math.ceil(pageInfo.totalData / pageInfo.pageSize)

思路

步骤1:获取null标签对象(目的:后期分页页码都放到这个里面)
步骤2:通过for循环遍历(起始位置1,最大值<=pageInfo.totalPage)
	1-创建p标签,
	2-创建内容,
	3-将内容追加到p标签中 ,
	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
	5-将p标签追加到【null标签对象】里面

代码

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

<script>
// 一、全局变量
let pageTag = {
    first: '首页',
    prev: '上一页',
    list: null,     // 后期放分页页码
    next: '下一页',
    last: '末页',
};

let pageInfo = {// 分页页码的数据
    pageNum:  15,     // 当前页数
    pageSize: 10,    // 每页显示条数  
    totalData: 1000, // 总条数 
    totalPage: 100,  // 总页数 = 向上取整(总条数 / 每页显示条数)
}
pageInfo.totalPage = Math.ceil(pageInfo.totalData / pageInfo.pageSize)

let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'

// 二、显示分页标签
// 步骤1:通过forin来遍历对象  目的 动态创建p标签
for (let tag in pageTag) { // tag
    // console.log(tag) 对象的键tag 对象的值pageTag[tag]
    // 步骤2:在循环体中
    // 	1-创建p标签,
    let pObj = document.createElement('p')

    // null标签对象不要内容和外边框
    if (tag != 'list')
    {
        // 	2-创建内容,
        let textObj = document.createTextNode(pageTag[tag])
        // 	3-将内容追加到p标签中 ,
        pObj.appendChild(textObj)
        // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
        pObj.style.margin = '0px 5px'
        pObj.style.padding = '0px 5px'
        pObj.style.border = '1px solid black'
        pObj.style.display = 'inline-block'
    }
    // 	5-将p标签追加到div标签对象里面
    divObj.appendChild(pObj)
}

// 三、显示分页页码
// 步骤1:获取null标签对象(目的:后期分页页码都放到这个里面)
let nullObj = document.querySelector('div p:nth-child(3)')
// console.log(nullObj)
// 步骤2:通过for循环遍历(起始位置1,最大值<=pageInfo.totalPage)
// for (let i = 1; i<=pageInfo.totalPage; i++)
for (let i = 1; i<=10; i++)
{
    // 	1-创建p标签,
    let pObj = document.createElement('p')
    // 	2-创建内容,(注:i第几页)
    let textObj = document.createTextNode(i)
    // 	3-将内容追加到p标签中 ,
    pObj.appendChild(textObj)
    // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
    pObj.style.margin = '0px 5px'
    pObj.style.padding = '0px 5px'
    pObj.style.border = '1px solid black'
    pObj.style.display = 'inline-block'
    // 	5-将p标签追加到【null标签对象】里面
    nullObj.appendChild(pObj)
}
</script>

分页页码(难 - 2省略号)

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

<script>
// 一、全局变量
let pageTag = {
    first: '首页',
    prev: '上一页',
    list: null,     // 后期放分页页码
    next: '下一页',
    last: '末页',
};

let pageInfo = {// 分页页码的数据
    pageNum:  96,     // 当前页数
    pageSize: 10,    // 每页显示条数  
    totalData: 1000, // 总条数 
    totalPage: 100,  // 总页数 = 向上取整(总条数 / 每页显示条数)
}
pageInfo.totalPage = Math.ceil(pageInfo.totalData / pageInfo.pageSize)

let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'

// 二、显示分页标签
// 步骤1:通过forin来遍历对象  目的 动态创建p标签
for (let tag in pageTag) { // tag
    // console.log(tag) 对象的键tag 对象的值pageTag[tag]
    // 步骤2:在循环体中
    // 	1-创建p标签,
    let pObj = document.createElement('p')

    // null标签对象不要内容和外边框
    if (tag != 'list')
    {
        // 	2-创建内容,
        let textObj = document.createTextNode(pageTag[tag])
        // 	3-将内容追加到p标签中 ,
        pObj.appendChild(textObj)
        // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
        pObj.style.margin = '0px 5px'
        pObj.style.padding = '0px 5px'
        pObj.style.border = '1px solid black'
        pObj.style.display = 'inline-block'
    }
    // 	5-将p标签追加到div标签对象里面
    divObj.appendChild(pObj)
}

// 三、显示分页页码
// 步骤1:获取null标签对象(目的:后期分页页码都放到这个里面)
let nullObj = document.querySelector('div p:nth-child(3)')
// console.log(nullObj)
// 步骤2:通过for循环遍历(起始位置1,最大值<=pageInfo.totalPage)
// for (let i = 1; i<=pageInfo.totalPage; i++)
// for (let i = 1; i<=10; i++)
// {
//     // 	1-创建p标签,
//     let pObj = document.createElement('p')
//     // 	2-创建内容,(注:i第几页)
//     let textObj = document.createTextNode(i)
//     // 	3-将内容追加到p标签中 ,
//     pObj.appendChild(textObj)
//     // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
//     pObj.style.margin = '0px 5px'
//     pObj.style.padding = '0px 5px'
//     pObj.style.border = '1px solid black'
//     pObj.style.display = 'inline-block'
//     // 	5-将p标签追加到【null标签对象】里面
//     nullObj.appendChild(pObj)
// }


// pageNum<5     1 2 3 4 5 ... 99 100
// pageNum==5     1 2 3 4 5 6 7 ... 99 100
// pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
// pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
if (pageInfo.pageNum<5) {

    for (let i = 1; i<=5; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum==5) {

    for (let i = 1; i<=7; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage-4) {

    for (let i = 1; i<=2; i++) createP(i)
    createP('...', 'span')
    for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum >= pageInfo.totalPage-4) {

    for (let i = 1; i<=2; i++) createP(i)
    createP('...', 'span')
    for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) createP(i)

}

function createP(content, tag = 'p')
{
    // 	1-创建p标签,
    // let pObj = document.createElement('p')
    let pObj = document.createElement(tag)
    // 	2-创建内容,(注:i第几页)
    // let textObj = document.createTextNode(i)
    let textObj = document.createTextNode(content)
    // 	3-将内容追加到p标签中 ,
    pObj.appendChild(textObj)
    // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
    pObj.style.margin = '0px 5px'
    pObj.style.padding = '0px 5px'
    pObj.style.border = '1px solid black'
    pObj.style.display = 'inline-block'
    if (content == pageInfo.pageNum) pObj.style.background = 'orange'
    // 	5-将p标签追加到【null标签对象】里面
    nullObj.appendChild(pObj)
}
</script>

分页标签(点击首页,尾页,禁用上一页,下一页)

思路

分页标签创建后

如果pageInfo.pageNum==1  					禁用  首页 和 上一页
如果pageInfo.pageNum==pageInfo.totalPage  禁用 下一页 和 尾页

注:background:#ccc

代码

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

<script>
// 一、全局变量
let pageTag = {
    first: '首页',
    prev: '上一页',
    list: null,     // 后期放分页页码
    next: '下一页',
    last: '末页',
};

let pageInfo = {// 分页页码的数据
    pageNum:  100,     // 当前页数
    pageSize: 10,    // 每页显示条数  
    totalData: 1000, // 总条数 
    totalPage: 100,  // 总页数 = 向上取整(总条数 / 每页显示条数)
}
pageInfo.totalPage = Math.ceil(pageInfo.totalData / pageInfo.pageSize)

let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'

// 二、显示分页标签
// 步骤1:通过forin来遍历对象  目的 动态创建p标签

for (let tag in pageTag) { // tag
    // console.log(tag) 对象的键tag 对象的值pageTag[tag]
    // 步骤2:在循环体中
    // 	1-创建p标签,
    let pObj = document.createElement('p')

    // null标签对象不要内容和外边框
    if (tag != 'list')
    {
        // 	2-创建内容,
        let textObj = document.createTextNode(pageTag[tag])
        // 	3-将内容追加到p标签中 ,
        pObj.appendChild(textObj)
        // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
        pObj.style.margin = '0px 5px'
        pObj.style.padding = '0px 5px'
        pObj.style.border = '1px solid black'
        pObj.style.display = 'inline-block'
    }
    // 	5-将p标签追加到div标签对象里面
    divObj.appendChild(pObj)
}

// 分页标签禁用
let divTagPobj = document.querySelectorAll('div p')
// 如果pageInfo.pageNum==1  				 禁用  首页 和 上一页
if (pageInfo.pageNum==1) {
    divTagPobj[0].style.background = '#ccc'
    divTagPobj[1].style.background = '#ccc'
} 
// 如果pageInfo.pageNum==pageInfo.totalPage  禁用 下一页 和 尾页
if (pageInfo.pageNum==pageInfo.totalPage) {
    divTagPobj[3].style.background = '#ccc'
    divTagPobj[4].style.background = '#ccc'
}

// 注:background:#ccc


// 三、显示分页页码
// 步骤1:获取null标签对象(目的:后期分页页码都放到这个里面)
let nullObj = document.querySelector('div p:nth-child(3)')
// console.log(nullObj)
// 步骤2:通过for循环遍历(起始位置1,最大值<=pageInfo.totalPage)
// for (let i = 1; i<=pageInfo.totalPage; i++)
// for (let i = 1; i<=10; i++)
// {
//     // 	1-创建p标签,
//     let pObj = document.createElement('p')
//     // 	2-创建内容,(注:i第几页)
//     let textObj = document.createTextNode(i)
//     // 	3-将内容追加到p标签中 ,
//     pObj.appendChild(textObj)
//     // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
//     pObj.style.margin = '0px 5px'
//     pObj.style.padding = '0px 5px'
//     pObj.style.border = '1px solid black'
//     pObj.style.display = 'inline-block'
//     // 	5-将p标签追加到【null标签对象】里面
//     nullObj.appendChild(pObj)
// }


// pageNum<5     1 2 3 4 5 ... 99 100
// pageNum==5     1 2 3 4 5 6 7 ... 99 100
// pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
// pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
if (pageInfo.pageNum<5) {

    for (let i = 1; i<=5; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum==5) {

    for (let i = 1; i<=7; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage-4) {

    for (let i = 1; i<=2; i++) createP(i)
    createP('...', 'span')
    for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) createP(i)
    createP('...', 'span')
    createP(pageInfo.totalPage - 1)
    createP(pageInfo.totalPage)

} else if (pageInfo.pageNum >= pageInfo.totalPage-4) {

    for (let i = 1; i<=2; i++) createP(i)
    createP('...', 'span')
    for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) createP(i)

}

function createP(content, tag = 'p')
{
    // 	1-创建p标签,
    // let pObj = document.createElement('p')
    let pObj = document.createElement(tag)
    // 	2-创建内容,(注:i第几页)
    // let textObj = document.createTextNode(i)
    let textObj = document.createTextNode(content)
    // 	3-将内容追加到p标签中 ,
    pObj.appendChild(textObj)
    // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
    pObj.style.margin = '0px 5px'
    pObj.style.padding = '0px 5px'
    pObj.style.border = '1px solid black'
    pObj.style.display = 'inline-block'
    if (content == pageInfo.pageNum) pObj.style.background = 'orange'
    // 	5-将p标签追加到【null标签对象】里面
    nullObj.appendChild(pObj)
}
</script>

分页事件
事件委托
概念:顾名思义就是将事件委托给父元素

作用:当页面节点是通过js动态增加时,发现新增的标签没有事件,但需求要,解决通过事件委托

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<button>按钮</button>
<script>
// 需求:点击按钮 动态增加li标签
let btnObj = document.querySelector('button')
btnObj.addEventListener('click', () => {
    // 创建li标签
    let liObj = document.createElement('li')
    let textObj = document.createTextNode('神龙教主')
    liObj.appendChild(textObj)
    // 放到ul中
    let ulObj = document.querySelector('ul')
    ulObj.appendChild(liObj)
})
// 需求:点击li动态获取里面内容
// 获取所有li 遍历挨个增加点击事件 -> 获取里面内容
// let liObjs = document.querySelectorAll('li') // 数组 数组里面是一个个li标签对象
// liObjs.forEach((item, index)=> {
//     // item 就是一个个li标签对象
//     item.addEventListener('click', function(){
//         // this 事件源 item  li
//         alert(this.innerHTML)
//     })
// })


// 发现:上述代码用js增加的节点没有事件 ,委托给父
let ulObj = document.querySelector('ul')
ulObj.addEventListener('click', function(e) {
    // this ulObj
    // 要获取li  li就是事件源  你点击的元素
    // 思考:会不会有li以外的?
    // 回答:有  只要在ul中就有
    e = e || window.event
    // 事件源
    let target = e.target
    console.log(target)
    console.log(target.nodeName) //获取节点名称

    // 切记:li大写
    if (target.nodeName == 'LI') 
    {
        alert(target.innerHTML)
    }
})
</script>

思路

步骤1:将创建分页标签封装起来
步骤2:将创建分页页码封装起来
步骤3:给div设置点击事件(事件委拖)
步骤4:在处理函数中判断是否是分页页码和分页标签
	不是 - 不管
	  是 - 1更改全局的当前第几页 pageInfo.pageNum,2-重新渲染/展示页码

面向过程总体代码:

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: 30px auto;
}
</style>

<div></div>

<script>
// 一、全局变量
let pageTag = {
    first: '首页',
    prev: '上一页',
    list: null,     // 后期放分页页码
    next: '下一页',
    last: '末页',
};

let pageInfo = {// 分页页码的数据
    pageNum:  100,     // 当前页数
    pageSize: 10,    // 每页显示条数  
    totalData: 1000, // 总条数 
    totalPage: 100,  // 总页数 = 向上取整(总条数 / 每页显示条数)
}
pageInfo.totalPage = Math.ceil(pageInfo.totalData / pageInfo.pageSize)

let divObj = document.querySelector('div')
divObj.style.display = 'flex'
divObj.style.justifyContent = 'center'
divObj.style.alignItems = 'center'
divObj.addEventListener('click', function(evt){

    // 获取事件对象
    e = evt || window.event
    // 获取操作对象
    tag = e.target
    tagVal = tag.innerHTML
    // 判断
    if (tagVal == pageTag.first)
    {
        pageInfo.pageNum = 1
        createPageTag()
    } 
    
    if (
        tagVal == pageTag.prev 
        &&
        pageInfo.pageNum > 1
    )
    {
        pageInfo.pageNum = parseInt(pageInfo.pageNum) - 1
        createPageTag()
    } 

    //---------------------
    // 首页 上一页等等   NaN  为假
    // 如果点击了数字   数字为真
    if (Number(tagVal)) 
    {
        pageInfo.pageNum = parseInt(tagVal)
        createPageTag()
    }
    //---------------------
    
    if (
        tagVal ==  pageTag.next
        &&
        pageInfo.pageNum < pageInfo.totalPage
    )
    {
        pageInfo.pageNum = parseInt(pageInfo.pageNum) + 1
        createPageTag()
    } 
    
    if (tagVal == pageTag.last)
    {
        pageInfo.pageNum = pageInfo.totalPage
        createPageTag()
    } 

})



// 默认调用
createPageTag()

// 步骤1:将创建分页标签封装起来
// 步骤2:将创建分页页码封装起来
// 步骤3:给div设置点击事件(事件委拖)
// 步骤4:在处理函数中判断是否是分页页码和分页标签
// 	不是 - 不管
// 	  是 - 1更改全局的当前第几页 pageInfo.pageNum,2-重新渲染/展示页码


// 二、显示分页标签
function createPageTag()
{
    // 注:切记不管怎么样 每次调用先清空div内容
    divObj.innerHTML = ''
    //==============================
    //==============================
    //==============================

    // 步骤1:通过forin来遍历对象  目的 动态创建p标签
    for (let tag in pageTag) { // tag
        // console.log(tag) 对象的键tag 对象的值pageTag[tag]
        // 步骤2:在循环体中
        // 	1-创建p标签,
        let pObj = document.createElement('p')

        // null标签对象不要内容和外边框
        if (tag != 'list')
        {
            // 	2-创建内容,
            let textObj = document.createTextNode(pageTag[tag])
            // 	3-将内容追加到p标签中 ,
            pObj.appendChild(textObj)
            // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
            pObj.style.margin = '0px 5px'
            pObj.style.padding = '0px 5px'
            pObj.style.border = '1px solid black'
            pObj.style.display = 'inline-block'
        }
        // 	5-将p标签追加到div标签对象里面
        divObj.appendChild(pObj)
    }

    // 分页标签禁用
    let divTagPobj = document.querySelectorAll('div p')
    // 如果pageInfo.pageNum==1  				 禁用  首页 和 上一页
    if (pageInfo.pageNum==1) {
        divTagPobj[0].style.background = '#ccc'
        divTagPobj[1].style.background = '#ccc'
    } 
    // 如果pageInfo.pageNum==pageInfo.totalPage  禁用 下一页 和 尾页
    if (pageInfo.pageNum==pageInfo.totalPage) {
        divTagPobj[3].style.background = '#ccc'
        divTagPobj[4].style.background = '#ccc'
    }

    // 注:background:#ccc


    // ===========================
    // 必须先有分页标签,才有分页页码
    createPageno()
}


// 三、显示分页页码
function createPageno()
{
    // 步骤1:获取null标签对象(目的:后期分页页码都放到这个里面)
    nullObj = document.querySelector('div p:nth-child(3)')
    // pageNum<5     1 2 3 4 5 ... 99 100
    // pageNum==5     1 2 3 4 5 6 7 ... 99 100
    // pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
    // pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
    if (pageInfo.pageNum<5) {

        for (let i = 1; i<=5; i++) createP(i)
        createP('...', 'span')
        createP(pageInfo.totalPage - 1)
        createP(pageInfo.totalPage)

    } else if (pageInfo.pageNum==5) {

        for (let i = 1; i<=7; i++) createP(i)
        createP('...', 'span')
        createP(pageInfo.totalPage - 1)
        createP(pageInfo.totalPage)

    } else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage-4) {

        for (let i = 1; i<=2; i++) createP(i)
        createP('...', 'span')
        for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) createP(i)
        createP('...', 'span')
        createP(pageInfo.totalPage - 1)
        createP(pageInfo.totalPage)

    } else if (pageInfo.pageNum >= pageInfo.totalPage-4) {

        for (let i = 1; i<=2; i++) createP(i)
        createP('...', 'span')
        for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) createP(i)
    }
}

function createP(content, tag = 'p')
{
    // 	1-创建p标签,
    // let pObj = document.createElement('p')
    let pObj = document.createElement(tag)
    // 	2-创建内容,(注:i第几页)
    // let textObj = document.createTextNode(i)
    let textObj = document.createTextNode(content)
    // 	3-将内容追加到p标签中 ,
    pObj.appendChild(textObj)
    // 	4-给p设置样式(m 0 5 \ p 0 5 \ b 1 黑 \ d inline-block)
    pObj.style.margin = '0px 5px'
    pObj.style.padding = '0px 5px'
    pObj.style.border = '1px solid black'
    pObj.style.display = 'inline-block'
    if (content == pageInfo.pageNum) pObj.style.background = 'orange'
    // 	5-将p标签追加到【null标签对象】里面
    nullObj.appendChild(pObj)
}
</script>

分页(面向对象)

明确需求
在这里插入图片描述
传统:面向过程代码 写两遍(代码冗余、不便于维护)

封装:过程代码丢到函数里(内存占用)

面向对象:减少代码冗余,便于后期维护,减少内存占用

确定调用语法
明确:js插件就是用js代码写好的功能(例如:轮播图、分页等)

举例:swiper 移动滑动插件(js插件)

回忆swiper插件使用
在这里插入图片描述
需求:参考Swiper封装Pagination插件

let page1 = new Pagination(分页范围选择器,{
  // 分页标签
   pageTag : { 
       first: '首页',
       prev: '上一页',
       list: null,  
       next: '下一页',
       last: '末页',
   },
   
   // 分页页码的数据
   pageInfo = {
       pageNum:  100,    
       pageSize: 10,     
       totalData: 1000  
   }
})

面向对象 代码:

HTML结构部分

<style>
div {
    width: 800px;
    height: 40px;
    border: solid 1px black;
    margin: auto;
}
</style>
<div class="page1"></div>
<div class="page2"></div>
<script src="./pagination.js"></script>
<script>
let page1 = new Pagination('.page1',{
	// 分页标签
    pageTag : { 
        first: '首页',
        prev: '上一页',
        list: null,  
        next: '下一页',
        last: '末页',
    },
    // 分页页码的数据
    pageInfo : {
        pageNum:  100,    
        pageSize: 10,     
        totalData: 1000  
    }
})


let page2 = new Pagination('.page2',{
	// 分页标签
    pageTag : { 
        first: '首页',
        prev: '上一页',
        list: null,  
        next: '下一页',
        last: '末页',
    },
    // 分页页码的数据
    pageInfo : {
        pageNum:  100,    
        pageSize: 10,     
        totalData: 1000  
    }
})

</script>

js功能部分

// function Pagination(el, options)
// {
//     // 一、保存全局数据

//     // 二、调用
//     this.setFatherStyle() 
//     this.this.createPageTag()  // -> this.createPageNum()
// }
// // 二、搞标签
// // 三、搞页码


function Pagination(el, options)
{
    // 一、保存全局数据
    this.el = document.querySelector(el)
    options.pageInfo.totalPage = Math.ceil(options.pageInfo.totalData / options.pageInfo.pageSize)
    this.options = options
    this.nullObj // 定义null标签对象(目的:存放分页页码数据)
    // 二、调用
    this.setFatherStyle() 
    this.createPageTag()  // -> this.createPageNum()
}
// 2.1、搞标签
Pagination.prototype.setFatherStyle = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    let pageTag = this.options.pageTag

    // let divObj = document.querySelector('div')
    divObj.style.display = 'flex'
    divObj.style.justifyContent = 'center'
    divObj.style.alignItems = 'center'
    // divObj.addEventListener('click', function(evt){ // this事件源
    divObj.addEventListener('click', (evt) => { // this新对象
        let e = evt || window.event
        let tagValue = e.target.innerHTML
        if (tagValue == pageTag.first)
        {
            pageInfo.pageNum = 1
            this.createPageTag()
        }
        if (
            tagValue == pageTag.prev
            &&
            pageInfo.pageNum > 1
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) - 1
            this.createPageTag()
        }
    
        if (parseInt(tagValue))
        {
            pageInfo.pageNum = parseInt(tagValue)
            this.createPageTag()
        }
        
        if (
            tagValue == pageTag.next
            &&
            pageInfo.pageNum < pageInfo.totalPage
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) + 1
            this.createPageTag()
        }
        if (tagValue == pageTag.last)
        {
            pageInfo.pageNum = pageInfo.totalPage
            this.createPageTag()
        }
    })
}
// 2.2、搞标签
Pagination.prototype.createPageTag = function() 
{
    let divObj = this.el
    let pageTag = this.options.pageTag
    let pageInfo = this.options.pageInfo

    //=======================
    divObj.innerHTML = ''  // 改变当前页了,需要重新渲染
    //=======================
    // 1. 先遍历pageTag对象(目的:创建分页标签p)
    for (let tag in pageTag) 
    {// tag是对象的键  pageTag[tag]是对象的值
        // 2. 搞分页标签
        // 2.1 创建p标签
        let pObj = document.createElement('p')

        if (tag!='list')
        {
            // 2.2 创建内容
            let textObj = document.createTextNode(pageTag[tag])
            // 2.3 2.2 加到 2.1 中
            pObj.appendChild(textObj)
            // 2.4 设置p标签样式
            // pObj.style.display = 'inline-block'
            pObj.style.margin = '0 5px'
            pObj.style.padding = '0 5px'
            pObj.style.border = 'solid 1px black'
        }
        
        // 2.5 放到div里面
        divObj.appendChild(pObj)
    }

    // 禁用
    // let divPtagObj = document.querySelectorAll('div p')
    let divPtagObj = divObj.querySelectorAll('p')
    // pageInfo.pageNum == 1   禁用 首页 上一页
    if (pageInfo.pageNum == 1)
    {
        divPtagObj[0].style.background = '#ccc'
        divPtagObj[1].style.background = '#ccc'
    }
    // pageInfo.pageNum == pageInfo.totalPage   禁用 下一页 末页
    if (pageInfo.pageNum == pageInfo.totalPage)
    {
        divPtagObj[3].style.background = '#ccc'
        divPtagObj[4].style.background = '#ccc'
    }

    //========================
    this.createPageNum() // 必须分页标签好了在创建分页页码
    //========================
}
// 2.3、搞页码
Pagination.prototype.createPageNum = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    // 1. 获取null标签对象
    // nullObj = document.querySelector('div p:nth-child(3)')
    this.nullObj = divObj.querySelector(' p:nth-child(3)')
    // 2. 按照规则创建分页页码 而且 还要有省略号
    // pageNum<5     1 2 3 4 5 ... 99 100
    // pageNum==5     1 2 3 4 5 6 7 ... 99 100
    // pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
    // pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
    if (pageInfo.pageNum<5) {
        for (let i = 1; i<=5; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum==5) {
        for (let i = 1; i<=7; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) this.createP(i)
        this.createP('...', 'span')
        this.createP(pageInfo.totalPage - 1)
        this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum >= pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) this.createP(i)
    }
}


Pagination.prototype.createP = function(content, tag= 'p')
{
    let pageInfo = this.options.pageInfo

    // 2.1 创建p标签
    let pObj = document.createElement(tag)
    // 2.2 创建内容
    let textObj = document.createTextNode(content)
    // 2.3 2.2 加到 2.1 中
    pObj.appendChild(textObj)
    // 2.4 设置p标签样式
    pObj.style.display = 'inline-block'
    pObj.style.margin = '0 5px'
    pObj.style.padding = '0 5px'
    pObj.style.border = 'solid 1px black'
    if (content == pageInfo.pageNum)  pObj.style.background = 'orange'
    // 放到 nullObj 中
    this.nullObj.appendChild(pObj)
}

回调函数
回调:顾名思义就是回头调用的函数

需求:当你每次点击分页后,调用函数,一个实参当前页(注:函数在配置中定义)
html

<div class="page1"></div>
<!-- <div class="page2"></div> -->
<script src="pagination.js"></script>
<script>
let pageN = new Pagination('.page1',{
    // 分页标签
    pageTag : { 
        first: '首页',
        prev: '上一页',
        list: null,  
        next: '下一页',
        last: '末页',
    },
    // 分页页码的数据
    pageInfo : {
        pageNum:  1,    
        pageSize: 10,     
        totalData: 1000  
    },
    // 点击分页,触发该函数
    // ES5 changePage: function() {}
    // ES6
    changePage(currentPageNum) {
        console.log(currentPageNum)
    }
})


// let page2 = new Pagination('.page2',{
//     // 分页标签
//     pageTag : { 
//         first: 'first',
//         prev: 'prev',
//         list: null,  
//         next: 'next',
//         last: 'last',
//     },
//     // 分页页码的数据
//     pageInfo : {
//         pageNum:  100,    
//         pageSize: 10,     
//         totalData: 1000  
//     }
// })
</script>

js功能

// function Pagination(el, options)
// {
//     // 一、保存全局数据

//     // 二、调用
//     this.setFatherStyle() 
//     this.this.createPageTag()  // -> this.createPageNum()
// }
// // 二、搞标签
// // 三、搞页码


function Pagination(el, options)
{
    // 一、保存全局数据
    this.el = document.querySelector(el)
    options.pageInfo.totalPage = Math.ceil(options.pageInfo.totalData / options.pageInfo.pageSize)
    this.options = options
    this.nullObj // 定义null标签对象(目的:存放分页页码数据)
    // 二、调用
    this.setFatherStyle() 
    this.createPageTag()  // -> this.createPageNum()
}
// 2.1、搞标签
Pagination.prototype.setFatherStyle = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    let pageTag = this.options.pageTag

    // let divObj = document.querySelector('div')
    divObj.style.display = 'flex'
    divObj.style.justifyContent = 'center'
    divObj.style.alignItems = 'center'
    // divObj.addEventListener('click', function(evt){ // this事件源
    divObj.addEventListener('click', (evt) => { // this新对象
        let e = evt || window.event
        let tagValue = e.target.innerHTML
        if (tagValue == pageTag.first)
        {
            pageInfo.pageNum = 1
            this.createPageTag()
        }
        if (
            tagValue == pageTag.prev
            &&
            pageInfo.pageNum > 1
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) - 1
            this.createPageTag()
        }
    
        if (parseInt(tagValue))
        {
            pageInfo.pageNum = parseInt(tagValue)
            this.createPageTag()
        }
        
        if (
            tagValue == pageTag.next
            &&
            pageInfo.pageNum < pageInfo.totalPage
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) + 1
            this.createPageTag()
        }
        if (tagValue == pageTag.last)
        {
            pageInfo.pageNum = pageInfo.totalPage
            this.createPageTag()
        }
    })
}

// 2.2、搞标签
Pagination.prototype.createPageTag = function() 
{
    let divObj = this.el
    let pageTag = this.options.pageTag
    let pageInfo = this.options.pageInfo

    //=======================
    divObj.innerHTML = ''  // 改变当前页了,需要重新渲染
    //=======================
    // 1. 先遍历pageTag对象(目的:创建分页标签p)
    for (let tag in pageTag) 
    {// tag是对象的键  pageTag[tag]是对象的值
        // 2. 搞分页标签
        // 2.1 创建p标签
        let pObj = document.createElement('p')

        if (tag!='list')
        {
            // 2.2 创建内容
            let textObj = document.createTextNode(pageTag[tag])
            // 2.3 2.2 加到 2.1 中
            pObj.appendChild(textObj)
            // 2.4 设置p标签样式
            // pObj.style.display = 'inline-block'
            pObj.style.margin = '0 5px'
            pObj.style.padding = '0 5px'
            pObj.style.border = 'solid 1px black'
        }
        
        // 2.5 放到div里面
        divObj.appendChild(pObj)
    }

    // 禁用
    // let divPtagObj = document.querySelectorAll('div p')
    let divPtagObj = divObj.querySelectorAll('p')
    // pageInfo.pageNum == 1   禁用 首页 上一页
    if (pageInfo.pageNum == 1)
    {
        divPtagObj[0].style.background = '#ccc'
        divPtagObj[1].style.background = '#ccc'
    }
    // pageInfo.pageNum == pageInfo.totalPage   禁用 下一页 末页
    if (pageInfo.pageNum == pageInfo.totalPage)
    {
        divPtagObj[3].style.background = '#ccc'
        divPtagObj[4].style.background = '#ccc'
    }

    //========================
    this.createPageNum() // 必须分页标签好了在创建分页页码
    //========================
}
// 2.3、搞页码
Pagination.prototype.createPageNum = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    // 1. 获取null标签对象
    // nullObj = document.querySelector('div p:nth-child(3)')
    this.nullObj = divObj.querySelector(' p:nth-child(3)')
    // 2. 按照规则创建分页页码 而且 还要有省略号
    // pageNum<5     1 2 3 4 5 ... 99 100
    // pageNum==5     1 2 3 4 5 6 7 ... 99 100
    // pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
    // pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
    if (pageInfo.pageNum<5) {
        for (let i = 1; i<=5; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum==5) {
        for (let i = 1; i<=7; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) this.createP(i)
        this.createP('...', 'span')
        this.createP(pageInfo.totalPage - 1)
        this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum >= pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) this.createP(i)
    }

    //=========================
    // 页码渲染完毕调用
    this.options.changePage(this.options.pageInfo.pageNum)
}


Pagination.prototype.createP = function(content, tag= 'p')
{
    let pageInfo = this.options.pageInfo

    // 2.1 创建p标签
    let pObj = document.createElement(tag)
    // 2.2 创建内容
    let textObj = document.createTextNode(content)
    // 2.3 2.2 加到 2.1 中
    pObj.appendChild(textObj)
    // 2.4 设置p标签样式
    pObj.style.display = 'inline-block'
    pObj.style.margin = '0 5px'
    pObj.style.padding = '0 5px'
    pObj.style.border = 'solid 1px black'
    if (content == pageInfo.pageNum)  pObj.style.background = 'orange'
    // 放到 nullObj 中
    this.nullObj.appendChild(pObj)
}

分页两种形式

- 服务端分页:你传递当前第几页和每页显示条数给java  它来计算 返回对应也的数据给你 

- 客户端分页*:java把数据库数据全部给你,你实现分页效果(1-数据全给你,2-根据情况显示)

实现分页中插入数据(数据准备)

<table border="1" cellspacing="0">
    <thead>
        <tr>
        <th>序号</th>
        <th>学生ID</th>
        <th>学生姓名</th>
        <th>学生年龄</th>
        <th>学生性别</th>
        <th>学生班级</th>
        <th>学生成绩</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<script>
// 用来准备数据
const firstName = '赵钱孙李周吴郑王冯陈楚魏将沈韩杨朱琴尤许何吕施章'
const laseName = '氢氦锂铍硼碳氮氧氟氖钠镁铝硅磷硫氯氩钾钙'
const thirdName = '一二三四五六七八九十'
const gender = '男女'
const fn = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a

const tableDataArr = []
for (let i = 0; i <= 1000; i++) {
    tableDataArr.push({
    id: i + 1,
    name: firstName[fn(0, 23)] + laseName[fn(0, 19)] + thirdName[fn(0, 9)],
    age: fn(16, 30),
    gender: gender[fn(0, 1)],
    class: fn(1910, 1920),
    score: fn(40, 100)
    })
}
console.log(tableDataArr)
</script>

实现分页(输出下述需求数据)

每页10条

第一页 1-10

第二页 11-20

第三页 21-30

优化:定义定义pageNum变量,动态输出

<table border="1" cellspacing="0">
    <thead>
        <tr>
        <th>序号</th>
        <th>学生ID</th>
        <th>学生姓名</th>
        <th>学生年龄</th>
        <th>学生性别</th>
        <th>学生班级</th>
        <th>学生成绩</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<script>
// 用来准备数据
const firstName = '赵钱孙李周吴郑王冯陈楚魏将沈韩杨朱琴尤许何吕施章'
const laseName = '氢氦锂铍硼碳氮氧氟氖钠镁铝硅磷硫氯氩钾钙'
const thirdName = '一二三四五六七八九十'
const gender = '男女'
const fn = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a

const tableDataArr = []
for (let i = 0; i <= 1000; i++) {
    tableDataArr.push({
        id: i + 1,
        name: firstName[fn(0, 23)] + laseName[fn(0, 19)] + thirdName[fn(0, 9)],
        age: fn(16, 30),
        gender: gender[fn(0, 1)],
        class: fn(1910, 1920),
        score: fn(40, 100)
    })
}
console.log(tableDataArr)

/*
已知:当前页pageNum

第一页  开始位置 0   终止 10      (1-1)*10=0
第二页  开始位置 10  终止 20      (2-1)*10=10
第三页  开始位置 20  终止 30      (3-1)*10=20

开始位置分页固定公式:(当前页 - 1) * 每页显示条数
终止位置公式:开始位置 + 每页显示条数
*/

// 需求:不要每次该多个东西,改的头疼
// 直接声明pageNum变量 从而显示对应页数据
let pageNum = 4
let pageSize = 10
let startno = (pageNum - 1) * pageSize

// 1. 获取tbody
let tbodyObj = document.querySelector('tbody')
// 2. 通过for循环拼接每页数据
let html = ``
// for (let i = 0; i<10; i++) { //第一页  1-10
// for (let i = 10; i<20; i++) { //第二页  11-20
// for (let i = 20; i<30; i++) { //第三页  21-30
for (let i = startno; i<startno+pageSize; i++) {
    // 每条数据 tableDataArr[i]  对象
    html += `
    <tr>
        <td>${i}</td>
        <td>${tableDataArr[i].id}</td>
        <td>${tableDataArr[i].name}</td>
        <td>${tableDataArr[i].age}</td>
        <td>${tableDataArr[i].gender}</td>
        <td>${tableDataArr[i].class}</td>
        <td>${tableDataArr[i].score}</td>
    </tr>
    `
}
// 3. 放到tbody中
tbodyObj.innerHTML = html
</script>

分页最终版(带数据)

html

<table border="1" cellspacing="0">
    <thead>
        <tr>
        <th>序号</th>
        <th>学生ID</th>
        <th>学生姓名</th>
        <th>学生年龄</th>
        <th>学生性别</th>
        <th>学生班级</th>
        <th>学生成绩</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>

<div class="page"></div>    
<script src="./pagination.js"></script>
<script>
// 用来准备数据
const firstName = '赵钱孙李周吴郑王冯陈楚魏将沈韩杨朱琴尤许何吕施章'
const laseName = '氢氦锂铍硼碳氮氧氟氖钠镁铝硅磷硫氯氩钾钙'
const thirdName = '一二三四五六七八九十'
const gender = '男女'
const fn = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a

const tableDataArr = []
for (let i = 0; i <= 1000; i++) {
    tableDataArr.push({
        id: i + 1,
        name: firstName[fn(0, 23)] + laseName[fn(0, 19)] + thirdName[fn(0, 9)],
        age: fn(16, 30),
        gender: gender[fn(0, 1)],
        class: fn(1910, 1920),
        score: fn(40, 100)
    })
}
console.log(tableDataArr)


// 分页显示数据
let page = new Pagination('.page', {
    // 分页标签
    pageTag : { 
        first: '首页',
        prev: '上一页',
        list: null,  
        next: '下一页',
        last: '末页',
    },
    // 分页页码的数据
    pageInfo : {
        pageNum: 5,    
        pageSize: 10,     
        totalData: tableDataArr.length  
    },
    // 点击分页触发
    changePage(currentPageNum) {
        console.log(currentPageNum)

        // 1. 获取tbody
        let tbodyObj = document.querySelector('tbody')
        // 2. 遍历显示数据,(当前页-1)*每页显示条数
        
        let startno = (currentPageNum-1) * this.pageInfo.pageSize

        let html = ``
        // for (let i = 开始位置; i<终止; i++) {
        for (let i = startno; i<startno+this.pageInfo.pageSize; i++) {
            // 每条数据 tableDataArr[i]  对象
            html += `
            <tr>
                <td>${i}</td>
                <td>${tableDataArr[i].id}</td>
                <td>${tableDataArr[i].name}</td>
                <td>${tableDataArr[i].age}</td>
                <td>${tableDataArr[i].gender}</td>
                <td>${tableDataArr[i].class}</td>
                <td>${tableDataArr[i].score}</td>
            </tr>
            `
        }
        // 3. 放到tbody中 
        tbodyObj.innerHTML = html
    }
})
</script>

js功能

// function Pagination(el, options)
// {
//     // 一、保存全局数据

//     // 二、调用
//     this.setFatherStyle() 
//     this.this.createPageTag()  // -> this.createPageNum()
// }
// // 二、搞标签
// // 三、搞页码


function Pagination(el, options)
{
    // 一、保存全局数据
    this.el = document.querySelector(el)
    options.pageInfo.totalPage = Math.ceil(options.pageInfo.totalData / options.pageInfo.pageSize)
    this.options = options
    this.nullObj // 定义null标签对象(目的:存放分页页码数据)
    // 二、调用
    this.setFatherStyle() 
    this.createPageTag()  // -> this.createPageNum()
}
// 2.1、搞标签
Pagination.prototype.setFatherStyle = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    let pageTag = this.options.pageTag

    // let divObj = document.querySelector('div')
    divObj.style.display = 'flex'
    divObj.style.justifyContent = 'center'
    divObj.style.alignItems = 'center'
    // divObj.addEventListener('click', function(evt){ // this事件源
    divObj.addEventListener('click', (evt) => { // this新对象
        let e = evt || window.event
        let tagValue = e.target.innerHTML
        
        if (tagValue == pageTag.first)
        {
            pageInfo.pageNum = 1
            this.createPageTag()
            // this.options.changePage(pageInfo.pageNum)
        }
        if (
            tagValue == pageTag.prev
            &&
            pageInfo.pageNum > 1
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) - 1
            this.createPageTag()
            // this.options.changePage(pageInfo.pageNum)
        }
    
        if (parseInt(tagValue))
        {
            pageInfo.pageNum = parseInt(tagValue)
            this.createPageTag()
            // this.options.changePage(pageInfo.pageNum)
        }
        
        if (
            tagValue == pageTag.next
            &&
            pageInfo.pageNum < pageInfo.totalPage
        )
        {
            pageInfo.pageNum = parseInt(pageInfo.pageNum) + 1
            this.createPageTag()
            // this.options.changePage(pageInfo.pageNum)
        }
        if (tagValue == pageTag.last)
        {
            pageInfo.pageNum = pageInfo.totalPage
            this.createPageTag()
            // this.options.changePage(pageInfo.pageNum)
        }
    })
}

// 2.2、搞标签
Pagination.prototype.createPageTag = function() 
{
    let divObj = this.el
    let pageTag = this.options.pageTag
    let pageInfo = this.options.pageInfo

    //=======================
    divObj.innerHTML = ''  // 改变当前页了,需要重新渲染
    //=======================
    // 1. 先遍历pageTag对象(目的:创建分页标签p)
    for (let tag in pageTag) 
    {// tag是对象的键  pageTag[tag]是对象的值
        // 2. 搞分页标签
        // 2.1 创建p标签
        let pObj = document.createElement('p')

        if (tag!='list')
        {
            // 2.2 创建内容
            let textObj = document.createTextNode(pageTag[tag])
            // 2.3 2.2 加到 2.1 中
            pObj.appendChild(textObj)
            // 2.4 设置p标签样式
            // pObj.style.display = 'inline-block'
            pObj.style.margin = '0 5px'
            pObj.style.padding = '0 5px'
            pObj.style.border = 'solid 1px black'
        }
        
        // 2.5 放到div里面
        divObj.appendChild(pObj)
    }

    // 禁用
    // let divPtagObj = document.querySelectorAll('div p')
    let divPtagObj = divObj.querySelectorAll('p')
    // pageInfo.pageNum == 1   禁用 首页 上一页
    if (pageInfo.pageNum == 1)
    {
        divPtagObj[0].style.background = '#ccc'
        divPtagObj[1].style.background = '#ccc'
    }
    // pageInfo.pageNum == pageInfo.totalPage   禁用 下一页 末页
    if (pageInfo.pageNum == pageInfo.totalPage)
    {
        divPtagObj[3].style.background = '#ccc'
        divPtagObj[4].style.background = '#ccc'
    }

    //========================
    this.createPageNum() // 必须分页标签好了在创建分页页码
    //========================
}
// 2.3、搞页码
Pagination.prototype.createPageNum = function() 
{
    let divObj = this.el
    let pageInfo = this.options.pageInfo
    // 1. 获取null标签对象
    // nullObj = document.querySelector('div p:nth-child(3)')
    this.nullObj = divObj.querySelector(' p:nth-child(3)')
    // 2. 按照规则创建分页页码 而且 还要有省略号
    // pageNum<5     1 2 3 4 5 ... 99 100
    // pageNum==5     1 2 3 4 5 6 7 ... 99 100
    // pageNum>5 && pageNum < 总页数-4    1 2 ... 4 5 [6] 7 8 ... 99 100 
    // pageNum >= 总页数-4        1 2 ... 96 97 98 99 100
    if (pageInfo.pageNum<5) {
        for (let i = 1; i<=5; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum==5) {
        for (let i = 1; i<=7; i++) this.createP(i)
       this.createP('...', 'span')
       this.createP(pageInfo.totalPage - 1)
       this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum>5 && pageInfo.pageNum < pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.pageNum-2; i<=pageInfo.pageNum+2; i++) this.createP(i)
        this.createP('...', 'span')
        this.createP(pageInfo.totalPage - 1)
        this.createP(pageInfo.totalPage)
    } else if (pageInfo.pageNum >= pageInfo.totalPage - 4) {
        this.createP(1)
        this.createP(2)
        this.createP('...', 'span')
        for (let i = pageInfo.totalPage-4; i<=pageInfo.totalPage; i++) this.createP(i)
    }

    //=========================
    // 页码渲染完毕调用
    this.options.changePage(this.options.pageInfo.pageNum)
}


Pagination.prototype.createP = function(content, tag= 'p')
{
    let pageInfo = this.options.pageInfo

    // 2.1 创建p标签
    let pObj = document.createElement(tag)
    // 2.2 创建内容
    let textObj = document.createTextNode(content)
    // 2.3 2.2 加到 2.1 中
    pObj.appendChild(textObj)
    // 2.4 设置p标签样式
    pObj.style.display = 'inline-block'
    pObj.style.margin = '0 5px'
    pObj.style.padding = '0 5px'
    pObj.style.border = 'solid 1px black'
    if (content == pageInfo.pageNum)  pObj.style.background = 'orange'
    // 放到 nullObj 中
    this.nullObj.appendChild(pObj)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值