对于某些查询记录很多的结果,web页面不得不采用分页器,现在奉上一例代码,其主要逻辑是:由页面的dom

节点发起ajax请求,返回的查询结果根据页面布局需要进行切片;并根据总记录数和页面展现的条数算出页码列表

  • html部分
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../../../favicon.ico"> <title>分页技术测试</title> <!-- Bootstrap core CSS -->
<link href="/static/booststrap4/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template -->
<link href="/static/mycss/starter-template.css" rel="stylesheet">
</head> <body> <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault"
aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button> <div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#" onclick="test()">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="http://example.com" id="dropdown01" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu" aria-labelledby="dropdown01">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input id="searchparam" class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button onclick = "startsearch()" class="btn btn-outline-success my-2 my-sm-0"
type="button">Search</button>
</form>
</div>
</nav> <main role="main" class="container"> <div class="starter-template">
<h1>Bootstrap starter template</h1>
<div class="alert alert-primary" role="alert">
<table class="table">
<thead>
<tr>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>
<hr>
<nav aria-label="Page navigation example">
<ul class="pagination">
<!-- <li id = "clickprev" class="page-item"><a onclick="moveprev()" class="page-link" href="#">
Previous</a></li>--> <li id="pagememo">
<span style="margin-left:100px;"></span>共计:<span id="totalpage"></span>页
<span style="margin-left:50px;"></span>当前第<span id="currentpage"></span>页
</li>
</ul>
</nav>
</div>
</main><!-- /.container -->
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="/static/booststrap4/js/jquery-3.3.1.min.js"></script>
<script src="/static/myjs/forpage2.js">
</script>
</body>
</html>
  • thinkphp5.11部分
 use think\mongo\Query;
class Goodmaster extends Controller
{
function forpagination($tblname,$numperpage,$start,$end,$current)
{
$ret = Db::connect('db_mongo')->name($tblname)->select();
$resultlist=Array();
$totalnum = count($ret);//总记录数
$current=intval($current);
$numperpage =intval($numperpage);
//总页数=总记录数/每页面显示的条数
//关于页数分两种情况:1.总记录数大于每页显示的条数使用上述公式
//2.总记录数小于每页显示的条数,$totalpage = 1
if($totalnum<$numperpage)
{
$totalpage=1;
$startpage = 1;
$endpage = 1;
$resultlist['ret'] =$ret;
}
else{
$totalpage = ceil($totalnum/$numperpage);
$startpage = $start;
$endpage = $end;
$leftindex =($current-1)*$numperpage;//数组切片左索引
$rightindex =$leftindex+$numperpage;//数组切片左索引
$subret = array_slice($ret,$leftindex,$numperpage);
$resultlist['ret'] =$subret;
}
$resultlist['totalpage'] =$totalpage;
$resultlist['frompage'] =$startpage;
$resultlist['current'] =$current;
$resultlist['topage'] =$endpage;
$resultlist['leftindex'] =$leftindex;
$resultlist['totalnum'] =$totalnum;
//return var_dump($resultlist);
return $resultlist;
}
}

thinkphp5.11查询功能 代码,写的繁冗,牛逼的朋友请自行去粗取精

关于mongodb的链式查询需要配置,请看帖子https://www.cnblogs.com/saintdingspage/p/10398441.html

  • Jquery部分---取数据

function test()可以忽略,函数体可以写一些测试用的代码,已验证jquery选择器是否使用正确

下列代码主要是给出取数据,渲染表头,添加数据行的办法

var pagearray =[];

//读取数据,参数param是选中的页码
function test()
{
alert(pagearray[pagearray.length-1]);
$(".pagination .page-item").remove();
}
//这一部分主要是根据点击的页码去算应该对查询数据结果集如何切片,以每页展现10条记录为例,第一页就是数据集的第0至第9条记录(数组索引总是从0开始)
第二页就是10-19,加上php的数组切片array_slice(数组变量,起始索引,步长---就是截几个数),包含左边,不包含右边(你懂的)
function loaddata(param,startpage,endpage)
{
//var myparam =(param=='')?'all':param;
pagearray=[];
var headtitle= new Array();//数组---用于渲染表头的字段
var rowcount=0;
//var pagearray =[];
headtitle=['ID','lng','Lat','Remarks','province','city','xian'];//渲染表头的字段,当然可以动态生成
/*var startpage =$("#clickprev").next().children().html();
var endpage =$("#clicknext").prev().children().html();*/
//var currentpage = $("#currentpage").html();
var currentpage = parseInt(param);
currentpage = (currentpage=="undefined")?1:currentpage;
//alert("curpage"+currentpage);
/* startpage = (startpage=="undefined")?1:startpage;
endpage = (endpage=="undefined")?1:endpage;*/
console.log("endpage:"+endpage);
$.ajax({
url:'/forpagination/area/10/'+startpage+'/'+endpage+'/'+currentpage,
type:'get',
success:function (data) {
console.log(data);
//alert("left:"+data['leftindex']);
//alert("totalnum:"+data['totalnum']);
//生成页码列表
for(var i=1;i<=data['totalpage'];i++)
{
pagearray.push(i);
}
//对页码列表进行切片,以便于渲染bootstrap的pagination(分页)组件
//var pagenumlist = $("#clickprev").nextUntil("#clicknext");
$(".pagination .page-item").remove();
$("#pagememo").before("<li id = 'clickprev' class='page-item'>"+"<a onclick='moveprev()'
class='page-link' href='#'>"+"Previous</a></li>");
$("#clickprev").after("<li id = 'clicknext' class='page-item'>"+"
<a onclick='movenext()' class='page-link' href='#'>Next</a></li>");
var newpage = pagearray.slice(startpage-1,startpage+9);
for(var i =0;i<=newpage.length-1;i++)
{
if (newpage[i]==currentpage)//如果是选中的页码,添加的bootstrap4特效
{
$("#clicknext").before("<li id='pagenum' class='page-item active'>
<span class='page-link' href='#' onclick='pointsearch("+newpage[i]+")'>"+newpage[i]+"</span></li>");
}
else
{
$("#clicknext").before("<li id='pagenum' class='page-item'>
<a class='page-link' href='#' onclick='pointsearch("+newpage[i]+")'>"+newpage[i]+"</a></li>");
}
//onclick='pointsearch("+newpage[i]+"
console.log("fffffffff"+i);
}
//动态添加表头
$("#totalpage").html(data['totalpage']);
$("table thead tr th").remove();
for(var i in headtitle)
{
$("table thead tr").append("<th scope='col'>"+headtitle[i]+"</th>");
}
//动态添加表头(结束)
//动态添加行的值
//$("table tbody").remove();
$("table").append("<tbody></tbody>");
$.each(data['ret'],function (h,i) {
console.log(h,"----------",i);
var newrow = $("<tr></tr>");
for (var k in headtitle)
{
newrow.append("<th scope='row'>"+i[headtitle[k]]+"</th>");
}
$("table tbody").append(newrow);
rowcount+=1;
});
//动态添加行的值(结束)
$("#currentpage").html(data['current']);
}
})

}

//发起一次新的查询,针对表的第一次查询,初始化查询,从第一页生成的方式(从无到有的查询方式)点击search按键发起

function startsearch()
{
var startpage =1;
var endpage = 1;
$("table tbody").remove();
loaddata(1,startpage,endpage)
}


function pointsearch(param)//初始化查询后,(在已生成的结果集)根据指定的页码进行查询
{
var startpage =$("#clickprev").next().children().html();
var endpage =$("#clicknext").prev().children().html();
startpage = (startpage=="undefined")?1:parseInt(startpage);
endpage = (endpage=="undefined")?1:parseInt(endpage);
$("table tbody").remove();
loaddata(param,startpage,endpage);
}
function movenext()//next---往后翻页
{
var nextele = $("#pagenum span").next();//当前选中的页码
var numtoken = parseInt($("#pagenum span").html());//当前选中的页码
var firstindex = parseInt($("#clickprev").next().children().html());
var lastindex = parseInt($("#clicknext").prev().children().html());
//alert("lastindex:"+lastindex);
if(numtoken==lastindex)//翻到头了
{
$(".pagination #pagenum").remove();
var newpagelist = pagearray.slice(lastindex,lastindex+9);
var rowcount = 0;
for(var i in newpagelist)
{
$("#clicknext").before("<li id='pagenum' class='page-item'><a class='page-link' href='#'
onclick='pointsearch("+newpagelist[i]+")'>"+newpagelist[i]+"</a></li>");
rowcount+=1;
}
//var startpage =parseInt($("#clickprev").next().children().html());
//var endpage =parseInt($("#clicknext").prev().children().html());
pointsearch(parseInt(numtoken)+1);
}
else
{
pointsearch(parseInt(numtoken)+1);
}
翻页的效果---采用“翻篇”的方法


}
function moveprev()//向前翻页
{
var numtoken = parseInt($("#pagenum span").html());//当前选中的页码
var firstindex = parseInt($("#clickprev").next().children().html());
if(numtoken==firstindex)
{
if(numtoken==1)
{ }
else
{
$(".pagination #pagenum").remove();
var newpagelist = pagearray.slice(firstindex-11,firstindex);
for(var i in newpagelist)
{
$("#clicknext").before("<li id='pagenum' class='page-item'><a class='page-link'
href='#' onclick='pointsearch("+newpagelist[i]+")'>"+newpagelist[i]+"</a></li>");
}
pointsearch(parseInt(numtoken)-1);
}
}
else
{
pointsearch(parseInt(numtoken)-1);
}
}


一例基于thinkphp,jquery和bootstrap渲染的查询数据分页器的更多相关文章

  1. 扩展 jquery miniui 组件实现自动查询数据

    主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...

  2. Thinkphp框架下对某个字段查询数据的时候进行唯一过滤,返回唯一不同的值

    方法一. DISTINCT 方法用于返回唯一不同的值 . *distinct方法的参数是一个布尔值. 用法: $data = $Model->Distinct(true)->field(' ...

  3. 基于jquery的bootstrap在线文本编辑器插件Summernote

    Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...

  4. 基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串、list集合(MVC5)<二>

    上篇博客给大家介绍了基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串.list集合(MVC5)<一>, 其中的两种方式都显得有些冗余.接着上篇博客继续 ...

  5. 出位的template.js 基于jquery的模板渲染插件

    找了好几款基于jquery的模板渲染插件,无一感觉很难用(教程较少.绑定不统一),也可能我智商问题,比如jquery template.js .jtemplate.js. 然后在github上找到这一 ...

  6. 基于jquery的bootstrap在线文本编辑器插件Summernote (转)

    Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...

  7. 基于jquery的bootstrap在线文本编辑器插件Summernote 简单强大

    Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...

  8. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  9. Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote

    Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...

随机推荐

  1. Leetcode之动态规划(DP)专题-413. 等差数列划分(Arithmetic Slices)

    Leetcode之动态规划(DP)专题-413. 等差数列划分(Arithmetic Slices) 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为 ...

  2. ns2的第一个tcl脚本

    set ns [new Simulator] set tracef [open example1.tr w]$ns trace-all $tracefset namtf [open example1. ...

  3. 论文阅读 | Generating Fluent Adversarial Examples for Natural Languages

    Generating Fluent Adversarial Examples for Natural Languages   ACL 2019 为自然语言生成流畅的对抗样本 摘要 有效地构建自然语言处 ...

  4. web端 微软 RDLC 报表插件 宽大于高 横向打印失效 解决方案

    起因于系统报表工具使用的RDLC,本地测试一直使用的纵向打印,未测试过横向打印

  5. 【BZOJ4668】冷战(并查集)

    Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表"铁幕演说",正式拉开了冷战序幕.美国和苏联同为世界上的"超级大国" ...

  6. 2019牛客暑期多校训练营(第二场)-F artition problem

    题目链接:https://ac.nowcoder.com/acm/contest/882/F 题意:将2×n个人分成两组,每组n个人,求一个组中所有人和另外一组的所有人的竞争值之和. 思路: 比赛时看 ...

  7. Python学习【day05】- Python文件处理

    一.打开文件 对文件的操作主要为三步:1.打开文件,得到文件句柄.2.通过句柄对文件进行操作.3.关闭文件 # 默认打开模式为r,encoding默认为系统文件编码 f=open('F:/Go.txt ...

  8. 关于Faster-RCNN训练细节

    Faster RCNN训练: 四部训练法: Faster R-CNN,可以大致分为两个部分,一个是RPN网络,另一个是Fast R-CNN网络,前者是一种候选框(proposal)的推荐算法,而后者则 ...

  9. shell脚本 自启动tomcat,nginx

    分为2步走 1. 脚本文件 : /usr/local 2. crontab -e : /5 * * * /bin/sh /usr/local/restart.sh 注意事项:可能用户权限会影响脚本的部 ...

  10. access注入

    前面有自己总结详细的mysql注入,自己access注入碰到的比较少,虽然比较简单,但是这里做一个总结 union联合查询法: 因为union前后字段数相同,所以可以先用order by 22 使查询 ...