JS处理数据实现分页功能

这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具。

分页是个很简单又超多接触的技术点,粗略来讲分如下两种:

真分页——每次根据页码、页大小获取数据并展示。

假分页——一次性获取所有数据,根据页码、页大小展示。

公认比较好的做法是真分页,这样可以避免很多问题(如内存占用过多)。

有一点需要注意,单纯的前端是无法独立完成数据分页的(废话),所以后端支持是必须的。

作为支持,webapi除了返回所请求的数据,还应返回数据总量以便计算页数:

如上图所示,我们可以看出数据总量27,分页大小10(这边只请求了10条数据)。

如果你拥有如上图的webapi的支持,就可以接着往下写了。

我使用对象字面量封装的方法:

var Post = {
    Url: function () {
        return "webAPI路径";
    },
    ///返回带分页信息
    //[ele]填充信息元素ID
    ///[ele2]填充分页元素ID
    //[tagName]信息元素一级元素名
    ///[tag2Name]信息元素二级元素名
    //[index]页码
    Pager: function (ele, ele2, tagName, tag2Name, index, where) {
        //页大小
        var size = $.cookie('pageSize') == undefined ? 10 : $.cookie('pageSize');
        //封装的Ajax
        Load(Post.Url(), {参数列表}, function (data) {<br data-filtered="filtered">        //展示数据
            $(ele).html(createHtml(data.rows, tagName, tag2Name));
            //设置分页信息
            $(ele2).attr('index', index).attr('rowcount', size).attr('total', data.total);
            //填充分页
            PagerTool(ele, ele2, Post, tagName, tag2Name, where);
        });
    }
}

Load、createHtml和PagerTool是我自己封装的几个方法,代码如下:

///公共加载方法
//[turl]访问地址
///[postData]提交数据(标准post格式)
//[callback]回调函数(可匿名)
function Load(turl, postData, callback) {
    jQuery.support.cors = true;
    try {
        $.ajax({
            url: turl,
            timeout: 10000,
            type: "post",
            data: postData,
            success: function (data) {
                if (data != null) {
                    Json = eval("(" + data + ")");
                    callback(Json);
                }
            }
        });
    } catch (e) {
        Mbox.Show(e.message);
    }
}

///创建Html结构
//[data]数据源
///[tagName]一级元素标签名称
//[tag2Name]二级元素标签名称
function createHtml(data, tagName, tag2Name) {
    var Html = '';
    for (var i = 0; i < data.length; i++) {
        Html += `<${tagName}>`;
        $.each(data[i], function (i, v) {
            Html += `<${tag2Name}>${v}</${tag2Name}>`;
        });
        Html += `</${tagName}>`;
    }
    return Html;
}

PagerTool方法:

//公共分页工具条
///[dataEle]数据主体
//[ele]分页主体
///[obj]被传入的类
//[where]条件
///[w]按照何种方式搜索
function PagerTool(dataEle, ele, obj, tag1, tag2, where) {
    var total = $(ele).attr('total') - 0;
    var rowcount = $(ele).attr('rowcount') - 0;
    var index = $(ele).attr('index') - 0;
    var count = total % rowcount == 0 ? total / rowcount : Math.floor(total / rowcount) + 1;
    var Html = '';
    Html += '<p class="page">';
    Html += '<a href="javaScript:void(0)" class="prePage">上一页</a>';
    for (var i = 1; i <= count; i++) {
        if (index != i) {
            Html += `<a href="javaScript:void(0)" class="nowPage">${i}</a>`;
        } else {
            Html += `<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">${i}</a>`;
        }
    }
    Html += '<a href="javaScript:void(0)" class="nextPage">下一页</a>';
    Html += '</p>';
    $(ele).html('').html(Html);
    //上一页
    $(ele).find('a[class=prePage]').bind('click', function () {
        var index = $(this).parent().parent().attr('index') - 0;
        if (index > 1) {
            $(this).parent().parent().attr('index', index - 1);
            obj.Pager(dataEle, ele, tag1, tag2, index - 1, where);
        }
    });
    //下一页
    $(ele).find('a[class=nextPage]').bind('click', function () {
        var index = $(this).parent().parent().attr('index') - 0;
        if (index < count) {
            $(this).parent().parent().attr('index', index + 1);
            obj.Pager(dataEle, ele, tag1, tag2, index + 1, where);
        }
    });
    //当前页
    $(ele).find('a[class=nowPage]').bind('click', function () {
        var index = $(this).parent().parent().attr('index') - 0;
        $(this).parent().parent().attr('index', $(this).text());
        obj.Pager(dataEle, ele, tag1, tag2, $(this).text(), where);
    });
}

调用方式会是这样的:

Post.Pager(testBox, pagerBox, 'ul', 'li', 1, `筛选数据的条件`);

使用了如上代码,即可按照所返回的json数据的格式自动映射到容器内(按照传入的tagName生成dom):

切换后效果:

分页工具条,生成在页面是这样的:

<p class="page"><br data-filtered="filtered">    <a href="javaScript:void(0)" class="prePage">上一页</a><br data-filtered="filtered">    <a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">1</a><br data-filtered="filtered">    <a href="javaScript:void(0)" class="nowPage">2</a><br data-filtered="filtered">    <a href="javaScript:void(0)" class="nowPage">3</a><br data-filtered="filtered">    <a href="javaScript:void(0)" class="nextPage">下一页</a><br data-filtered="filtered"></p>

到此这篇关于JS处理数据实现分页功能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 原生JS实现酷炫分页效果

    本文实例为大家分享一个如下效果的JS分页特效,是不是很酷炫. 以下是代码实现: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>原生JS实现酷炫分页</title> <style> * { margin: 0; padd

  • 原生js实现分页效果

    本文实例为大家分享了js实现分页效果的具体代码,供大家参考,具体内容如下 效果如下: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <

  • js对象实现数据分页效果

    本文实例为大家分享了js对象实现数据分页效果的具体代码,供大家参考,具体内容如下 实现数据分页要清楚这个的方面的设计: 1.先模拟建立一个后台数据库,如下: var peoson=[ { "id":"1", " name":"鞠婧祎", "sex":"女", "age":"25", "class":"八班",

  • javascript实现前端分页功能

    前言:今天给大家带来的是前端数据的分页功能,供大家参考,具体内容如下 先上一波效果图展示: 直接上代码:这里使用的是JavaScript来实现 关于代码详解都以注释的方式写在JavaScript里的 HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>分页</title> <link rel="stylesheet&qu

  • JS实现前端分页效果

    本文实例为大家分享了JS实现前端分页效果的具体代码,供大家参考,具体内容如下 一.HTML部分 <!doctype html> <html> <head> <meta charset='utf-8'> <script src="js/jquery.js"></script> <style type="text/css"> a{text-decoration: none;} table

  • js实现简单的前端分页效果

    有些项目业务比较简单,但用到前端分页的地方又比较多,插件的体积比较难控制用起来也麻烦,所以自己写一个简易的. 实现思路 通过 jQuery.slice()选择子集的区间元素, 然后控制显示隐藏来实现: 假设每页显示数量为x,当前页码为y,元素索引从0开始,那么显示的区间即为 x(y-1) 到 xy. 效果演示 demo代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U

  • vue.js 2.0实现简单分页效果

    本文实例为大家分享了vue.js 2.0实现分页效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>vue.js 2.0 实现的简单分页</title> <style> * { margin: 0; padding: 0; box-sizing: border-box } html { fo

  • jQuery pager.js 插件动态分页功能实例分析

    本文实例讲述了jQuery pager.js 插件动态分页功能.分享给大家供大家参考,具体如下: pager.js 代码 function Page(opt){ var set = $.extend({num:null,startnum:1,elem:null,callback:null},opt||{}); if(set.startnum>set.num||set.startnum<1){ set.startnum = 1; } var n = 0,htm = ''; var clickpa

  • 原生JS实现分页点击控件

    这是一个面试题,要求使用原生JS实现一个分页点击控件,供大家参考,具体内容如下 1.点击首页.上一页.下一页和末页要实现相应的数字编号变红. 2.在页数1 不能够点击首页和上一页. 3.在页数10不能够点击下一页. 4.实现一个input输入页数跳转页码功能. HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta nam

  • JS处理数据实现分页功能

    这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页——每次根据页码.页大小获取数据并展示. 假分页——一次性获取所有数据,根据页码.页大小展示. 公认比较好的做法是真分页,这样可以避免很多问题(如内存占用过多). 有一点需要注意,单纯的前端是无法独立完成数据分页的(废话),所以后端支持是必须的. 作为支持,webapi除了返回所请求的数据,还应返回数据总量以便计算页数:

  • vue+vuex+json-seiver实现数据展示+分页功能

    一丶项目分析 1.UI: 2.接口信息: 二丶项目环境 Mockjs:生成模拟数据(含中文名,以及地址) json-server:模拟后端接口 webpack-dev-server:开启服务器环境+接口代理 jquery:使用jquery的ajax拉取数据 vue+vuex:vuex负责数据交互,vue渲染页面 iviewui:ui组件,方便布局 搭建开发环境 1.基本环境 Vue起步(无cli) 安装: npm install --save Mockjs 使用: 详细API:mockjs.co

  • JS实现的简单分页功能示例

    本文实例讲述了JS实现的简单分页功能.分享给大家供大家参考,具体如下: HTML部分: <body onLoad="goPage(1,10);"> <table id="idData" width="70%"> <tr><td>user2</td><td>25</td><td>男</td><td>山西吕梁</td>&

  • Vue.js实现无限加载与分页功能开发

    本篇文章是一篇Vue.js的教程,目标在于用一种常见的业务场景--分页/无限加载,帮助读者更好的理解Vue.js中的一些设计思想.与许多Todo List类的入门教程相比,更全面的展示使用Vue.js完成一个需求的思考过程:与一些构建大型应用的高阶教程相比,又更专注于一些零碎细节的实现,方便读者快速掌握.致用. 需求分析 当一个页面中信息量过大时(例如一个新闻列表中有200条新闻需要展示),就会产生问题,例如: >数据量过大,影响加载速度 >用户体验差,很难定位到之前自己看过的某篇文章 >

  • JQuery+Ajax实现数据查询、排序和分页功能

    之前很少会用javascript去实现页功能主要怕麻烦,但了解JQuery后这种想法发生了变化:有了这样的脚本组件就可以在编写脚本时方便和HTML隔离出来,这样编写高重用性的脚本就更方便.下面就是介绍在学习JQuery过程中编写的基于Ajax的数据查询.排序和分页功能的复用脚本,只要遵循脚本的某些规则描述HTML把脚本文件引入就可以方便实现以上描述的功能. 先看下实现功能的代码: /**应用脚本规则: 引用脚本: JQuery脚本和JQuery的form插件脚本 Form的ID: viewfor

  • vuejs实现本地数据的筛选分页功能思路详解

    今天项目需要一份根据本地数据的筛选分页功能,好吧,本来以为很简单,网上搜了搜全是ajax获取的数据,这不符合要求啊,修改起来太费力气,还不如我自己去写,不多说直接上代码 效果图: 项目需要:点击左侧进行数据筛选,实现自动分页,自动生成页数,点击自动跳转 项目代码:js代码 var subList=new Vue({ el:'#main', data:{ // subcontentData为本地数据 subContents:subcontentData, // 页面需要展现的数据 yemianda

  • vue实现的上拉加载更多数据/分页功能示例

    本文实例讲述了vue实现的上拉加载更多数据/分页功能.分享给大家供大家参考,具体如下: 加载状态 <div v-if='has_log == 0'> <load-more tip="上拉加载" :show-loading="false" background-color="#fbf9fe"></load-more> </div> <div v-if='has_log == 1'> <

  • layui实现数据分页功能

    本文实例为大家分享了layui实现数据分页功能,供大家参考,具体内容如下 官网layui table演示页面 示例截图: 页面引入layui.css. layui.js <div id="pTable" style="width: 1200px;"> <table class="layui-table" id="layui_table_id" lay-filter="test"> &

  • layui实现数据分页功能(ajax异步)

    最近项目要使用layUI的分页,看了官方demo感觉还是不太清晰,摸索了一下,现在记录一下. 一.引入layUI的相关资源 <link rel="stylesheet" href="${ctxPath}/vendor/layui-v2.4.5/layui/css/layui.css" rel="external nofollow" > <script src="${ctxPath}/vendor/layui-v2.4.

随机推荐