给Typecho添加pjax的方法,可用来代替InstantClick
最近发现instantclick有一些bug 以前也尝试过让instantclick改变刷新对象,改刷新body为其他 这几天就看到了友人C的一篇文章 按照他的方案 成功的把instantclick换成了pjax 下面分享一下我的方法
pjax = pushState + ajax
相关链接
准备工作
首先...那就是干掉InstantClick 把footer里相关的引用啊什么的都给删掉,和重载函数部分(建议备份一下这里) 然后删除所有data-no-instant
和data-instant
的标记 如果删的够干净的话 instantclick就从你站点里彻底卸载了
然后 准备接入pjax
首先,你需要指定一个需要被重载(刷新)的区域 一般是文章展示的地方 然后引入jq和相关js 下面是我这里的例子(仅展示body内内容)
<body>
<div class="sidebar">
<!-- 侧栏里的内容 不需要被刷新 -->
</div>
<div class="main" id="pjax-container">
<!-- 主容器 需要被刷新 -->
</div>
<!-- jQuery引用 -->
<script src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<!-- pjax引入 -->
<script src="https://cdn.bootcss.com/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
<script>
$(document).pjax('a[href^="<?php Helper::options()->siteUrl()?>"]:not(a[target="_blank"], a[no-pjax])', {
container: '#pjax-container',
fragment: '#pjax-container',
timeout: 8000
})
</script>
</div>
</body>
注:此方案中的pjax依赖jquery
并且jq版本还不能太高
(之前我引用的高版本jq结果console爆红还不好使 然后去友人C那里一看原来他引用的是低版本2.1.4版本的jq 于是也跟着引用了2333) 必须先引用jq 后引用jquery-pjax 链接可以换成自己的 不用cdn公共库也可以
下面复制一下友人C的原文 解释一下上面代码框里12-18行的内容
解释一下上面代码:
<?php Helper::options()->siteUrl()?>
是typecho的自带函数,调用本站的首页地址!也就是只对本站的,并且没有_blank
属性的,标签里不含no-pjax
的链接实行pjax!局部刷新的区域是#pjax-container
的部分!其中
#pjax-container
是你的局部刷新部分,你可能没有这个div,你自己在添加一个<div id="pjax-container"></div>
包裹住你想局部刷新的部分就行了!
弄完了上面这些之后 站点的pjax的基本功能已经弄上了 但还是有点东西需要被自定义
加载动画
参考了下友人C的文章 我也用的是他原文的方案 用的是nprogress来实现进度条的实现 如果你想让这个进度条在特定位置展现 就把对应div的位置加上id="process-container"
的标记就可以了 然后对上面代码框上的17行的位置进行拼接 拼接后如下
<script>
$(document).pjax('a[href^="<?php Helper::options()->siteUrl()?>"]:not(a[target="_blank"], a[no-pjax])', {
container: '#pjax-container',
fragment: '#pjax-container',
timeout: 8000
}).on('pjax:complete',
function() {
NProgress.done();
//此处可添加其他的pjax完成之后执行的事件
}).on('pjax:send',
function() {
NProgress.configure({ parent: '#process-container' });
NProgress.inc();
$('body').animate({scrollTop:'0'},500);
//此处可添加其他的pjax开始加载时执行的事件
});
</script>
注:14行的目的是加载的时候自动回顶 如果不加这个的话在手机阅读的话滚动条会留在上一个页面的滚动条位置 造成文章从一半的位置开始阅读
也可以按照这篇文章进行照葫芦画瓢一下 虽然是InstantClick的方案 稍微改一下就可以 具体方法就是在原文的基础上 回调函数的写法有一点点差别 把上面代码框的第8行内容换成$("#loading").hide();
,把第12和13行换成$("#loading").show();
就可以 其实两者的道理都是一样的 就是刷新过程中需要干什么 刷新完了的时候需要做些什么
重载代码
重载代码的插入位置大家应该从上面看出来了 就是对应第9行注释的那个位置上
jquery-pjax和instantclick他们俩的本质都是应用了pjax刷新技术 所以他们两个的重载代码是可以通用的
下面列一下需要用到的重载代码
//Highlight.js重载和添加行号
$("pre code").each(function(i, block) {hljs.highlightBlock(block);});
$("pre code").each(function(){
$(this).html("<ul><li>" + $(this).html().replace(/\n/g,"\n</li><li>") +"\n</li></ul>");
});
//ajax评论
ajaxc();
//百度统计
if (typeof _hmt !== 'undefined'){
_hmt.push(['_trackPageview', location.pathname + location.search]);
}
注:ajax评论可参照此文章(注意处理好TypechoComment的那段js的问题 要把这段js放在主题的comments.php里)
其他重载代码请参照泽泽的文章(和Instantclick的按理都是通用的)
音乐不断
把音乐播放器插入到非pjax刷新区域就可以了
用你这上面的方法,能实现ajax评论和评论翻页吗?
表单提交的话还得用老方案 翻页的话...没搞懂你什么意思 这个站里黑名单之外的a标签都能触发pjax 新标签页和外站也不会触发
成功,感谢!
音乐不中断这个应该怎么实现啊,都是插件,需要改插件代码么?
把音乐播放器相关的js放到pjax容器外面就好
试了一下,有些恼火,不过确实有用,我还是不搞了,太麻烦了。谢谢分享
挖坟,我现在有的主题用pjax有的还用InstantClick,InstantClick的速度太诱人了
就是得费点心处理回调的东西,其实排除这个,instantClick这玩意真挺不错的