js分页的一些思考

一两年之前在写java的时候,分页的逻辑是写在后端的,用java去实现,jsp是动态展示页码和数据。但是对于一个用ajax加载的分页数据来说,分页的逻辑必须也在前端完成,那么就不得不去思考一下在js里如何完成分页。

在开始之前,我们不妨撕思考一下,我们要展示的分页数据是什么样的,因为如果是不同的数据,那我们展示分页的代码应该是不一样的。

其中就有一种是后端push过来的数据是全部的数据,我们在一个页面不方便展示,从而考虑模拟分页,总之从后端拿过来的是一个数组,我们根据不同的页码取数组中不同的部分。

其实最好的方案是后端push过来的是单页的数据,根据前端传递的当前页码获取与页码,这里需要注意的是此时,后端必须把数据列表总条数也一并返给前端,因为计算页码的时候必须用到总条数。此时,后端传来的数据应该是长成这样的{total:100,list:[]}

我们现在就此种情况下的分页分析是实现,下图是效果

我们先不用管数据的展示,因为我们每次从后端那来的数据里面有一个list,而我们要展示的数据就是这个list,分页的重点是在分页。

在我们打开页面还没有点击页码的时候,页面应该显示的是第一页的数据。

所以上来我们就应该请求一次后端,而且传递的参数应该是当前页page = 1

当前页码应该是根据我们点击页码,或者点击上一下、下一页的时候改变,在这里我们可以把页码定义一个全局变量,初始值为1,其他两个变量是要根据total来计算的,而且很函数里面都需要用到,都给他拎到全局。

var page = 1; //当前页
var pageAll = 1;//总页数
var pageSize = 8;//每页显示条数

这样我么就可以加载初始数据了,也就是page=1的数据。

loadData();//初始加载数据

//加载数据方法
    function loadData(){
        $.ajax({
            url:"../adquery",
            type:"get",
            data:{"action":"queryAll","page":page},
            success:function(data){
                showList(data.rows);//显示数据表格
                showPage(data.total,page);//显示分页
            }
        });
    }

加载数据自然是ajax,因为数据的加载,和显示是我们点击页码的时候都会执行的,所以将其放到函数中,以便调用。loadData()函数很好理解,就不过多说,无非就是一个ajax,成功之后需要刷新两个部分的页面内容,1个是页面的数据,还有一个是分页页码。

我们只关心页码显示部分,所以来看showPage(data.total,page);函数

//分页方法
    function showPage(total,now){
        var _LENGTH = 5;//最大页数5
        var pageArr = [];//

        //整页
        if(total%pageSize==0){
            pageAll = total/pageSize;
        }else{//非整页
            pageAll = (total - total%pageSize)/pageSize + 1;
        }

        //总页数小于5页
        if(pageAll<=_LENGTH){
            for(var i = 0 ;i < pageAll; i++){
                pageArr[i] = i+1;
            }

        }else{//总页数大于5页
            if(now+2 <= pageAll&&now-2 > 0){//当前页没有超过总页数
                for(var i = 0 ;i < _LENGTH; i++){
                    pageArr[i] = now-2 + i;
                }
            }else if(now<=2){
                    pageArr = [1,2,3,4,5] ;
            }else{
                for(var i = 0 ;i < _LENGTH; i++){
                    pageArr[i] = pageAll-4+i;
                }
            }
        }
        //绘制页面
        drawPage(pageArr,now,pageAll);
    }

我们这个方法里定义了一个最大页码数,和一个Arr[]数组。其实很理解,Arr[数组的最大长度就是最大页码数5。也就是说,最多只显示5个页码,12345,或者23456。

在这个函数中,最重要的逻辑是通过计算得到这个pageArr[];  如果的到的数组是[1,2,3]; 那么页码就是显示是1,2,3;如果数组是[5,6,7,8,9];那么的显示的页码就是5,6,7,8,9,当然,在这之前,我们顺便把总页数pageAll计算了出来。

之后就是在页面中绘制页码了

//绘制分页dom方法
    function drawPage(pageArr,now,pageAll){
        var _html = "";
        for(var i = 0; i<pageArr.length; i++){
            _html +=  "<a href=‘javascript:void(0);‘>"+pageArr[i]+"</a>";
        }
        $(".pagelist").html(_html);

        var index = getIndex(pageArr,now);
        $(".pagelist > a").eq(index).css({"background":"#CCC"});

        $(".pagenow").text(now+"/"+pageAll);

    }

    //获取点击当前页坐标
    function getIndex(pageArr,now){
        var index = 0;
        for (var i = 0 ; i < pageArr.length; i++){
            if(pageArr[i] == now ){
                index = i;
            }
        }
        return index;
    }

绘制页码的时候把当前页的css样式修改以显示是当前页码。

最后还需要给页码添加点击事件

//点击分页
    $(".zs-page a").live("click",function(){
        var text = $(this).text();//获取当前点击页数
        if(text == "上一页"){ //如果是点击的上一页
            if(page>1){
                page--;
            }else{
                //alert("已经是第一页");
            }
        }else if(text == "下一页"){//如果是点击的下一页
            if(page<pageAll){
                page++;
            }else{
                //alert("已经是最后一页");
            }
        }else{
          page = parseInt(text);//将获取的页数转化成数字
        }
        loadData();
    });

因为页码是动态添加的,所以这里用的是live方法添加的事件,当然新版的jquery支持on方法动态添加事件。

代码写的是很简洁和明了的,逻辑也很明确,适合的时候你可以去试一试这个方法。

时间: 2024-08-07 01:04:04

js分页的一些思考的相关文章

jsp、js分页功能的简单总结

一.概述 首先,我们要明确为何需要分页技术,主要原因有以下: 1.分页可以提高客户体验度,适当地选择合适的数据条数,让页面显得更有条理,使得用户体验感良好,避免过多数据的冗余. 2.提高性能的需要.分页技术,有选择的加载某部分数据,在数据量较大的时候,分部分加载数据.显示数据,可以有效提高程序的性能,当然,单纯的js的分页技术并没有这种效果. 所以,分页技术是web技术中比较常用的技术,而下面讨论的主要是两种分页技术:一种是jsp的分页技术,其读取数据分批次读取,操作页数跳转的时候才加载相应页面

js分页

<!DOCTYPE html> <html> <head> <title>js分页</title> <style type="text/css"> /*表格样式*/ .tbData { border-collapse:collapse; border-spacing:0px; border:solid 3px #ddd; font-size:14px; font-family:Consolas; color:#33

js分页页码算法

function get_hs_page(cur_page, total_page) { var result = ""; for(var i = 1; i <= total_page; i++) { if(i == 2 && cur_page - 6 > 1) { i = cur_page - 6; }else if(i == cur_page + 6 && cur_page + 6 < total_page) { i = total

js 分页

分页JS代码 <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>分页JS代码</title><style type="text/css">.page{margin:2em;}.page a{text-decor

JS分页 + 获取MVC地址栏URL路径的最后参数

1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width" /> 10 <title>AjaxPage</title> 11 <script src="/Scripts/jquery-1.7.1.js&q

一个重构的js分页类

// JavaScript Document /**//** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为String * @param sTBodyId 分页表格TBODY的属性ID值,为String,此项为要分页的主体内容 * @Version 1.0.0 * @author 辛现宝 2007-01-15 created * var __variable__; private * function __met

js分页小结

今天解决了JS分页的问题1 页码 给每页的内容套一个相同的类名 通过选择器加上.length或者.size() 来获得总页数2当前页的页码可以使用each(function(index,DOMsss){ $(this)})便利元素的方式添加当前页码3 特殊情况分页 用JS复制要分页的内容 通过灵活使用选择器删除多余内容 追加一个页面.after() 删除上一页显示的内容.remove()4有个.clone()直接复制当前元素并返回好像比赋值给一个变量的方法简单不少

js分页实例

js分页实例 1.js_pageusers.html <!DOCTYPE html> <html> <head> <title>js_pageusers.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description"

bootstrap在使用中的样式问题(自带的前台js分页和自己编写的后台分页方法)

使用bootstrap中的table样式时,table中,自动带有前台的js分页,如果不想用前台的js分页方法,就要把table中的初始化样式去掉,就会没有前台分页的样式了 代码: jQuery(document).ready(function() { App.init(); //TableEditable.init();  //将前台的table初始化样式去掉});