thinkphp+ajax无刷新分页并加载显示图片

回眸只為那壹抹淺笑 提交于 2019-12-04 07:46:05

    最近自己用thinkphp和bootstrap做一个小站点,在用到ajax与后台数据库交互实现无刷新分页时,因为我需要返回的数据是html代码,里面包含要显示出图片,然而返回数据到静态页面时,却发现返回的图片未被网页加载显示。找了一些资料,最后提取总结了别人一些经验,写了一个小技巧。这里纯属新手自学的总结,大牛们见怪莫怪。如果我的分享有不妥处,还望各位不吝赐教。

    先说下主要操作的思路:当静态页面的ajax提交后到后台进行数据查询和处理后,返回类似以下的html字符串

<img src='' width='250px' hieght='100px' alt='image' data-url='/wamp/www/schoolbag/Public/img/s2.jpg'>

    把这个用jquery的html方法插入的页面中是无法加载显示图片的。

    大家应该注意到上面的img标签中的data-url,平时没有实际的意义,但是这里可以作为一个技巧来用,当ajax返回数据成功后,即可以执行如下操作

$('#ajax_content').html(data['html']);
var img_url = $('#ajax_content img').attr('data-url');
$('#ajax_content img').attr('src',img_url);

第一行代码是将字符串放到静态页面上;第二行是把img标签中的data-url里的字符串(这里是图片地址)赋值给img_url;  第三行则是把img的src属性替换为img_url里的值。这样就可以实现图片的加载显示了。 

    大体的思路是这样,里面还有处理翻页按钮的隐藏和显示,不过自己觉得处理得不够好。刚开始用thinkphp分页时是使用默认的风格,后来想用自己的样式,经过一番观察发现里面的翻页也就是get方式提交翻页的页码,所以可以在前端静态页面上的分页按钮上修改一些链接,使其符合thinkphp分类的方法,后台的数据处理按照手册上来就行。下面是详细的代码。

    首先是静态代码:

<div class="container">
      <!--
      <div class="row">
      	<div class="span2 muted"><h4>最新动态</h4></div>
     		<div class="input-append span2 offset7 ">
    		  <input id="appendedInputButtons" type="text">
    		  <button class="btn" type="button">搜索</button>
    		</div>
  	  </div>
  	  -->
  	  <h4 class="muted">最新动态</h4>
      <div class="hr"><hr /></div>
      <ul class="thumbnails" id="ajax_content">
  		  <volist name="info_list" id="vo">
    		<li class="span2">
          <div class="thumbnail">  
            <a href="{$vo.url}"> 	    
            <img src="__PUBLIC__/img/s2.jpg" alt="" width="250px" hieght="100px">
            </a>
            <div class="caption"  id="lcontent">
              <h3>{$vo.headline}</h3>
        	    <p>{$vo.summary}</p>
              <p class="muted">{$vo.publishTime}</p>
      	    </div>
            
      	  </div>
    		</li> 
        </volist>
	    </ul>
    </div>
    <!--Thumbnails-end-->
    <!--paging-begin-->
    <div class="row-fluid paging">
      <li class="pull-left" id="pre_page">
        <!--<button class="btn btn-small" type="button" href="__ACTION__/p/{$pre_num}.html">< 上一页</button>--> 
        <a href="__ACTION__/p/{$pre_num}.html" class="btn">< 上一页</a>           
      </li>
      <li class="text-center active">
        {$c_num}/{$page_num}
      </li>
      <li class="pull-right" id="next_page">                       
        <!--<button class="btn btn-small" type="button" href="__ACTION__/p/{$next_num}.html">下一页 ></button>-->
        <a href="__ACTION__/p/{$next_num}.html" class="btn">下一页 ></a>
      </li>
    </div>
    <!--paging-end-->

(因为这是利用bootstrap,所以用上面代码之前要先加载bootstrap,具体可以在官网http://bootstrap.ninghao.net/index.html学习,或者自己查些资料教程看看,用起来挺方便的。)

    接下来是jquery的ajax提交:

<script>
    //首次加载页面时的操作,主要为了隐藏或显示翻页按钮
      $(document).ready(function (){
        {$adInpre_script}
        {$adInext_script}
      });
      $(function(){ 
        //触发ajax提交
        $('.paging a').click(
          function(){ 
            $.ajax({
              type: "GET",
              url:$(this).attr('href'),//取得a标签链接地址
              //返回数据前的操作
              beforeSend:function(){
              var loading = "<div class='progress progress-striped active'><div class='bar' style='width: 40%;'></div></div>";
                $("#ajax_content").html(loading);
              },
              //成功返回数据后的操作
              success:function(data){ 
                $('#ajax_content').html(data['html']);
                var img_url = $('#ajax_content img').attr('data-url');
                $('#ajax_content img').attr('src',img_url);
                $('.paging li:eq(2) a').attr('href',data['n']);//写入下一页按钮的链接
                $('.paging li:eq(0) a').attr('href',data['p']);//写入上一页按钮的链接
                $(".paging li:eq(1)").text(data['c']);//写入当前页码和总页码
                //下面的操作是决定上一页和下一页按钮隐藏或显示
                $(".paging li:eq(0)").removeClass("display");
                $(".paging li:eq(2)").removeClass("display");
                $(".paging li:eq(0)").addClass(data['pre_li']);
                $(".paging li:eq(2)").addClass(data['next_li']);
              }
            });
            return false;//使a标签失效
          }) 
      })
    </script>

    然后是后台的数据处理:

$num=5;//每页的记录数
      	$arr = array();//ajax返回的数组
	  	$info = M('Msg');
	  	$get_p = (empty($_GET['p']))?1:$_GET['p'];	      
		$info_list = $info->order('id desc')->page($get_p,$num)->select();
		for ($i=0;$i<count($info_list,COUNT_NORMAL);$i++) {
		  $info_list[$i]['publishTime']=date("Y-m-d H:i",$info_list[$i]['publishTime']);
		}
		for ($j=0;$j<$num;$j++) {      //ajax返回的一部分内容
			if (isset($info_list[$j]['id'])) {
			$arr['html'] = $arr['html']."<li class='span2'>
	          <div class='thumbnail'>
	      	    <a href='{$info_list[$j][url]}'>
	              <img src='' width='250px' hieght='100px' alt='image' data-url='/wamp/www/schoolbag/Public/img/s2.jpg'>
	            </a>
	            <div class='caption'>
	              <h3>{$info_list[$j][headline]}</h3>
	        	    <p>{$info_list[$j][summary]}</p>
	              <p class='muted'>{$info_list[$j][publishTime]}</p>
	      	    </div>
	      	  </div>
	    		</li> ";
    		}
		}				
	  	$this->assign('info_list',$info_list);//第一次打开网页时输出数据
	  	import("ORG.Util.Page");// 导入分页类
	  	$count = $info->count();// 查询满足要求的总记录数
	  	$Page = new Page($count,$num);// 实例化分页类 传入总记录数和每页显示的记录数
	  	$page_num=ceil($count/$num);//页码总数
	  	if (!empty($_GET['p'])) {   //这里代表有ajax提交
			$c_num = $_GET['p'];//当前页码
	    	if ($_GET['p']>=$page_num||$page_num==1) {//隐藏下一页按钮
		  		$arr['next_li'] = "display";
	    	}
	    	//隐藏pre按钮
	    	if ($_GET['p']<=1) {  //隐藏上一页按钮
		  		$arr['pre_li'] = "display";
	    	}
	    	$arr['c'] = "{$_GET['p']}"."/".$page_num;//ajax返回当前页码/总页码		  
			$p = $_GET['p']-1;
			$n = $_GET['p']+1;
			$arr['n'] = '/wamp/www/schoolbag/index.php/Index/index/p/'.$n.'.html';//下一页按钮链接地址
			$arr['p'] = '/wamp/www/schoolbag/index.php/Index/index/p/'.$p.'.html';//上一页按钮链接地址
	    	$this->ajaxReturn($arr);//ajax返回数据
	  	}else {
			$c_num = 1;
	  	}
	  	$pre_num = $c_num-1;//上一页页码
	  	$next_num = $c_num+1;//下一页页码
	  	//隐藏下一页按钮
	  	$adInpre_script='$(".paging li:eq(2)").addClass("display");';
	  	if ($c_num>=$page_num||$page_num==1) {
			$this->assign('adInpre_script',$adInpre_script);
	  	}
	  	//隐藏上一页按钮
	  	$adInext_script='$(".paging li:eq(0)").addClass("display");';
	  	if ($c_num<=1) {
			$this->assign('adInext_script',$adInext_script);
	  	}
	  	$this->assign('page_num',$page_num);//输出总页码
	  	$this->assign('c_num',$c_num);//输出当前页码
	  	$this->assign('pre_num',$pre_num);//输出上一页页码
	  	$this->assign('next_num',$next_num);//输出下一页页码
      	$this->display();

    因为有注释,所以就不多讲了哈。本人只是小白,这些是仅供新手参考。因为逻辑比较简单,并且只是为了讲述小技巧,所以代码细节方面没做好,见谅。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!