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使用正则验证15/18身份证的方法示例
Apr 27 jQuery
JavaScript之事件委托实例(附原生js和jQuery代码)
Jul 22 jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
jQuery实现的淡入淡出与滑入滑出效果示例
Apr 18 jQuery
jQuery中的for循环var与let的区别
Apr 21 jQuery
jQuery实现炫丽的3d旋转星空效果
Jul 04 jQuery
JQueryDOM之样式操作
Mar 27 jQuery
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 jQuery
jquery实现点击弹出对话框
Feb 08 jQuery
jquery实现两个div中的元素相互拖动的方法分析
Apr 05 jQuery
基于ajax及jQuery实现局部刷新过程解析
Sep 12 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
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
Python中断言Assertion的一些改进方案
2016/10/27 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python实现对adb命令封装
2020/03/06 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
文明餐桌行动实施方案
2014/02/19 职场文书
本科毕业生求职信
2014/06/15 职场文书
运动会200米广播稿
2015/08/19 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL