介绍

pjax是一个jQuery插件,它通过ajax和pushState技术提供了极速的(无刷新ajax加载)浏览体验,并且保持了真实的地址、网页标题,浏览器的后退(前进)按钮也可以正常使用。

pjax的工作原理是通过ajax从服务器端获取HTML,在页面中用获取到的HTML替换指定容器元素中的内容。然后使用pushState技术更新浏览器地址栏中的当前地址。以下两点原因决定了pjax会有更快的浏览体验:

  • 不存在页面资源(js/css)的重复加载和应用;
  • 如果服务器端配置了pjax,它可以只渲染页面局部内容,从而避免服务器渲染完整布局的额外开销。

项目现状

jquery-pjax的维护方向:可能会继续修复重要的bug,但其功能不会再发生变化,即不会再实现新功能,也不会再扩展现有功能。

使用方法

最简单常见的pjax使用方法如下:

$(document).pjax('a', '#pjax-container')

通过这种方式可以让页面中所有的链接都实现pjax加载,并指定#pjax-container作为容器元素。

如果您正在迁移已有网站,可能不希望在每个地方都使用pjax。那么您可以用data-pjax来注明这是一个pjax链接,然后使用a[data-pjax]来代替全局选择器a。或者,您也可以使用在<div data-pjax>容器中的<a data-pjax href="...">链接作为选择器。

$(document).pjax('[data-pjax] a, a[data-pjax]', '#pjax-container')

参数

$(document).pjax(selector, [container], options)
  1. selector:string类型,用于click 事件委托 的选择器。
  2. container:string类型,用于标识唯一pjax容器的选择器。
  3. options object类型,包含下列选项。

配置选项

选项 默认值 说明
timeout 650 ajax超时时间(毫秒),超时后强制刷新整个页面
push true 使用 pushState 在浏览器中添加历史记录
replace false 替换URL地址但不添加浏览器历史记录
maxCacheLength 20 容器元素缓存内容的最大值(次)
version string或function,返回当前pjax版本
scrollTo 0 浏览器滚动条的垂直滚动位置。设为false时禁止滚动
type "GET" 参考 $.ajax
dataType "html" 参考 $.ajax
container 被替换内容元素的CSS选择器
url link.href string或function,返回ajax请求响应的URL
target link pjax 事件relatedTarget属性的最终值
fragment css选择器,提取ajax响应内容中指定的内容片段

您可以在全局使用$.pjax.defaults对象改变默认配置:

$.pjax.defaults.timeout = 1200

pjax重载

使用pjax机制发起一个当前URL的请求到服务器,并且通过响应的内容替换容器元素中的内容,同时不添加浏览器历史记录。

$.pjax.reload('#pjax-container', options)

手动调用pjax

手动调用主要用于非click事件发起pjax请求的情况。如果可以获得click事件,请使用$.pjax.click(event)来代替。

function applyFilters() {
  var url = urlForFilters()
  $.pjax({url: url, container: '#pjax-container'})
}

事件

事件 取消 参数 说明
pjax链接事件的生命周期
pjax:click ✔︎ options 链接被激活的时候触发;取消的时候阻止pjax
pjax:beforeSend ✔︎ xhr, options 可以设置XHR头
pjax:start xhr, options
pjax:send xhr, options
pjax:clicked options pjax通过链接点击已经开始之后触发
pjax:beforeReplace contents, options 从服务器端加载的HTML内容完成之后,替换当前内容之前
pjax:success data, status, xhr, options 从服务器端加载的HTML内容替换当前内容之后
pjax:timeout ✔︎ xhr, options options.timeout之后触发;除非被取消,否则会强制刷新页面
pjax:error ✔︎ xhr, textStatus, error, options ajax请求出错;除非被取消,否则会强制刷新页面
pjax:complete xhr, textStatus, options 无论结果如何,都在ajax响应完成后触发
pjax:end xhr, options
浏览器前进后退事件的生命周期
pjax:popstate direction事件的属性: "back"/"forward"
pjax:start null, options 内容替换之前
pjax:beforeReplace contents, options 在用缓存中的内容替换HTML之前
pjax:end null, options 替换内容之后

服务端配置

理论上,您在服务器端可通过检查指定的X-PJAXHTTP头来识别pjax请求,并且只渲染指定的HTML内容,这也就意味着在浏览器端我们不用重新渲染整个页面,只替换指定容器元素(在我们的示例中是 #pjax-container)中的内容即可。下面的示例是在Ruby on Rails中的实现方法:

def index
  if request.headers['X-PJAX']
    render :layout => false
  end
end

详情查看 文档

results matching ""

    No results matching ""