js分页器

article/2025/8/24 4:42:37

写分页器的时候引用别人的js总是不能达到自己想要的效果,在这里记录下自制分页器的历程

html部分

<!DOCTYPE html>
<html>
<head><title></title><meta charset="utf-8" /><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<style>#pager{padding: 0;float: left;margin:10px;width: 400px;height: 30px;}#pager li{width: 30px;height: 30px;line-height: 30px;margin: 0 3px 0 3px;text-align: center;vertical-align: top;display: inline-block;list-style: none;border-radius: 4px;cursor: default;}.pagerBtn{color: #333;background: white;border: 1px solid #DADADA;}.pagerBtn:hover{background:rgb(201, 201, 255);}.pagerChoosed{color: #FFF;background: deepskyblue;border: 1px solid #00B9CC;}.pagerOmit{color: #333;background: #F9F9F9;border: 1px solid #DADADA;}
</style><body><ul id="pager" total="" size=""></ul>
</body>
</html>

javascript部分

首先以生成长度为9个li的分页器为例。假设有100页,要达到的效果如下:

1234567100
145678100
1949596979899100
function setPager(page,total,size){//page 当前选中的页号//total 列表长度//size 每页多少行$("#pager").html('').attr('total',total).attr('size',size);var cursor=1;//游标,在循环结尾它等于几就会生成一个跳转到第几页的livar index=0;//由于游标会发生改变,index可以清楚记录生成了几个livar pi=page-2;//在长度为9时,中间有五个可选,pi是中间最左侧var li=Math.ceil(total/size)+1;//需要生成的li的个数+1//        pi         page              li-1// 1  ...  3     4     5    6  7  ...  100for(;cursor<li;cursor++,index++){/*判断生成左侧省略号li>10 : 只需要生成9个及以下个li时不需要生成左侧省略号page>=6 : 为了让选中的页号显示在正中间,左侧和右侧应该都有4个,选中的页号恰好等于6时,左侧就有5个,此时需要生成省略号pi>=4 : 在符合前两个判断的情况下,如果pi等于3那就只有2被省略,这样单省略一个2就没有意义,至少省略23,所以左侧省略至少是pi>=4cursor==2 : 在生成完第一个li之后第二个位置需要生成省略号*/if(li>10&&page>=6&&pi>=4&&cursor==2){Omit();//生成一个省略号cursor=pi>(li-7)?(li-7):pi;//生成完左侧省略号之后还剩7个按钮没有生成。倒数第七个和pi哪个小接下来就生成哪个}/*判断生成右侧省略号cursor>7 : 即使没有生成左侧省略号那cursor>7时至少生成了7个,所以cursor<8时不可能需要生成右侧省略号index>5 : 当前第八个位置需要生成右侧省略号li-cursor>2 : 在符合前两个判断的情况下,如果至少还剩三个(两个要省略和最后一个)就生成省略号*/if(cursor>7&&index>5&&li-cursor>2){Omit();//生成一个省略号cursor=li-1;//把游标移到最后一个位置生成最后一个循环结束}let o=cursor==page?'':'οnclick="cutoverPage('+cursor+')"';//按钮点击事件//这里生成有数字的分页器按钮,前面两个判断只是用来生成省略号$("#pager").append('<li '+o+' class="pager'+(cursor==page?"Choosed":"Btn")+'">'+cursor+'</li>');}function Omit(){$("#pager").append('<li class="pagerOmit">...</li>');}
}
function cutoverPage(page){console.log('点击了第'+page+'页');var total=$("#pager").attr('total');var size=$("#pager").attr('size');setPager(page,total,size);
}

效果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
固定9个不能总是满足需要,所以再加一个参数来控制宽度

var w=13;
setPager(2,1000,10,w);
function setPager(page,total,size,len){//page 当前选中的页号//total 列表长度//size 每页多少行//len 控制生成的分页器长度,最好是单数并且不能小于7if(len<7) return;//总长小于7时没法生成//每个li加上边框和margin一共是38$("#pager").width(len*38).html('').attr('total',total).attr('size',size);var llen=Math.floor((len+1)/2-3);var flen=len-2;var cursor=1;//游标,在循环结尾它等于几就会生成一个跳转到第几页的livar index=0;//由于游标会发生改变,index可以清楚记录生成了几个livar pi=page-llen;//在长度为9时,中间有五个可选,pi是中间最左侧var li=Math.ceil(total/size)+1;//需要生成的li的个数+1//        pi         page              li-1// 1  ...  3     4     5    6  7  ...  100for(;cursor<li;cursor++,index++){/*判断生成左侧省略号li>10 : 只需要生成9个及以下个li时不需要生成左侧省略号page>=6 : 为了让选中的页号显示在正中间,左侧和右侧应该都有4个,选中的页号恰好等于6时,左侧就有5个,此时需要生成省略号pi>=4 : 在符合前两个判断的情况下,如果pi等于3那就只有2被省略,这样单省略一个2就没有意义,至少省略23,所以是pi>=4cursor==2 : 在生成完第一个li之后第二个位置需要生成省略号*/if(li>(len+1)&&page>=(pi+llen)&&pi>=4&&cursor==2){Omit();//生成一个省略号cursor=pi>(li-flen)?(li-flen):pi;//生成完左侧省略号之后还剩7个按钮没有生成。倒数第七个和pi哪个小接下来就生成哪个}/*判断生成右侧省略号cursor>7 : 即使没有生成左侧省略号那cursor>7时至少生成了7个,所以cursor<8时不可能需要生成右侧省略号index>5 : 当前第八个位置需要生成右侧省略号li-cursor>2 : 在符合前两个判断的情况下,如果至少还剩三个(两个要省略和最后一个)就生成省略号*/if(cursor>flen&&index>(flen-2)&&li-cursor>2){Omit();//生成一个省略号cursor=li-1;//把游标移到最后一个位置生成最后一个循环结束}let o=cursor==page?'':'οnclick="cutoverPage('+cursor+')"';//按钮点击事件//这里生成有数字的分页器按钮,前面两个判断只是用来生成省略号$("#pager").append('<li '+o+' class="pager'+(cursor==page?"Choosed":"Btn")+'">'+cursor+'</li>');}function Omit(){$("#pager").append('<li class="pagerOmit">...</li>');}
}
function cutoverPage(page){console.log('跳转到第'+page+'页');var total=$("#pager").attr('total');var size=$("#pager").attr('size');setPager(page,total,size,w);
}

稍作简化:

function setPager(p,t,s,l){if(l<7) return;$("#pager").width(l*38).html('').attr('total',t).attr('size',s);for(let ll=Math.floor((l+1)/2-3),fl=l-2,c=1,i=0,pi=p-ll,li=Math.ceil(t/s)+1;c<li;c++,i++){if(li>(l+1)&&p>=(pi+ll)&&pi>=4&&c==2) Omit(),c=pi>(li-fl)?(li-fl):pi;if(c>fl&&i>(fl-2)&&li-c>2) Omit(),c=li-1;let o=c==p?'':'οnclick="cutoverPage('+c+')"';$("#pager").append('<li '+o+' class="pager'+(c==p?"Choosed":"Btn")+'">'+c+'</li>');}function Omit(){$("#pager").append('<li class="pagerOmit">...</li>');}
}

造轮子+1


http://chatgpt.dhexx.cn/article/P4jMbKNG.shtml

相关文章

flutter自定义分页器

使用flutter自定义一个分页器 最近在写flutter项目&#xff0c;项目刚好需要一个分页器&#xff0c;对数据进行分页处理&#xff0c;一开始想要在网上找有没有已经写好的插件&#xff0c;搜寻一会后还是想着自己写一个。 先看看效果图 思路 首先要准备一个盒子&#xff0c;装载…

手写一个简单的分页器

封装分页器 1. 前言 分页器基本上是任何网站必须要有的一个组件&#xff0c;为什么需要分页器&#xff0c;当后台传入了大量的数据&#xff0c;那么在前端拿到数据&#xff0c;如果直接展示很有可能或造成卡顿&#xff0c;同时消耗过多的内存&#xff0c;给用户带来的浏览效果就…

分页器(分页器基本操作、点击按钮分页、美化分页器)

分页器基本操作 用户访问一个网页或者查看某些数据&#xff0c;如果数据量过大肯定需要按页查看&#xff0c;不可能一个页面显示N条数据内容这里就用到了分页器 首先往数据库里插入数据&#xff0c;这里咱们进行脚本批量插入 # #脚本批量插入数据book_list []for i in range(2…

分页器

1.分页器 作用&#xff1a;干啥的&#xff1f;数据量大的话&#xff0c;可以分页获取&#xff0c;查看。 2.一次性插入多条数据 def add1(request):# 这样for循环会造成对数据库的大量访问&#xff0c;不建议这样添加# models.Book.objects.create(name连城诀%s%i,price10i)ll[…

分页器组件

作为前端三剑客的分页器在许多场景都能 使用&#xff0c;在实际工作中也有插件来快速实现分页器功能 但我们要了解原理&#xff0c;所以我们自己手搓个简单的分页器 先处理好静态组件 <template><div class"pagination"><button>1</button>…

分页器的介绍

一 、分页器的简介 在页面显示分页数据&#xff0c;需要用到django分页器组件 from django.core.paginator import Paginator paginator对象&#xff1a;paginator Paginator(user_list,10)#per_page:每页显示条目数量 #count &#xff1a;数据总个数#num_pages:总页数#page_…

自定义分页器

前端必须要掌握的分页器&#xff0c;轮播图&#xff0c;与日历 手写&#xff0c;掌握原理 1:分页功能实现 为什么很多项目采用分页功能&#xff1a;比如电商平台有很多数据。一次加载出来会卡住 采用分页功能 Element Ul是有相应的分页组件&#xff0c;使用起来超级简单…

【JS案例】分页器——使用原生JavaScript实现

在使用vue编写完一个分页器组件后&#xff0c;我对分页器的底层逻辑产生了兴趣&#xff0c;想在此组件的基础上再深入了解一些分页器的底层逻辑&#xff0c;了解vue与原生js的区别。我在github上看了一些大神写的分页器&#xff0c;属实牛逼&#xff0c;之后自己也根据他们的编…

zigbee-无线点灯-协调器节点

开发环境&#xff1a;IAR 8.10 Z-stack 2.5 功能&#xff1a;协调器与终端节点组网&#xff0c;实现点对点通信。终端向协调器发送“D1”&#xff0c;协调器LED灯闪烁。 流程图&#xff1a; 具体代码&#xff1a; 定义所需要的变量 端点描述符 endPointDesc_t GenericApp_e…

十分钟入门Zigbee

大部分教程通常都是已Zigbee原理开始讲解和学习&#xff0c;各种概念让初学者难以理解。本教程从一个小白的角度出发&#xff0c;入门无需任何Zigbee底层原理知识&#xff0c;只需要基本的MCU研发经验就可以掌握&#xff0c;让您快速实现zigbee组网和节点之间通信。 本教程采用…

第一章:zigbee学习笔记之简介(上)

注&#xff1a;文章转载自https://blog.csdn.net/tainjau/article/details/81540013 写在前面&#xff1a; 最近开始搞智能家居的项目&#xff0c;之前只是了解过zigbee&#xff0c;但是并未深入学习过&#xff0c;所以工作之余&#xff0c;忙里偷闲下&#xff0c;学习一下zigb…

zigbee菜鸟笔记(一)zigbee的基础知识

一.什么是zigbee 有问题发送邮件至468078841qq.com ZigBee&#xff0c;也称紫蜂&#xff0c;是一种低速短距离传输的无线网上协议&#xff0c;底层是采用IEEE 802.15.4标准规范的媒体访问层与物理层。主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低…

TI CC2538 做ZigBee协调器控制飞利浦 Hue 调色灯

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 一、实验准备 1.1 硬件准备 1.1.1 CC2538 模块 本文中使用的 CC2538 模块是带 PA 芯片&#xff08;CC2592&#xff09;的。此外&#xff0c;最好是带焊接好的底板&#xff0c;便于后面与串口转USB…

使用zigbee的协议栈进行协调器路由器终端初始化

实验目的: 使用协议栈,外加自己写的数码管的代码模块 配置协调器路由器终端,各自对应数码管数字C,R,E。 本身不是很细致,只是把一些重要步骤截了一下,IAR工程什么的默认大家都会了。 zigbee协议栈的下载 下载完找以下文件夹 找到下面两个文件夹,然后复制出来放到自己的…

zigbee z-stack 协调器断电后,重新上电无法恢复

1、是否宏定义了NV_RESTORE1&#xff1b;NV_INIT1&#xff1b;&#xff08;协调器、路由器、终端都要定义&#xff09;定义位置如下 2、下载模式选Erase flash&#xff0c;选择位置&#xff1a;&#xff08;20201117修正:实际调试发现如果不许选择erase flash 协调器断电重连&a…

ZigBee中协调器断电重连问题?

问题描述&#xff1a;如果你想实现一个完好的网络&#xff0c;协调器断电重启后还是能加入原来的网络&#xff0c;加上NV_RESTORE编译选项就可以&#xff0c;如果发现加上它&#xff0c;还是实现不了要求&#xff0c;就请作如下操作&#xff1f; 方法&#xff1a;如果加了NV_R…

Zigbee协调器主动使终端节点退网

我使用ZDP_MgmtLeaveReq()这个函数来让已知短地址的终端退网&#xff0c;代码如下&#xff1a;我这样使用的结果是&#xff0c;可以将节点退网&#xff0c;节点上也需要做一些配置。我在函数里禁止节点重连&#xff0c;但是节点退网后会获取到新的短地址重新入网&#xff0c;这…

ZIGBEE 工程内区分终端与协调器

目前已知&#xff0c;工程中区分是终端还是协调器&#xff0c;与工程中Tolls文件夹中的.cfg文件有关&#xff1a; 从project->Edit Configuration进去可以删减左边栏Workspace下拉的项&#xff1a; 区别终端、路由器和协调器是通过Options.. -> C/C Compiler -> Extra…

Zigbee应用开发 协调器控制多个终端

协调器控制多个终端 功能要求: 协调器通过串口向终端发送控制命令 发送1 则终端1 的D8灯亮 发送 2 则 终端2 的灯亮 发送 0 则 俩个终端都灭 实现过程&#xff1a; 当网络状态发生改变时&#xff0c;通过串口打印一串消息用来分辨串口调试对应着那种类型的Zigbee 终端编程&…