修复Artalk在Butterfly主题启用Pjax后不正常工作的问题
之前介绍了在Hexo Butterfly主题中使用Artalk评论系统
结果最近发现有时不会正常工作
问题
主要是由Pjax造成的链接不更新问题,包括:
- 评论后Artalk识别到的页面为根目录或上一页面
- 进入某页面评论出现混淆
- 评论不显示
分析与解决
Artalk后台信息
首先查看Artalk后台,进入 页面
选项,发现多出了个网站主页,而标题却是文章的页面标题,但此时我也不知道究竟是哪里出了问题。
意外收获
之后在浏览Butterfly 安装文档(四) 主题配置-2时发现其中这样说:
启用Pjax后不用重复加载相同的资源(css/js), 从而提升网页的加载速度。
对于一些第三方插件,有些并不支持 pjax 。
使用pjax后,一些自己DIY的js可能会无效,跳转页面时需要重新调用,请参考Pjax文档
使用pjax后,一些个别页面加载的js/css,将会改为所有页面都加载
由此我基本知道了一切都是Pjax捣的鬼,关闭Pjax后就正常运行了
但Pjax带来的速度提升与流畅度确实是不可忽略的,特别是没有开启时进入任意页面屏幕都会黑一下(恼
缺一不可?共存!
查阅Pjax文档
后有了一些启发
[8月24日]警告:此处的内容为错误的,请勿使用。暂且留下错误当作记录
观察主题代码,所有有js-pjax
类的块都会被Pjax重新加载,而主题的warp-comments
位置刚好没有,于是加上后我重新生成页面。
再测试,从主页进入任何文章已经可以正常显示了,但 问题仍然存在:
- 从某个 页面/文章 进入其他 页面/文章 会识别为上一页面的网址
遇事不懂看文档
Pjax的原理是通过ajax请求来更新页面指定部分,然后再更新浏览器上显示的网址。
仔细思考时序,我猜测:
用户点击页面-->Pjax更新Artalk及相关部分-->Pjax更新网址
由此我们需要使Artalk在网址更新后运行
修复
打开
主题目录/layout/includes/third-party/comments/
目录打开
Artalk.pug
,将27行的if (typeof window.artalkItem === 'object')
后的initArtalk()
改为setTimeout(initArtalk, 50)
重新生成页面
来到博客根目录,执行
1 | hexo clear |
自此,Artalk对Butterfly Pjax的不兼容问题就已经完全修复,可以正常使用!