常规用的ajax可以实现局部刷新,但是使用浏览器后退功能并不能显示上一次的数据
这里推荐jquery.pjax.js插件是基于:jquery+html5的history.pushState+ajax=jquery.pjax.js
效果如:点击用ajax加载出不同的数据,也可以使用后退键倒退显示出之前的数据

//——————-以下—koa2 完整案例————————-
前端:
<script src="http://www.xgllseo.com/zp/pjax/jquery-1.8.3.min.js"></script>
<script src="http://www.xgllseo.com/zp/pjax/jquery.pjax.js"></script>
<body>
<a class="a_pjax" href="/1">内容1</a> <!--请求的接口数据 {xx:1}-->
<a class="a_pjax" href="/2">内容2</a> <!--请求的接口数据 {xx:2}-->
<div id="pjax-container">
这里是默认显示的内容
</div>
<script>
$(document).pjax('.a_pjax', {
type:'get',
push:true, //默认是true就是使用pjax,如果设置false就使用ajax方式了(一般默认)
replace:false, //默认是false也就是可以使用pjax的后退功能,设置true后退功能就失效(一般默认)
container:'#pjax-container', //内容插入到此容器的内部
// fragment:'#wo', //筛选指定内容插入到容器中,选中把id为wo的容器里面的内容
//timeout:650, //如果超出自定时间,就按默认方式跳转
dataType:"html" //json xml html text jsonp
});
//请求接口成功后 回调
$(document).on('pjax:success',function(data, status, xhr, options){
console.log(data);
$('#pjax-container').text(JSON.parse(status).xx); //{xx:'1'}
console.log(xhr);
console.log(options);
});
</script>
</body>
后端:
router.get('/:id?', async (ctx, next) => {
if(ctx.params.id==1){
// ctx.type='json';
ctx.body={xx:'1'};
}else if(ctx.params.id==2){
// ctx.type='json';
ctx.body={xx:'2'};
}else{
await ctx.render('index', {
title: 'Hello Koa 2!'
})
}
})
//——————–以上–koa2 完整案例————————-
使用条件:
1,jquery 1.8.x版本以上
2,浏览器兼容IE10以上
浏览器兼容性表:
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| replaceState, pushState | 5 | 4.0 (2.0) | 10 | 11.50 | 5.0 |
| history.state | 18 | 4.0 (2.0) | 10 | 11.50 | 6.0 |
具体的pushState可以参考:
张鑫旭:http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/
jquery.pjax.js官网:https://github.com/defunkt/jquery-pjax
$.pjax.disable(); //禁用pjax
$.support.pjax; //检测浏览器是否支持pjax
$.pjax.defaults.timeout = 1200 //通过全局方式修改参数
$(document).pjax('#a_pjax', {
type:'post',
push:true, //默认是true就是使用pjax,如果设置false就使用ajax方式了(一般默认)
replace:false, //默认是false也就是可以使用pjax的后退功能,设置true后退功能就失效(一般默认)
container:'#pjax-container', //内容插入到此容器的内部
fragment:'#wo', //筛选指定内容插入到容器中,选中把id为wo的容器里面的内容
timeout:650, //如果超出自定时间,就按默认方式跳转
dataType:"html"
});
| 事件 | 取消 | 参数 | 说明 |
|---|---|---|---|
| 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 | 替换内容之后 | |
| pjax:callback | null, options | 页面脚本加载完成后(Admui项目) | |
//类似于pjax的回调函数
$(document).on('pjax:beforeSend',function(e){
alert(1); //在进行pjax前先执行
});
$(document).on('pjax:success',function(e){
$('#pjax-container div:eq(1)').remove(); // 成功后的回调
});
演示地址:https://sdeno.com/zp/pjax/1.html 可以在ajax的基础上使用浏览器的前进后退功能了