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实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
jquery插件canvaspercent.js实现百分比圆饼效果
Jul 18 jQuery
原生js jquery ajax请求以及jsonp的调用方法
Aug 04 jQuery
jQuery Position方法使用和兼容性
Aug 23 jQuery
jQuery代码优化方法总结
Jan 29 jQuery
jQuery Dom元素操作技巧
Feb 04 jQuery
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
jQuery实现高级检索功能
May 28 jQuery
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
jQuery实现聊天对话框
Feb 08 jQuery
jQuery 隐藏/显示效果函数用法实例分析
May 20 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利用cookie实现自动登录的方法
2014/12/10 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
SVG实现时钟效果
2018/07/17 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
使用matplotlib画散点图的方法
2018/05/25 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python实现两张图片的像素融合
2019/02/23 Python
python把转列表为集合的方法
2019/06/28 Python
财务会计专业毕业生自荐信
2013/10/02 职场文书
自我鉴定怎么写
2013/12/05 职场文书
春季防火方案
2014/05/10 职场文书
六五普法宣传标语
2014/10/06 职场文书
童年读书笔记
2015/06/26 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
pt-archiver 主键自增
2022/04/26 MySQL