新闻动态

JS实现简单分页功能示例,含操作技巧及测试方法

更新时间:2026-03-25 03:48:08  点击次数:

最基础且最常见的需求之一,于前端开发里是分页功能。许多新手,在拿到数据后,不知怎样去拆开长列表。今日就分享一个完整过程,其为纯JS实现分页,不依赖任何第三方库,代码能够直接复制到项目里使用。

分页的核心思路

数据显示范围的控制,这便是分页的本质所在。举例来说呀,要是总共有一百条数据,而每页显示十条,那么这般的话,第一页所显示的便是从第一条到第十条,第二页所显示的则是从第十一条到第二十条。在此处最为关键的两个变量呢,便是“当前页码”以及“每页条数”。我们于JS里面借助currentPage和pageSize去记录它们,然后再凭着slice方法从完整的数据里截取当前页需要展示的那一段内容。

在进行实现操作时,首先要获取到全部的数据,随之监听页码按钮所触发的点击事件。在每一次点击页码之际,便要再度计算全新的起始索引以及结束索引,之后重新开展页面的渲染工作。整个流程并不需要对浏览器进行刷新,数据的改变完全是由JS施行驱动的,因而体验显得极为流畅。众多开发者极易忽视的一点乃是边界判断,举例来说,当当前页面跳转至第一页或者最后一页之时,按钮的状态应当随之发生变化。

HTML结构如何搭建

HTML部分没必要太过复杂,主要涵盖两块内容:一是用作展示数据的容器,二是用于放置分页按钮的容器。一般会选用一个ul或者div当作数据列表,而后在下方放置一组button或者a标签来进行页码切换。为了能够让样式更为美观些,可以给页码按钮添加上统一的class,以此方便随后运用CSS去操控间距以及当前页的高亮效果。

在二零一八年那个时候,好多项目依旧支持IE8,因而示例之中采用了最为质朴的div加上span的组合。于实际开发期间,能够依据项目情形更换成更具语义化的标签。重点在于要给数据容器设定一个id,比如说listBox,给分页容器同样设定一个id,比如说pagination,如此一来JS便能够借助document.getElementById精确找到它们,开展动态内容的填充。


  
user225山西吕梁
user325山西吕梁
user425山西吕梁

数据初始化与渲染逻辑

设想一下,倘若我们拥有五十条测试数据,那么能够先借助数组去生成,其中每条数据都涵盖标题以及简介。在进行初始化操作的时候,定义全局变量:totalData用来存放所有的数据,pageSize设定为十,currentPage设定为一。接着去撰写一个render函数,此函数依据currentPage以及pageSize计算得出start和end,借助slice去截取数据,随后通过循环将其拼接到数据容器当中。把innerHTML用于拼接,相较于appendChild,它会显得更直观些,不过呢,得留意性能这方面的情况,当数据量并非极大的时候,那就基本能够满足使用需求了。

在将数据渲染完成之后,紧接着便要对分页按钮进行渲染,为此,得先计算出那总页数,其需借助Math.ceil(totalData.length / pageSize)来获取,之后,要动态地生成按钮,有第一页、上一页、页码数字、下一页、最后一页,其中,页码数字部分能够通过循环去生成,给当前页的按钮添加上active类名,以此便于进行高亮显示,在把所有按钮的HTML生成完毕后,将其一次性插入到分页容器当中,从而避免出现多次DOM操作的情况。

/**
 * 分页函数
 * pno--页数
 * psize--每页显示记录数
 * 分页部分是从真实数据行开始,因而存在加减某个常数,以确定真正的记录数
 * 纯js分页实质是数据行全部加载,通过是否显示属性完成分页功能
 **/
function goPage(pno,psize){
  var itable = document.getElementById("idData");
  var num = itable.rows.length;//表格所有行数(所有记录数)
  console.log(num);
  var totalPage = 0;//总页数
  var pageSize = psize;//每页显示行数
  //总共分几页
  if(num/pageSize > parseInt(num/pageSize)){
      totalPage=parseInt(num/pageSize)+1;
    }else{
      totalPage=parseInt(num/pageSize);
    }
  var currentPage = pno;//当前页数
  var startRow = (currentPage - 1) * pageSize+1;//开始显示的行 31
    var endRow = currentPage * pageSize;//结束显示的行  40
    endRow = (endRow > num)? num : endRow;  //40
    console.log(endRow);
    //遍历显示数据实现分页
  for(var i=1;i<(num+1);i++){
    var irow = itable.rows[i-1];
    if(i>=startRow && i<=endRow){
      irow.style.display = "block";
    }else{
      irow.style.display = "none";
    }
  }
  var tempStr = "共"+num+"条记录 分"+totalPage+"页 当前第"+currentPage+"页";
  if(currentPage>1){
    tempStr += "首页";
    tempStr += "<上一页"
  }else{
    tempStr += "首页";
    tempStr += "<上一页";
  }
  if(currentPage下一页>";
    tempStr += "尾页";
  }else{
    tempStr += "下一页>";
    tempStr += "尾页";
  }
  document.getElementById("barcon").innerHTML = tempStr;
}

事件绑定与页面跳转

先找出分页功能里最核心的交互,那便是点击按钮时会触发页码切换,我们用事件委托的方式,亦即在分页容器其具相关性系之分结构关联的父级去监听click事件,借由判定event.target的tagName以及class来分辨点击的究竟是哪一个按钮,倘若点击了“下一页”,便将currentPage加上1,接着再度发起render函数的调动动作。当点击页码数字时,把currentPage改为与之对应的数字,同样再次展开渲染操作。

实现之际,必须留意几个边界情况,当当前页等同于第一页之时,致使“上一页”以及“第一页”按钮应当予以禁用或者进行隐藏,若是当前页等于最后一页,那么“下一页”以及“最后一页”同样也要进行禁用之操作。而禁用之举措,可以借助给按钮增添disabled属性,或者直接将按钮的样式修改为灰色,同时还要对点击事件的进一步处理予以阻止。这些细微之处,会对直接用户体验产生影响,诸多上线之后出现的bug,皆是源于边界条件未曾判断明晰。

动态数据与性能优化





www.jb51.net JS分页



  
user125山西吕梁
user225山西吕梁
user325山西吕梁
user425山西吕梁
user525山西吕梁
user625山西吕梁
user725山西吕梁
user825山西吕梁
user925山西吕梁
user1025山西吕梁
user1125山西吕梁
user1225山西吕梁
user1325山西吕梁
user1425山西吕梁
user1525山西吕梁
user1625山西吕梁
user1725山西吕梁
user1825山西吕梁
user1925山西吕梁
user2025山西吕梁
user2125山西吕梁
user2225山西吕梁
user2325山西吕梁
user2425山西吕梁
user2525山西吕梁
user2625山西吕梁
user2725山西吕梁
user2825山西吕梁
user2925山西吕梁
user3025山西吕梁

于实际项目当中,数据常常源自后端接口,或许存在为异步请求的状况。在此情形下,分页逻辑需加以调整:每当切换页码之际,再度向服务器请求对应页的数据,并非使前端一次性获取全部数据。采用这样服务端分页的方式更为常见,能够减轻浏览器的内存压力,特别适宜于数据量较多此等场景。前端需将currentPage以及pageSize传递至后端,而后端则返回对应页的数据与总条数。

在性能优化这块儿,假设前端进行分页并且数据量相对较大(就好比有几千条那种情形),要是一次性把所有DOM都渲染出来,就会出现卡顿现象。此时能够考虑运用文档片段DocumentFragment这个东西,先将所有打算插入的元素都放进片段里头,最后一次性把这些全部添加到页面上去,以此来减小重排重绘的情况。除此之外,相比较于给每个按钮逐一单独绑定事件而言,事件委托在性能方面表现得更好,特别是当页码数量很多的时候,它能够防止大量事件监听器去占用内存。

常见问题与调试技巧

有几种分页功能常见的bug:点击页码之后数据没有变化,通常是slice的索引计算错误所致,或者在重新渲染时忘掉清空原本的数据容器;页码按钮显示不正确,也许是总页数计算出现差错,例如使用了Math.floor而非Math.ceil;快速点击页码之际出现重复请求,这种情形需要添加防抖或节流,或者设置一个请求锁。

进行调试之际,能够借助console.log将currentPage、start、end以及截取之后的数据长度予以打印呈现,如此很快便能够对问题加以定位出具体所在。另外,在2018年的诸多示例代码之中,为了达成兼容性会编写诸多判断情形,像是运用addEventListener抑或是attachEvent。如今进行开发能够精简这些写法情形,要是使用的属于现代浏览器,那么可以安心放心地运用class以及箭头函数,代码将会更加简洁明了。

虽然分页功能看上去简单,不过其中涵盖了数组操作,还有DOM渲染,以及事件处理,甚至边界判断等诸多知识点,是相当不错的练手项目。于你们实际开发期间,究竟更倾向于将分页交付给后端予以处理,还是前端一次性把数据获取后再实施分页呢?欢迎在评论区分享各位的做法,要是觉着文章有价值的话记得点个赞予以支持哟。

上一篇 : 4月29日安徽六安金寨县发生3.1级地震 周边情况汇总 下一篇: 深圳发布生态旅游精品线路,含八大主题及多条海上航线 返回列表