当前位置: 首页 > news >正文

大二第四周总结——用原生js封装一个分页器

用原生js封装一个分页器

起因:这次项目还是用原生的js来写的,我负责的是后台,分页是后台最常见的一个功能了,于是干脆封装一下,废话少说,直接上代码

这里是基本的样式

.pagination {display: flex;width: 600px;height: 35px;margin: 0 auto;margin-left: 275px;/* border: 1px solid red; */
}.pagination span a {box-sizing: border-box;text-decoration: none;color: black;
}.pagination span {/* border: 1px solid red; */text-align: center;width: 40px;height: 35px;line-height: 35px;margin: 0px 2px;
}.pagination span i {font-size: 10px;font-weight: 100;
}.pagination span img {width: 30px;height: 25px;
}.pagination .pageStyle a {display: block;text-align: center;width: 40px;height: 35px;line-height: 35px;/* background-color: bisque; */border: 1px solid #ccc;border-radius: 5px;
}.pagination .pageStyle a:hover {border: 1px solid rgb(27, 129, 121);
}.pagination .active {background-color: cadetblue;
}

这个是在js里面定义的一个分页器类

class PageClass {                               //定义一个分页器类      constructor(ele, pageNum, page, cb) {   //需要传入4个参数,第一个容器元素,第二个页面总数,第三个当前页面数,第四个为回调函数this.ele = ele;            //定义属性this.pageNum = pageNum;this.page = page;this.cb = cb;this.renderPage();     //执行渲染的方法this.operate();         //给实例化对象绑定各种操作的方法}renderPage() {                   //在类的原型上定义一个渲染的方法let str = '';if (this.pageNum > 5) {     //判断当前分页的页面总数是否超过5页if (this.page <= 4) {         //如果页面总数大于5  ,再判断当前页是否小于或者等于第四页for (let i = 0; i < 5; i++) {        //如果当前页是小于等于4以内的页数 ,遍历1到5if ((i + 1) == this.page) {       //判断当前页是否等于 当前   索引值(索引值从0开始) +  1str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//等于的话说明渲染的是当前页,给当前页一个active的类名进行渲染} else {  //如果渲染的不是当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//普通渲染就行了}}str += `<span><i>•••</i></span><span class="pageStyle" myPage="${this.pageNum}"><a href="javascript:;">${this.pageNum}</a></span>`;//最后渲染一个最末尾页} else if (this.page > 4 && this.page < this.pageNum - 3) {   //判断当前页是否大于第四页,且小于最大页数减去 3 str += `<span class="pageStyle" myPage="1"><a href="javascript:;">1</a></span><span><i>•••</i></span>`; //渲染一个首页for (let i = this.page - 3; i < this.page + 2; i++) {if ((i + 1) == this.page) { //判断当前正在渲染的是否为当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//如果是当前页,给一个active类名进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//如果不是,普通渲染就行}}str += `<span><i>•••</i></span><span class="pageStyle" myPage="${this.pageNum}"><a href="javascript:;">${this.pageNum}</a></span>`;//渲染一个尾页} else if (this.page >= this.pageNum - 3) {//如果当前页数大于或者等于最大页数 - 3 str += `<span class="pageStyle" myPage="1"><a href="javascript:;">1</a></span><span><i>•••</i></span>`; //渲染一个首页for (let i = this.pageNum - 5; i < this.pageNum; i++) {//从倒数第5页开始渲染if ((i + 1) == this.page) {   //如果渲染的是当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//增加一个active类名,进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//否则普通渲染}}}} else {        //如果最大页数小于等于5for (let i = 0; i < this.pageNum; i++) {     //直接渲染到当前最大页数if ((i + 1) == this.page) {           //判断渲染的是否为当前页数str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//如果是增加一个active类名,进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//否则普通渲染就行了}}}//将所有内容渲染到容器盒子里//第一页//上一页//中间页面//下一页//最后一页this.ele.innerHTML = `<span class="first"><a href="javascript:;"> <img src="/public/img/index.png" alt=""></a></span><span class="prev"><a href="javascript:;"><img src="/public/img/before.png" alt=""></a></span>${str}<span class="next"><a href="javascript:;"><img src="/public/img/after.png" alt=""></a></span><span class="last"><a href="javascript:;"><img src="/public/img/end.png" alt=""></a></span>` ;}operate() {                  //在类原型上定义一个operate的方法,给这个类绑定点击事件const _that = this;        //申明一个常量接收thislet firstEle = this.ele.querySelector(".first");    //获取第一页的元素let lastEle = this.ele.querySelector(".last");      //获取最后一页的元素let nextEle = this.ele.querySelector(".next");      //获取下一页的元素let prevEle = this.ele.querySelector(".prev");      //获取上一页的元素let pageStyleEles = this.ele.querySelectorAll(".pageStyle");    //获取所有的中间页面的元素firstEle.onclick = function () {     //当点击第一页时_that.page = 1;                //让page属性重新赋值为1_that.cb(_that.page);           //并将page属性通过回调函数cb传递出去}lastEle.onclick = function () {      //当点击最后一页时_that.page = _that.pageNum;    //让page属性重新赋值为页面最大值_that.cb(_that.page);          //并将page属性通过回调函数cb传递出去}nextEle.onclick = function () {      //当点击下一页时if (_that.page < _that.pageNum) {   //先判断当前页是否小于最大页_that.page = _that.page + 1;   //如果没有超过,给page属性自增1_that.cb(_that.page);           //并将page属性通过回调函数cb传递出去}}prevEle.onclick = function () {      //当点击上一页时if (_that.page > 1) {           //先判断当前页是否大于第一页_that.page = _that.page - 1;   //如果是大于第一页的话,page属性自减1_that.cb(_that.page);           //并将page属性通过回调函数cb传递出去}}pageStyleEles.forEach(function (pageStyleEle) {       //遍历获取到中间页面的所有元素pageStyleEle.onclick = function () {                //当点击其中一页时_that.page = parseInt(this.getAttribute("myPage")); //获取这个元素自定义属性,myPage,属性值是当前页 ,并将当前页赋值给page属性_that.cb(_that.page);                           //将page属性通过回调函数cb传递出去}});}}

在html页面中

只需要防止这样的一个盒子就行了

  <div class="pagination"> </div>

使用的时候,js里面这样写

let pageEle = document.querySelector(".pagination");            //获取页面渲染的容器
ready(1);                                                   //调用渲染容器的方法,传递初始页面为1
function ready(page) {                                       // 定义一个方法用来渲染容器new PageClass(pageEle, 1000, page, function (page) {         //new 一个PageClass类,传递容器元素,总页面数,当前页面,以及回调函数console.log(page, '看看点击Page的时候页面是否会发生变化');ready(page); //回调函数调用渲染容器的方法getAllUsers(10, page);//这个是自定义的页面变化的时候获取页面数据的渲染表格的方法});
}

整个跑起来大致就是这个样子

至于显示的这个回到首页,上一页,下一页,回到最后一页的图片,可以去阿里妈妈图标库去看看,挑选自己喜欢的。分享到这里就结束了

学技术的话,看到这里就行。


我是分割线


个人的小感悟

很多人可能会选择在过年或者是期末的时候进行总结,那为什么会选择现在进行来一波回忆杀呢?

因为,距离我去年将要加入未来软件工作室就不到4天的时间了。

对我来说,这一年的成长,也许,技术也许是次要的,心理的成长占了绝大部分。

去年的这个时候,来大学快一个月的时间了,对学校的基本情况了解的差不多了,知道了未来是学校最强的小组,一股劲儿的想要来到这里,找到了当时小组大三的学姐,然后学姐把我拉进了未来软件工作室的招新群,等待工作室正式开始招新投简历,然后面试,分到未来五组当中,融入新的团体.......这就是梦的开始,也是很多事情的开始,若要究其根本,命运的齿轮究竟是从什么时候开始转动的 ? 可能是偷偷改志愿学计算机,可能是报考之后在贴吧四处找寻学校信息从此多了一位师父照拂,可能是在知乎找到了熟知学校信息的计算机学姐,从此多了一位领路人,一切的一切,把大学的画卷铺开在我面前......

去年这一年

有难关面前,能成为家人依靠的成就感

有熬夜到凌晨3,4点,连续3天睡眠时间不超过10个小时但依然活力满满的冲劲儿

有趁着水课多,连着整整睡了4,5天的疲惫

有被一次一次的抛弃,再一次一次的振作

有用自己学到的东西解决问题时候的喜悦

更有无数个加一个瞬间把自己从堕落中拉出来

专研自己的热爱

从书中寻找共鸣

去西安看看那富贵迷人眼

看那没被污染前的海

......

一些事情到此完成闭环。

我看到的,我感受的,

回忆太多,可是,经历过的千千万,都抵不过当下这一瞬间的永恒。

相关文章:

大二第四周总结——用原生js封装一个分页器

用原生js封装一个分页器 起因&#xff1a;这次项目还是用原生的js来写的&#xff0c;我负责的是后台&#xff0c;分页是后台最常见的一个功能了&#xff0c;于是干脆封装一下,废话少说&#xff0c;直接上代码 这里是基本的样式 .pagination {display: flex;width: 600px;hei…...

智能AI系统ChatGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

ARM Linux 基础学习 / 系统相关,文件系统,文件属性

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…...

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站&#xff0c;默认是走的 https&#xff0c;其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径&#xff0c;并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…...

算法通关村第八关-白银挑战二叉树的深度和高度问题

大家好我是苏麟 , 今天说说几道二叉树深度和高度相关的题目 . LeetCode给我们造了一堆的题目&#xff0c;研究一下104、110和111三个题&#xff0c;这三个颗看起来挺像的&#xff0c;都是关于深度、高度的。 最大深度问题 描述 : 二叉树的 最大深度 是指从根节点到最远叶子…...

使用LogBack替换Log4j

目录 1.删除log4j有关的依赖&#xff0c;添加logBack依赖 2.删除log4j配置文件&#xff0c;增加logback.xml配置文件 3.更改application.yml配置文件&#xff0c;log文件指向logback.xml 4.重启 1.删除log4j有关的依赖&#xff0c;添加logBack依赖 <dependency><gr…...

财务报告是什么

财务报告是什么 财务报告是企业对外提供的反映企业某一特定日期的财务状况和某一会计期间的经营成果、现金流量等会计信息的文件。 根据财务报告的定义&#xff0c;财务报告具有以下几层含义&#xff1a;一是财务报告应当是对外报告&#xff0c;其服务对象主要是投资者、债权人…...

SOME/IP 协议介绍(四)RPC协议规范

RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息&#xff0c;可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释&#xff0c;而第[SIP_RPC_450页&#xff0c;第36页]节讨论了选择哪种传输协议。…...

PostgreSQL基础入门

为什么选择PostgreSQL 功能更全面&#xff1a;PGSQL的功能更加全面&#xff0c;支持开窗函数、物化视图、分区表、json等类型&#xff0c;MySQL8以上支持开窗函数、分区表、json等&#xff0c;但物化视图仍不支持。高可用&#xff1a;PG更适合分布式环境&#xff0c;如流复制、…...

Django 密码管理:安全实践与技术深入

在 Web 应用的开发中&#xff0c;密码管理是保障用户安全的关键环节。Django 作为一个强大的 Python Web 框架&#xff0c;提供了一套全面的系统来处理密码的存储、验证和安全。本文将详细探讨 Django 中的密码管理机制&#xff0c;包括密码存储、密码验证、密码安全策略以及自…...

说说你对React Router的理解?常用的Router组件有哪些?

一、是什么 react-router等前端路由的原理大致相同&#xff0c;可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时&#xff0c;页面的显示结果可以根据URL的变化而变化&#xff0c;但是页面不会刷新 因此&#xff0c;可以通过前端路由可以实现单…...

“可一学院”新课程《区块链企业应用》正式上线

2023年8月&#xff0c;上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日&#xff0c;可一学院正式推出一门新课程《区块链企业应用》&#xff0c;这门课程将帮助学习者了解企业需要什么样的区块链&#xff0c;以及应该如何运用这项技术来推动自身…...

Springboot---整合对象储存服务MinIO

OSS 「OSS」的英文全称是Object Storage Service&#xff0c;翻译成中文就是「对象存储服务」&#xff0c;官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上&#xff0c;该云硬盘提供了…...

HDRP图形入门:HDRP渲染管线depth翻转

新项目开坑HDRP渲染管线&#xff0c;花了些时间把项目开发框架和图形工作流更新到最新版本&#xff0c;其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线&#xff0c;距离摄像机越近depth->0&#xff0c;越远depth->1&#xff0c;这也很好理…...

uniapp——项目02

分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色&#xff0c;又在尾部加了个红条一样的东西。 export d…...

Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信

目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...

gitlab-ce-12.3.5 挖矿病毒及解决方案

前言 最近发现在使用gitlab提交代码的时候总是失败&#xff0c;一访问gitlab还时常报503&#xff0c;于是使用 top 命令查看了内存占用情况&#xff0c;发现了一个git进程内存使用了2.3g&#xff0c;cpu还一直占用300-400%&#xff0c; 以前不知道gitlab还有病毒&#xff0c;只…...

每日一题(LeetCode)----数组--移除元素(四)

每日一题(LeetCode)----数组–移除元素&#xff08;四&#xff09; 1.题目&#xff08;[844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)&#xff09; 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&…...

421. 数组中两个数的最大异或值/字典树【leetcode】

421. 数组中两个数的最大异或值 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 输入&#xff1a;nums [3,10,5,25,2,8] 输出&#xff1a;28 解释&#xff1a;最大运算结果是 5 XOR…...

C++(20):自定义类型实现基于范围的for循环

C自定义类型&#xff0c;可以通过实现begin和end作为成员函数&#xff0c;来支持基于范围的for循环 #include <iostream>class D{ public:int* begin(){return m_data;}int* end(){return m_data 5;} private:int m_data[5]{1, 2, 3, 4, 5}; };int main() {D d;for (in…...

PlugY:暗黑破坏神2单机体验增强的技术解决方案

PlugY&#xff1a;暗黑破坏神2单机体验增强的技术解决方案 一、价值定位&#xff1a;PlugY的技术革新与核心优势 跨角色资源池的实现机制 PlugY通过创新的共享存储架构&#xff0c;突破了原版游戏角色间的资源壁垒。该系统采用分布式存储模型&#xff0c;将物品数据与角色数据分…...

数字孪生与工业大脑:SOP+VisuCAD 的协同中枢

数字孪生是物理实体的数字化镜像&#xff0c;通过实时数据同步、动态仿真与虚拟映射&#xff0c;实现物理世界与数字世界的双向映射与闭环优化。工业大脑是工业智能的决策中枢&#xff0c;整合数据、模型、知识与算力&#xff0c;完成全局分析、智能决策与协同调度。在 JBoltAI…...

一文搞懂 Spring Cloud:从入门到实战的微服务全景指南(建议收藏)喝

一、中间件是啥&#xff1f;咱用“餐厅”打个比方 想象一下&#xff0c;你的FastAPI应用是个高级餐厅。 ?? 顾客&#xff08;客户端请求&#xff09;来到门口。- 迎宾&#xff08;CORS中间件&#xff09;&#xff1a;先看你是不是从允许的街区&#xff08;域名&#xff09;来…...

Keil5项目模块化实战:将STM32标准外设驱动打包成GCC编译的.a静态库

Keil5项目模块化实战&#xff1a;将STM32标准外设驱动打包成GCC编译的.a静态库 在嵌入式开发中&#xff0c;随着项目规模扩大和复杂度提升&#xff0c;代码复用和模块化管理变得尤为重要。将常用的外设驱动&#xff08;如GPIO、USART等&#xff09;编译成静态库&#xff08;.a文…...

三极管有源滤波电路真的可以工作吗?

超简单的三极管有源滤波电路 01 【三极管有源滤波】 一、滤波电路 今天看到一个B站视频&#xff0c; 介绍使用三极管进行有源滤波的电路。 这个三极管有源滤波电路&#xff0c; 串联在整流电路的后边&#xff0c; 对输出波纹进行滤波。 那么问题来了&#xff0c; 究竟这个电路…...

击败PI!星动纪元登顶具身奥林匹克,狂揽三项全球冠军

田晏林 发自 凹非寺量子位 | 公众号 QbitAI人工智能和机器人领域&#xff0c;有一个反直觉现象&#xff1a;往往人类觉得复杂、困难的任务&#xff0c;机器人做起来很容易&#xff1b;而人类不以为意的一些感知与运动技能&#xff0c;让机器复现异常困难。就像AlphaGo可以轻松打…...

C2000系列DSP通过串口实现hex/bin文件远程更新的完整指南

1. 为什么需要串口远程更新DSP程序&#xff1f; 在工业现场调试C2000系列DSP时&#xff0c;经常会遇到这样的困境&#xff1a;设备安装在密闭机柜里&#xff0c;或者部署在高空、危险区域&#xff0c;每次程序更新都需要打开机箱连接JTAG调试器&#xff0c;既费时又存在安全隐患…...

等保三级 + 密评双达标:SQL Server TDE + 脱敏最佳实践

一、一次审计惊魂&#xff1a;备份硬盘丢失&#xff0c;患者数据险遭泄露去年底&#xff0c;我院一台 SQL Server 2019 备份服务器因机房搬迁&#xff0c;一块存有全量患者数据的硬盘意外遗失。虽未确认是否被恶意获取&#xff0c;但根据《个人信息保护法》第51条&#xff1a;“…...

洞穴民宿的装修材料有哪些?

洞穴民宿的装修材料有哪些&#xff1f;在旅游市场不断发展的当下&#xff0c;洞穴民宿以其独特的风格和体验吸引着众多游客。那么&#xff0c;打造洞穴民宿需要用到哪些装修材料呢&#xff1f;天然石材天然石材是洞穴民宿装修的常用材料。如石灰岩、砂岩等&#xff0c;这些石材…...

瑞芯微RGA驱动更新全解析:从librga源码到内核编译的完整链路

瑞芯微RGA驱动更新全解析&#xff1a;从librga源码到内核编译的完整链路 在嵌入式开发领域&#xff0c;图形加速处理器的驱动更新往往被视为"黑箱操作"——开发者只需按照文档执行几条命令&#xff0c;却很少有机会理解背后的完整技术链路。本文将深入剖析瑞芯微RK35…...