JS分页的实现(同步与异步)


Posted in Javascript onSeptember 16, 2017

分页技术分为后端分页和前端分页。

前端分页

将数据一次性全部取出来,然后通过js进行分页,有其弊端:假设有商品表dbgoods,存放99999万条数据 ,执行查询语句
select *from dbgoods where 1=1 将查询结构用List<goods>list 进行接收,服务端将这么庞大的数据量传递给前端,会造成下载量大(流量都是钱),服务器压力大等。

后端分页

后端分页是每次请求只查询一页的值,以mysql为例(查询第一条开始,查询8条)

select * from dbgoods order by id limit 0,8;

后端同步分页

原理:需要有个Bean记录分页的信息,

public class PageBean{
 private long total;  //总记录数
 private List<T> list; //结果集
 private int pageNum; // 第几页
 private int pageSize; // 每页记录数
 private int pages;  // 总页数
 private int size;  // 当前页的数量 <= pageSize,该属性来自ArrayList的size属性

当我们首次加载时,加载的是第一页的分页数据:

JS分页的实现(同步与异步)

值得注意的是

以前我是这样编写sql语句得到总条数的:

select *from dbgoods ;
//用Lits<goods> lists去存储 得到的数据,如果数据有几万条,
//为了得到一个数字,去开辟这么大的空间,实属浪费
PageBean page=new PageBean();
page.setTotal=lists.size();

其实正确的打开方式是:

select count(*) from dbgoods where 1=1 ;
//查询语句返回的是一个表的总记录数,int型,
//where 1==1是为了查询搜索,做sql语句拼接

同步实现异步,从jsp界面传递currentpage参数到servlet,servlet通过request请求得到参数,通过dao层数据库查询后将数据再传会到jsp界面。

浏览器看到的界面效果是:jsp--->servlet----->jsp(跳转,用户体验不好)

如果有搜索框,在进行搜索分页时,点击搜索按钮,等到查询数据传递到jsp界面时,jsp已经是个全新的页面,搜索框里的文本框内容已经消失,解决方法就是在点击搜索的时候,将文本框的值也放在request请求,一起发给servlet,再通过servlet传递到新的jsp (超级繁琐)

JS分页的实现(同步与异步)

两种解决方法:

(1)做两个界面一样的,一个用于显示全部数据情况下的分页,当点击查询时,得到数据后用另外的页面(下一页点击事件是去执行搜索的情况)去显示

 (2)使用session:当点击搜索查询时,将搜索条件记录在session里面,当点击下一页时,去判断session的值,如果是空,则执行全部数据的下一页,如果不为空,则将session的值取出来,作为查询的条件,下一页执行 有搜索条件的查询语句。麻烦点:session的销毁不好控制,容易bug

总之,用同步实现分页,会有各种不开心

Ajax异步分页

//jsp界面一个函数,传递查询页码,绘制表格
 function InitTable(currentpage)
     {
      $.ajax({
       type:"get",
       url:"CustomServlet?type=search¤tpage="+currentpage,
       async:true,
       dataType:"json",
       success:function(data)
       {
        DrawTable(data); //绘制表格
       }
      });
     }
function DrawTable(data) //根据传递过来的json绘制表格
     {
      //给总页数赋值
      $("#custom_all").text(data.pagelist.total);
     //给当前页赋值
$("#custom_currunt_page").text(data.pagelist.pageNum);
     //给总页数赋值
 $("#custom_all_page").text(data.pagelist.pages);
      var _th="<th><input id='cb_all' type='checkbox'></th>"
      +"<th>ID</th>"
      +"<th>客户名称</th>"
      +"<th>公司名称</th>"
      +"<th>联系人</th>"
      +"<th>性别</th>"
      +"<th>联系电话</th>"
      +"<th>手机</th>"
      +"<th>QQ</th>"
      +"<th>电子邮箱</th>"
      +"<th>通讯地址</th>"
      +"<th>创建时间</th>";
      document.getElementsByTagName("tbody")[0].innerHTML=_th;
       for(var i=0;i<data.pagelist.list.length;i++)
       {
        var customerCreatetime= format(data.pagelist.list[i].customerCreatetime, 'yyyy-MM-dd');
        var _tr=document.createElement('tr');
        msg="<td><input type='checkbox'></td><td>"+data.pagelist.list[i].customerId+"</td><td>"+data.pagelist.list[i].customerName+"</td><td>"+data.pagelist.list[i].customerCompanyname+"</td><td>"+data.pagelist.list[i].customerContactname+"</td><td>"+data.pagelist.list[i].customerSex+"</td><td>"+data.pagelist.list[i].customerTelephone+"</td><td>"+data.pagelist.list[i].customerPhone+"</td><td>"+data.pagelist.list[i].customerQq+"</td><td>"+data.pagelist.list[i].customerEmail+"</td><td>"+data.pagelist.list[i].customerAddress+"</td><td>"+customerCreatetime+"</td>"
       _tr.innerHTML=msg;         
        document.getElementsByTagName("tbody")[0].appendChild(_tr);
       }
     }

初次加载时,默认调用

//初始化表格
      InitTable(1);

值得注意的是,重点来了:

我们进行搜索的时候,定义一个全局的变量mydata,作用域为page

var mydata="";

下面看下点击 搜索按钮的事件代码

btns.eq(1).click( //搜索按钮点击事件
          function()
         {
      //custom_dialog_form是搜索的form表单,将其搜索条件序列化后赋值给一个全局变量     mydata=$("#custom_dialog_form").serialize();
           $.ajax({
            type:"post",
            url:"CustomServlet?type=search¤tpage=1",
            async:true,
            dataType:"json",
            data:mydata, //传递数据
            success:function(data)
            {
             DrawTable(data);
             $("#custom_dialog").css("display","none");
            }
           });
         }
          );

解决同步的搜索情况下的下一页访问到的是全部数据的下一页问题:

function InitTable(currentpage) //无搜索条件下的查询,传递一个页码
     {
      $.ajax({
       type:"get",
       url:"CustomServlet?type=search¤tpage="+currentpage,
       async:true,
       dataType:"json",
       success:function(data)
       {
        DrawTable(data);
       }
      });
     }
     function InitTableSearch(currentpage)//有搜索添加的查询,传递页码
     {
       $.ajax({
        type:"post",
        url:"CustomServlet?type=search¤tpage="+currentpage,
        async:true,
        dataType:"json",
        data:mydata,
        success:function(data)
        {
         DrawTable(data);
         $("#custom_dialog").css("display","none");
        }
       });
     }
//下一页
      $("#custom_btn_next").click(
        function ()
        {
         var currentpage=$("#custom_currunt_page").text(); //获取页面的当前页的值
         var pages=$("#custom_all_page").text(); //获取总页数
         currentpage++;
         if(currentpage<=pages)
          {
          if(mydata=="") //判断全局变量mydata是否为空,空表示没有进行搜索查询
          {
          InitTable(currentpage);
          }
         else
          {
           InitTableSearch(currentpage); //进行条件搜索
          }
          }
        });

由于是异步刷新,所以全局变量mydata是有值的,手动自己刷新页面重新加载,mydata就会初始化为空,就又默认执行 无条件搜索语句。巧妙的解决了搜索和显示全部的下一页问题,上一页首页尾页同理。

总结

以上所述是小编给大家介绍的JS分页的实现(同步与异步),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
创建自己的jquery表格插件
Nov 25 Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
centos 上快速搭建ghost博客方法分享
May 23 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
9个JavaScript日常开发小技巧
Oct 06 Javascript
浅谈JS的二进制家族
May 09 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 #Javascript
引入JavaScript时alert弹出框显示中文乱码问题
Sep 16 #Javascript
Javascript 严格模式use strict详解
Sep 16 #Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 #Javascript
JS闭包的几种常见形式实例详解
Sep 16 #Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 #Javascript
详解JS构造函数中this和return
Sep 16 #Javascript
You might like
php引用传值实例详解学习
2013/11/06 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
javascript getElementsByTagName
2011/01/31 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Python列表切片常用操作实例解析
2020/03/10 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
python 如何将office文件转换为PDF
2020/09/22 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
大型公益活动策划方案
2014/08/20 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python