1.前言

    作为一名php程序员,我们开发网站主要就是为了客户从客户端进行体验,在这里,thinkphp框架自带的分页类是每次翻页都要刷新一下整个页面,这种翻页的用户体验显然是不太理想的,我们希望每次翻页只刷新我们想要的数据集部分的数据,这样可以给客户带来很好的体验效果。那么在TP下如何进行ajax无刷新分页呢?

  1.1建立ajax分页

    在TP框架的ThinkPHP\Library\Think文件夹下,有框架自己的page.class.php,我们新建一个Ajaxpage.class.php,下面这个类是我实际用到项目中的

        当然,你也可以不在这里建立,在需要的控制器方法里面可以 require_once "require_once APP_ROOT_PATH.'Ajaxpage.class.php';     //php加载ajax分页类"

  1. <?php
  2. //【如果使用了TP3.2,请在这里加上namespace Think;】
  3. class Ajaxpage {
  4. // 分页栏每页显示的页数
  5. public $rollPage = 5;
  6. // 页数跳转时要带的参数
  7. public $parameter ;
  8. // 默认列表每页显示行数
  9. public $listRows = 20;
  10. // 起始行数
  11. public $firstRow ;
  12. // 分页总页面数
  13. protected $totalPages ;
  14. // 总行数
  15. protected $totalRows ;
  16. // 当前页数
  17. protected $nowPage ;
  18. // 分页的栏的总页数
  19. protected $coolPages ;
  20. // 分页显示定制
  21. protected $config = array('header'=>'条记录','prev'=>'上一页','next'=>'下一页','first'=>'第一页','last'=>'最后一页','theme'=>' %totalRow% %header% %nowPage%/%totalPage% 页 %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end%');
  22. // 默认分页变量名
  23. protected $varPage;
  24.  
  25. public function __construct($totalRows,$listRows='',$ajax_func,$parameter='') {
  26. $this->totalRows = $totalRows;
  27. $this->ajax_func = $ajax_func;
  28. $this->parameter = $parameter;
  29. $this->varPage = 'p' ;
  30. if(!empty($listRows)) {
  31. $this->listRows = intval($listRows);
  32. }
  33. $this->totalPages = ceil($this->totalRows/$this->listRows); //总页数
  34. $this->coolPages = ceil($this->totalPages/$this->rollPage);
  35. $this->nowPage = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
  36. if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
  37. $this->nowPage = $this->totalPages;
  38. }
  39. $this->firstRow = $this->listRows*($this->nowPage-1);
  40. }
  41.  
  42. public function nowpage($totalRows,$listRows='',$ajax_func,$parameter='') {
  43. $this->totalRows = $totalRows;
  44. $this->ajax_func = $ajax_func;
  45. $this->parameter = $parameter;
  46. $this->varPage = 'p' ;
  47. if(!empty($listRows)) {
  48. $this->listRows = intval($listRows);
  49. }
  50. $this->totalPages = ceil($this->totalRows/$this->listRows); //总页数
  51. $this->coolPages = ceil($this->totalPages/$this->rollPage);
  52. $this->nowPage = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
  53. if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
  54. $this->nowPage = $this->totalPages;
  55. }
  56. $this->firstRow = $this->listRows*($this->nowPage-1);
  57.  
  58. return $this->nowPage;
  59. }
  60.  
  61. public function setConfig($name,$value) {
  62. if(isset($this->config[$name])) {
  63. $this->config[$name] = $value;
  64. }
  65. }
  66.  
  67. public function show() {
  68. if(0 == $this->totalRows) return '';
  69. $p = $this->varPage;
  70. $nowCoolPage = ceil($this->nowPage/$this->rollPage);
  71. $url = $_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':"?").$this->parameter;
  72. $parse = parse_url($url);
  73. if(isset($parse['query'])) {
  74. parse_str($parse['query'],$params);
  75. unset($params[$p]);
  76. $url = $parse['path'].'?'.http_build_query($params);
  77. }
  78. //上下翻页字符串
  79. $upRow = $this->nowPage-1;
  80. $downRow = $this->nowPage+1;
  81. if ($upRow>0){
  82. $upPage="<a class='ajaxify' id='big' href='JavaScript:".$this->ajax_func."(".$upRow.")'>".$this->config['prev']."</a>";
  83. }else{
  84. $upPage="";
  85. }
  86.  
  87. if ($downRow <= $this->totalPages){
  88. $downPage="<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$downRow.")'>".$this->config['next']."</a>";
  89. }else{
  90. $downPage="";
  91. }
  92. // << < > >>
  93. if($nowCoolPage == 1){
  94. $theFirst = "";
  95. $prePage = "";
  96. }else{
  97. $preRow = $this->nowPage-$this->rollPage;
  98. $prePage = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$preRow.")'>上".$this->rollPage."页</a>";
  99. $theFirst = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(1)' >".$this->config['first']."</a>";
  100. }
  101. if($nowCoolPage == $this->coolPages){
  102. $nextPage = "";
  103. $theEnd="";
  104. }else{
  105. $nextRow = $this->nowPage+$this->rollPage;
  106. $theEndRow = $this->totalPages;
  107. $nextPage = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$nextRow.")' >下".$this->rollPage."页</a>";
  108. $theEnd = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$theEndRow.")' >".$this->config['last']."</a>";
  109. }
  110. // 1 2 3 4 5
  111. $linkPage = "";
  112. for($i=1;$i<=$this->rollPage;$i++){
  113. $page=($nowCoolPage-1)*$this->rollPage+$i;
  114. if($page!=$this->nowPage){
  115. if($page<=$this->totalPages){
  116. $linkPage .= " <a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$page.")'> ".$page." </a>";
  117. }else{
  118. break;
  119. }
  120. }else{
  121. if($this->totalPages != 1){
  122. $linkPage .= " <span class='current'>".$page."</span>";
  123. }
  124. }
  125. }
  126. $pageStr = str_replace(
  127. array('%header%','%nowPage%','%totalRow%','%totalPage%','%upPage%','%downPage%','%first%','%prePage%','%linkPage%','%nextPage%','%end%'),
  128. array($this->config['header'],$this->nowPage,$this->totalRows,$this->totalPages,$upPage,$downPage,$theFirst,$prePage,$linkPage,$nextPage,$theEnd),$this->config['theme']);
  129. return $pageStr;
  130. }
  131.  
  132. }
  133.  
  134. ?>

  2、ajax调用地址==》》 ajaxModule.class.php下的article_show_comment方法,返回结果:就是我们要替换的html数据和标签(注意:这里我写的是php的ajax方法,不是一个简单的method,通俗点就是jQuery的ajax里面的url)

  1. public function article_show_comment(){
  2. //统计要查询数据的数量
  3. $page_size = 5; //评论固定5条
  4. $page = intval($_REQUEST['p']);
  5. $id = intval($_REQUEST['id']);
  6. if(empty($page))$page = 1;
  7. $limit = (($page-1)*$page_size).",".$page_size ;
  8.  
  9. $list = $GLOBALS['db']->getAll("select * from ".DB_PREFIX."article_comment where article_id = ".$id." and log_id = 0 and status=1 order by create_time desc limit ".$limit);
  10. $count = $GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."article_comment where article_id = ".$id." and log_id = 0 and status=1");
  11.  
  12. //TP3.2使用下面
  13. //$where['status'] = array('gt',-1);
  14. //$_REQURST['cond'] && $where['cond'] = $_REQURST['cond']; //多条件查询判断
  15. // $list = M('Action')->where($where)->order('id desc')->limit($limit)->select();
  16. // $count[0]['count'] = M('Action')->where($where)->count("*");
  17. //end TP3.2
  18.  
  19. //实例化分页类,传入三个参数,分别是总记录数、每页显示条数、要调用的jQuery ajax方法名
  20. require_once APP_ROOT_PATH.'app/Lib/Ajaxpage.class.php'; //php加载ajax分页类
  21. $p = new Ajaxpage($count[0]['count'],$page_size,'index'); //'index'是jQuery里面ajax方法名
  22. //产生分页信息
  23. $page=$p->show();
  24. //要查询的数据,limit表示每页查询的数量,这里为10条
  25. //$data = $info->where($where)->limit($p->firstRow.','.$p->listRows)->select();
  26. //assign方法往模板赋值
  27. $GLOBALS['tmpl']->assign('list',$list); //模板变量赋值
  28. $GLOBALS['tmpl']->assign('page',$page);
  29. //ajax返回信息,就是要替换的模板
  30. $res["content"] = $GLOBALS['tmpl']->fetch("article_show_comment.html"); //渲染模板,不输出但是接收模板内容(得到html块,用于替换主页面的分页div)
  31. echo json_encode($res);
  32. }

  3、模板文件【deal_show.html】

直接在原模板文件</body>之前加上ajax方法,用来翻页作用,代码如下:

  1. <!-- ajax+php分页 -xzz5.11 -->
  2. <script type="text/javascript">
  3. $(function(){
  4. var init_id = 1;     
  5. index(init_id); //初始化页面 init_id==1
  6. });
  7.  
  8. function index(id){
  9. var id = id;
  10. var deal_id = {$deal_info.id};
  11. //把数据传递到要替换的控制器方法中,这里你还可以传入查询字段,比如phone,name等,后台通过【是否为空】来做过滤
  12. $.ajax({
  13. url:"/index.php?ctl=ajax&act=deal_show_comment",
  14. type:"GET",
  15. async:false,
  16. dataType:"JSON",
  17. data:{'p':id,'id':deal_id},  //把查询字段和值 通过这里传给后台ajax,实现多条件ajax查询分页
  18. success:function(data){
  19. //用get方法发送信息到ajax中的deal_show_comment方法
  20. $("#pagination").replaceWith(data.content); //html块替换html的div
  21. },
  22. error:function(data){
  23. console.log("4:ajax not run~");
  24. }
  25. });
  26. }
  27. </script>

  4、注意啦,你应该还有一个页面【article_show_comment.html】,就是php进行  $this->assign("list",$list);

  fetch()非常关键,获取的list和page数据渲染后的模板html文件,但是不输出,这里是关键点。====>>>>>>>>>>重中之重,fetch()的结果是:html块,用来替换deal_show.html的分页块

  我们的目的:把独立的【rticle_show_comment.html】文件,去替换【deal_show.html】文件里面的<div>,看好哦,是【deal_show.html】展示分页数据list和分页$page的<div>。 明白了这个你就成功一半了。

  使用TP的fetch()方法,在上面的ajaxModule.class.php的方法已经介绍了,在末尾部分,不懂自行查看TP手册fetch()

  这里就给出替换内容的article_show_comment.html(ajax动态生成DOM,原来的关联js无效,所以再次引入即可)。

  1. <div id="pagination">
  2. <div class="blank0"></div>
  3. {foreach from=$list item=comment_item}
  4. {include file="inc/comment_item_nolog.html"}   <!-- 这里的话,就是php另外引入的一个html文件,用来循环数据,在我的项目里他和下面的js有关联 -->
  5. {/foreach}
  6. <div class="blank0"></div>
  7. <div class="pages">{$page}</div>
  8. </div>
  9.  
  10. <!-- 上面是动态生成的DOM,原html模板页面的关联js不生效,所以你没ajax调用一次,就需要引入一下js -->
  11. <script type="text/javascript" src="{$TMPL}/js/deal_comment.js"></script>

  5、顺便提一下,ajaxModule.class.php和XXXXModule.class.php完全是不同的2个控制器(因为TP2.0版本控制器就是Module,你要是TP3.1以后的,可以看成是AjaxController.class.php 都可以的),一个用来返回ajax请求的结果,一个是普通的控制器。

 6、在最后,顺道感谢  小king哥,ThankU!

TP2.0或3.1 或者 3.2 下使用ajax+php做无刷新分页(转+自创)的更多相关文章

  1. Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现

    简单三步实现图片无刷新上传:注意是上传,至于上传时的验证,比如图片的尺寸,大小,格式判断.限制等,自行解决. 兼容性想还不错:FF,CH,IE,猎豹,都是可以实现的.如果看到回显.当然就是成功了. 经 ...

  2. 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项。

    在用asp.net MVC3 的MusicStore时候 Edit某个数据项时提示下面的错误: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectSt ...

  3. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  4. docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」

    很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...

  5. OLE DB访问接口“MICROSOFT.JET.OLEDB.4.0”配置为在单线程单位模式下运行,所以该访问接口无法用于分布式

    OLE DB访问接口"MICROSOFT.JET.OLEDB.4.0"配置为在单线程单位模式下运行,所以该访问接口无法用于分布式 数据库操作excel时遇到的以上问题的解决方法 解 ...

  6. Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

    http://stackoverflow.com/questions/24725261/how-to-use-a-custom-identity-column-in-sql-with-entity-f ...

  7. vue2.0 不引用第三方包的情况下实现嵌套对象的拖拽排序功能

    先上一张效果图,然后再上代码(由于只做效果,未做数据相关的处理:实际处理数据时不修改 dom 元素,只是利用 dom 元素传递数据,然后需改数据,靠数据驱动效果) <div :id=" ...

  8. SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)

    软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...

  9. thinkphp5.0调用ajax无刷新加载数据

    控制器层那边就是调数据返回,这里不再赘述,视图层页面ajax部分写法如下 function shanchu(obj) { var code = $(obj).attr("code" ...

随机推荐

  1. git 查看commit提交的内容

    在使用git的过程中,我们经常需要查看某次commit修改了哪些内容,与之相关的命令就是: git log git show 首先,需要通过git log打印所有commit hashID,之后的gi ...

  2. Android之ListView和GridVIew加载图片

    清除缓存:ImageLoader 对象 . clearCache(); 使用: ImageLoader loader = new ImageLoader(ApplicationContext cont ...

  3. Json解析教程(四.FastJson 的使用)

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  4. uva 10618 Tango Tango Insurrection 解题报告

    Tango Tango Insurrection Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebu ...

  5. OpenCV学习(18) 细化算法(6)

    本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示 ...

  6. Informatica 常用组件Source Qualifier之八 会话前和会话后 SQL

      可以在源限定符转换的"属性"选项卡中添加会话前和会话后 SQL 命令.您可能要使用会话前 SQL 以在会话开始时将时间标识行写入源表. PowerCenter 在读取源之前对源 ...

  7. Mac OS中Java Servlet与Http通信

    Java中一个Servlet其实就是一个类,用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序.Servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器 ...

  8. 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

    WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...

  9. 关于COM的Unicode string的精彩论述

    I need to make a detour for a few moments, and discuss how to handle strings in COM code. If you are ...

  10. 避免闪烁的方法(OnEraseBkgnd)

    在图形图象处理编程过程中,双缓冲是一种主要的技术.我们知道,假设窗口在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗口在重绘时因为过频的刷新而引起闪烁现象. 解决这一问题的有效方法就是双缓 ...