一例基于thinkphp,jquery和bootstrap渲染的查询数据分页器
对于某些查询记录很多的结果,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渲染的查询数据分页器的更多相关文章
- 扩展 jquery miniui 组件实现自动查询数据
主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...
- Thinkphp框架下对某个字段查询数据的时候进行唯一过滤,返回唯一不同的值
方法一. DISTINCT 方法用于返回唯一不同的值 . *distinct方法的参数是一个布尔值. 用法: $data = $Model->Distinct(true)->field(' ...
- 基于jquery的bootstrap在线文本编辑器插件Summernote
Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...
- 基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串、list集合(MVC5)<二>
上篇博客给大家介绍了基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串.list集合(MVC5)<一>, 其中的两种方式都显得有些冗余.接着上篇博客继续 ...
- 出位的template.js 基于jquery的模板渲染插件
找了好几款基于jquery的模板渲染插件,无一感觉很难用(教程较少.绑定不统一),也可能我智商问题,比如jquery template.js .jtemplate.js. 然后在github上找到这一 ...
- 基于jquery的bootstrap在线文本编辑器插件Summernote (转)
Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...
- 基于jquery的bootstrap在线文本编辑器插件Summernote 简单强大
Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...
- MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件
MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...
- Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
Summernote是一个基于jquery的bootstrap超级简单WYSIWYG在线编辑器.Summernote非常的轻量级,大小只有30KB,支持Safari,Chrome,Firefox.Op ...
随机推荐
- configparser模块,subprocess 模块,xlrd,xlwt ,xml 模块,面向对象
1. configparser模块 2.subprocess 模块 3.xlrd,xlwt 4.xml 模块 5.面向对象 面向对象是什么? 是一种编程思想,指导你如何更好的编写代码 关注点在对象 具 ...
- 解析之IIS解析
- NOIp2018D1T1 积木大赛 【思维】
题目传送门 感觉不是很难,但是需要一些思考... 可以发现,贪心地向尽量大的区间添加,但是存在一些比较小的数,它们不需要再加了,就会从那个地方断成两个区间.所以刚开始想到的做法就是统计每一种数的数量, ...
- Sublime Text 3 注册激活码
Sublime Text 3 注册激活码 ----- BEGIN LICENSE ----- sgbteam Single User License EA7E-1153259 8891CBB9 F15 ...
- const和static const的区别(未整理)
对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调 ...
- 使用chattr禁止文件被删除
chattr 是个啥? chattr 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性 使用方法 +i or -i 设置/取消文件不能进行修改:即你不能删除它, 也不能给它重新命名,你不能 ...
- Java web验证码——kaptcha的使用
一.配置kaptcha的jar包 pom.xml配置: <-- 目前只有2.3.2版本--> <!-- https://mvnrepository.com/artifact/com. ...
- mysql架构总结
1.单机架构模式,多用于测试,实际生产中需优化: 2.一主多从,主数据库读和写,从数据库从主数据库同步,仅负责读,可解决一定访问量的需求: 3.MHA(Master High Availability ...
- 关于redis的几件小事(六)redis的持久化
1.redis持久化的意义 redis持久化的意义,在于 故障恢复 . 如果没有对数据进行持久化,那么如果redis遇到灾难性的故障,就会丢失所有的数据. 如果通过redis的持久化机制将数据持久化到 ...
- vue iview面包屑
简单看一下vue,iview的面包屑怎么写呢? 简单的思路:1.获取到路由记录$route.matched 2.渲染 效果: 一.$route.matched 官网地址:https://router. ...