pjax使用小结(一)

简介: pjax使用小结(一)

前言



上周看到一篇文章在分析简书 我的主页 页面 3 个 tab 页切换的 bug,起先以为是寻常的样式 bug 而已没怎么在意,后来在文章中看到 pjax 这个术语,长得和 ajax 有点像,遂去了解了下。


简介



虽然传统的 ajax 方式可以异步无刷新改变页面内容,但无法改变页面 URL,因此有种方案是在内容发生改变后通过改变 URL 的 hash 的方式获得更好的可访问性(如 https://liyu365.github.io/BG-UI/tpl/#page/desktop.html),但是 hash 的方式有时候不能很好的处理浏览器的前进、后退,而且常规代码要切换到这种方式还要做不少额外的处理。而 pjax 的出现就是为了解决这些问题,简单的说就是对 ajax 的加强。


pjax 结合 pushState 和 ajax 技术, 不需要重新加载整个页面就能从服务器加载 Html 到你当前页面,这个 ajax 请求会有永久链接、title 并支持浏览器的回退/前进按钮。


pjax 项目地址在 https://github.com/defunkt/jquery-pjax 。 实际的效果见: http://pjax.herokuapp.com 没有勾选 pjax 的时候点击链接是跳转的,


勾选了之后链接都是变成了 ajax 刷新(实际效果如下图的请求内容对比)。


image.png


不使用pjax


image.png



使用pjax


优点:


  • 减轻服务端压力


按需请求,每次只需加载页面的部分内容,而不用重复加载一些公共的资源文件和不变的页面结构,大大减小了数据请求量,以减轻对服务器的带宽和性能压力,还大大提升了页面的加载速度。


  • 优化页面跳转体验


常规页面跳转需要重新加载画面上的内容,会有明显的闪烁,而且往往和跳转前的页面没有连贯性,用户体验不是很好。如果再遇上页面比较庞大、网速又不是很好的情况,用户体验就更加雪上加霜了。使用pjax后,由于只刷新部分页面,切换效果更加流畅,而且可以定制过度动画,在等待页面加载的时候体验就比较舒服了。


缺点:


  • 不支持一些低版本的浏览器(如IE系列)


pjax使用了pushState来改变地址栏的url,这是html5中history的新特性,在某些旧版浏览器中可能不支持。不过pjax会进行判断,功能不适用的时候会执行默认的页面跳转操作。


  • 使服务端处理变得复杂


要做到普通请求返回完整页面,而pjax请求只返回部分页面,服务端就需要做一些特殊处理,当然这对于设计良好的后端框架来说,添加一些统一处理还是比较容易的,自然也没太大问题。另外,即使后台不做处理,设置pjax的fragment参数来达到同样的效果。


综合来看,pajx 的优点很强势,缺点也几乎可以忽略,还是非常值得推荐的,尤其是类似博客这种大部分情况下只有主体内容变化的网站。关键它使用简单、学习成本小,即时全站只有极个别页面能用得到,尝试下没什么损失。pjax 的 github 主页介绍的已经很详细了,想了解更多可以看下源码。


用法


  1. 引入 jquery 和 jquery.pjax.js
  2. 注册事件


/**
  * 方式一 按钮父节点监听事件
  *
  * @param selector  触发点击事件的按钮
  * @param container 展示刷新内容的容器,也就是会被替换的部分
  * @param options   参数
  */
$(document).pjax(selector, [container], options);
// 方式二 直接对按钮监听,可以不用指定容器,使用按钮的data-pjax属性值查找容器
$("a[data-pjax]").pjax();
// 方式三 常规的点击事件监听方式
$(document).on('click', 'a', $.pjax.click);
$(document).on('click', 'a', function(event) {
    var container = $(this).closest('[data-pjax-container]');
    $.pjax.click(event, container);
});
// 下列是源码中介绍的其他用法,由于本人暂时没有那些需求暂时没深究,有兴趣的各位自己试试看哈
// 表单提交
$(document).on('submit', 'form', function(event) {
    var container = $(this).closest('[data-pjax-container]');
    $.pjax.submit(event, container);
});
// 加载内容到指定容器
$.pjax({ url: this.href, container: '#main' });
// 重新当前页面容器的内容
$.pjax.reload('#container');


options默认参数说明



image.png

image.png


除了上述参数外,ajax 的一些参数也是可以设置在这里的,不过一般没什么必要。


// ajax 最终参数:  
options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options);
目录
相关文章
|
JavaScript
Jquery插件知识之Jquery.cookie实现页面传值
Jquery插件知识之Jquery.cookie实现页面传值
58 0
|
3月前
|
存储 JavaScript
JQuery 获取URL参数
JQuery 获取URL参数
37 0
|
JavaScript
JQuery常见事件: 一个html页面让你全了解
JQuery常见事件: 一个html页面让你全了解
140 0
JQuery常见事件: 一个html页面让你全了解
|
XML 前端开发 JavaScript
pjax使用小结(二)
pjax使用小结(二)
299 0
pjax使用小结(二)
|
移动开发 缓存 前端开发
PJAX实现
浏览器历史就像一堆卡片,如下所示:
PJAX实现
|
JavaScript 前端开发 PHP
emlog实现无刷新网页pjax
emlog实现无刷新网页pjax
133 0
emlog实现无刷新网页pjax
|
前端开发 JavaScript
dwz中对jqGrid设置a标签
dwz中对jqGrid设置a标签
171 0
dwz中对jqGrid设置a标签
|
JavaScript 前端开发 监控
原生JS的Ajax
转自:https://www.cnblogs.com/yufann/p/JS-Ajax.html 1.创建一个Ajax对象       非IE6浏览器:var obj = new XMLHttpReuqest();       IE6浏览器:var obj = new ActiveXbject("Microsoft.
749 0
|
Web App开发 缓存 前端开发