jQuery+pjax简单示例汇总


Posted in jQuery onApril 21, 2017

pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮。

ajax缺点是破坏了浏览器的前进后退,因为ajax的请求不会留在历史记录中。pjax就不一样了,pjax被解释成ajax+pushState的封装,因为它把ajax的请求写入历史记录,并反映在地址栏,这样用户就能愉快地使用前进后退了。pjax有好几个实现方法,这里使用最常用的jQuery库,使用jquery.pjax.js。演示代码的服务器端使用PHP脚本语言。

Pjax用在那儿?就说百度云盘吧,这个大家肯定都用过。百度云盘PC端,在点击打开某个文件夹后会打开这个文件夹下的文件,其实显示文件的这个div就用到了pjax技术。地址栏变换,内容更换,但是却是一个ajax请求。等到后退的时候,不必重新请求上一层文件夹的内容,因为是存在在历史记录中的。而且,开发者还可以选择时候使用cache和storage缓存。

示例一、

<!DOCTYPE html>
<html>
<head>
 <title>pjax</title>
  <meta charset="utf-8">
</head>
<body>
 <h1>My Site</h1>
 <div>
  Go to <a href="res1.php" rel="external nofollow" >第一页</a>.<a href="res2.php" rel="external nofollow" >第二页</a>
 </div>
 <div id="container"></div>  
</body>
<script src="../jquery-2.1.4.min.js"></script>
<script src="../jquery.pjax.js"></script>
<script type="text/javascript">
$(document).pjax('a', '#container')
</script>
</html>

res1.php

<?php 
echo "<div style='background:red;'>第一页</div>";

res2.php

<?php 
echo "<div style='background:red;'>第二页</div>";

解释:

$(document).pjax('a', '#Container') 其中 a 是触发元素, #container 是装载 pjax 返回内容的容器,下面也是这样。

示例二、

<!DOCTYPE html>
<html>
<head>
 <title>pjax</title>
  <meta charset="utf-8">
</head>
<body>
 <h1>My Site</h1>
 <div>
  <input type="button" id="clickMe" value="GO">
 </div>
 <div id="container"></div>  
</body>
<script src="../jquery-2.1.4.min.js"></script>
<script src="../jquery.pjax.js"></script>
<script type="text/javascript">
$(function(){
  $('#clickMe').click(function(){
    $.pjax({
      url: './res3.php',
      container: '#container'
    });
  });
});
</script>
</html>

服务器端代码:

res3.php:

<?php 
echo "<div style='background:red;'>第三页</div>";

三综合应用

window.history.pushState(state, title, url);
// https://developer.mozilla.org/zh-CN/docs/Web/API/History/pushState
// @状态对象:  记录历史记录点的额外对象,可以为空.
// @页面标题:  目前所有浏览器都不支持.
// @可选的URL: 浏览器不会检查URL是否存在,只改变URL.URL必须同域,不能跨域.

PJAX其实就是HTML5 window.history.pushState(state, title, url)这个新的API加上传统的AJAX技术,一般用来实现无刷新的页面加载.pushState的作用主要是:改变URL和添加返回历史.这样AJAX无刷新加载页面后,用户还可以正常进行后退和前进,JS的window.history.back()和window.history.forward()也能正常工作.下面就是一个用pushState + jQuery AJAX实现的无刷新的页面加载,不支持的浏览器则自动退化成打开原始的链接打开形式.

index.php:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Index</title>
<script src="jquery.js"></script>
</head>
<body>
<div id="main">
  <a href="data.php" rel="external nofollow" >data.php</a>
  <script>
  $(document).ready(function() {
    $('#main').on('click','a',function(e) {
      if(window.history.pushState) {
        e.preventDefault(); //不跟随原链接跳转
        url = $(this).attr('href');
        $.ajax({
          async: true,
          type: 'GET',
          url: 'data.php',
          data: 'pjax=1',
          success: function(data) {
            window.history.pushState(null, null, url); //改变URL和添加返回历史
            document.title = data.title; //设置标题
            $('#main').html(data.main); //设置内容
          }
        });
      } else {
        return; //低版本IE8等不支持HTML5 pushState,直接返回进行链接跳转
      }
    });
  });
  </script>
</div>
</body>
</html>

data.php:

<?php
if(isset($_GET['pjax'])) {
  //PJAX请求返回JSON
  $arr['title'] = 'Data';
  $arr['main'] = '<h1>Data Content</h1>';
  //下面这两句是把PHP数组转成JSON对象返回
  header('Content-Type: application/json; charset=utf-8');
  echo json_encode($arr);
} else {
  //常规请求返回HTML
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Data</title>
<script src="jquery.js"></script>
</head>
<body>
<div id="main"><h1>Data Content</h1></div>
</body>
</html>
<?php } ?>

注意,JS统计代码应该放到main块里面才能正常统计页面访问数.

示例二:

<div class="body"> 
  <?php $action_name = $Think.ACTION_NAME; ?> 
 
  <!-- 头部哟 --> 
  <?php if ($action_name == 'news'): ?> 
    <include file="Brand:header_news" /> 
  <?php elseif ($action_name == 'forum'): ?> 
    <include file="Brand:header_forum" /> 
  <?php endif; ?> 
 
  <!-- 资讯的二级分类 --> 
  <div class="cb"></div> 
  <div class="brand-news-nav pjax"> 
    <ul class="clearfix"> 
      <li <?php if($_GET['cat'] == '') echo 'class="selected"'; ?>><a class="first" href="{:U("Brand/$action_name")}">全部</a></li> 
      <volist name="cat_list" id="vo" key="i"> 
        <li <?php if($_GET['cat'] == $vo['id']) echo 'class="selected"'; ?>><a href="{:U("Brand/$action_name",array('cat'=>$vo['id']))}">{$vo.name}</a></li> 
      </volist> 
    </ul> 
  </div> 
 
  <script type="text/javascript"> 
    $(function(){ 
      $(document).pjax('.pjax a', '#pjax-container',{ 
        type:'post', 
        scrollTo:false, 
      }); 
      $(document).on('pjax:click', function() { 
        enable_loading = false; 
      }) 
      $(document).on('pjax:send', function(){ 
        var str = "<p class='tc mt-10'>加载中...</p>"; 
        $('#pjax-container').html(str); 
      }) 
 
      //最后一个右侧加边框 
      $(".brand-news-nav ul li").last().children('a').addClass('last'); 
      $(".brand-news-nav ul li").click(function(){ 
        $(this).addClass('selected').siblings().removeClass('selected'); 
      }) 
    }) 
  </script> 
 
  <!-- 文章列表页 --> 
  <div class="wrap clearfix"> 
    <div class="brand-news-list fl" id="pjax-container"> 
      <include file="Brand:article_pjax" /> 
    </div> 
    <div class="brand-news-right fr pb-20"> 
      <a href="{$adv3[0]['url']}"><img class="scrollLoading" data-url="{$adv3[0]['images']|showImagePath}" src="__PUBLIC__/index/images/loading270x160.gif" width="260" height="150"></a> 
      <p class="title mt-10">法律支持</p> 
      <ul class="bgc-fff"> 
        <volist name="law_list" id="vo"> 
          <a href="{:U('law',array('id'=>$vo['id']))}"><li>{$vo.name}</li></a> 
        </volist> 
      </ul> 
      <button class="btn btn-right mt-10 btn-consult">免费咨询</button> 
      <script type="text/javascript"> 
        $(function(){ 
          //最后一个需要添加一个last的样式 
          $(".brand-news-right li:last").addClass('last'); 
        }) 
      </script> 
    </div> 
  </div> 
</div>

服务端代码

if(is_pjax()){ 
  $this->display('article_pjax'); 
}else{ 
  $this->display('article'); 
}
//判断是否是pjax请求 
function is_pjax(){ 
  return array_key_exists('HTTP_X_PJAX', $_SERVER) && $_SERVER['HTTP_X_PJAX']; 
}

其中的主要思想就是当.pjax a进行点击的时候,将#pjax-container的内容替换为请求后的内容。在后端处理时需要判断是否是pjax请求,如果是需要进行局部渲染,如果不是进行全部渲染。

因为pjax用到了HTML5技术,如果浏览器不支持Html5那么网站会正常进行跳转式的加载,如果支持那么只是进行局部渲染(但是浏览器地址栏中的url会正常跟着a链接进行变动)。

注意上述的js代码中在配置pjax时有个参数scrollTo:false,加上此参数表示点击连接后网页的scrollBar不会变动,如没有此参数,每次点击时浏览视窗会自动跳转到网页顶部

小结:Pjax实际就是从服务器端返回一段代码片段,而不用刷新页面,并且同时对 url 地址进行修改,这样可以节省资源加载,提升页面加载速度。

附: pjax的github项目地址 https://github.com/defunkt/jquery-pjax

jQuery 相关文章推荐
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
关于jquery中attr()和prop()方法的区别
May 28 jQuery
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
jQuery实现弹幕特效
Nov 29 jQuery
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
基于jQuery实现文字打印动态效果
Apr 21 #jQuery
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
Apr 20 #jQuery
jquery将标签元素的高设为屏幕的百分比
Apr 19 #jQuery
jQuery Plupload上传插件的使用
Apr 19 #jQuery
jQuery ajax请求struts action实现异步刷新
Apr 19 #jQuery
jQuery加密密码到cookie的实现代码
Apr 18 #jQuery
Jquery-data的三种用法
Apr 18 #jQuery
You might like
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python搭建简易服务器分析与实现
2012/12/15 Python
Python的函数的一些高阶特性
2015/04/27 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
英语专业学生个人求职信
2014/01/28 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
银行服务感言
2014/03/01 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
答谢会策划方案
2014/05/12 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
党内外群众意见范文
2015/06/02 职场文书
首都博物馆观后感
2015/06/05 职场文书
Python实现Hash算法
2022/03/18 Python