面向对象框架格式
下面以自动轮播图(插件)为例
写插件潜规则:构造函数中保存标签等属性,原型方法中使用一个个功能
<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)
}