解决因pjax导致typecho评论失效的问题

其实最早添加pjax的时候就发现了评论会有问题,只是一直不知道怎么去解决,一方面是不会php(没办法,咱是java),第二是没什么时间去研究,最近刚好有空,就看了下Typecho的源码自己动手修改了,目前看来效果还算可以,在这里做个记录以便后续博客升级等时需要。

看了下Typecho的源码,发现Typecho的表单是有个签名验证的,签名的函数绑定在内容表文本域的focus方法上,而文本域绑定focus的事件写在了头部document的load方法上,然而ajax(pjax)不会在触发document的load事件,因此想让其直接运行,而如果js放在页面头部当页面的这个文本域还未加载到的时候绑定事件肯定是有问题的,所以我的想法是去除document的load事件,让其直接给textarea去绑定事件,而且要将这段js放置在页面底部,至少是textarea的下面,具体的修改如下:

先修改var/Widget/Archive.php这个文件

  • header方法的底部footer方法的上面新建一个方法,大致如下:
public function commentjs(){
    $commentScript = '';
    $allows = array(
        'commentReply'  =>  1,
        'antiSpam'      =>  1
    );
    //---这里准备粘贴内容
    echo $commentScript;
}
  • 然后header方法中搜索if ($this->options->commentsThreaded && $this->is('single')) {快速定位,将这个大的header方法从此处向下选择直至 /** 插件支持 */上面全部独立剪切提取出来,粘贴至commentjs方法中,并替换commentjs方法中所有$header$commentScript
  • 搜索document[event.add](event.load, function () {,将这段绑定document的load方法的函数给去掉,让其直接运行。
    这样之前公共头部输出的方法就只剩下输出订阅等内容了。输出评论js的部分就放在了commentjs中。
  • 当然,如果您嫌弃太麻烦或者我写的不够明了,可以点击这里直接下载我改好的文件直接替换。
  • 最后回到主题文件夹,打usr/themes/default/comments.php文件,在最底部else逻辑的上面添加<?php $this->commentjs(); ?>即可。

如还有不明白的童鞋可以继续追问


本文地址:http://darren.ink/archives/47/comment-page-1

相关文章:

标签: 网络技巧, 原创, php, typecho

已有 17 条评论

  1. --

    不错

  2. Qing

    想咨询一个问题,你的主题footer在源码里怎么看不到呢?

    1. dplay的api用的是https://api.imjad.cn/ 这个提供的支持cors跨域的ajax接口,当然如果有能力的可以自己搭建服务端,网上应该是可以查到相关的东西的。

    2. 你指的是哪个地方呢

      1. Qing

        这个:<footer id="footer">,页面源码里没有显示?

        因为开始研究pajx,想知道你的js是怎么加载的,但是没看到footer源码感觉有点奇怪,所以问问,Elements还是能看到的。

        1. 实际上就是自己使用jquery委托了整个页面a标签的点击事件,当判断是本站url的时候阻止默认事件,然后采用ajax请求,ajax请求的时候添加一个特殊的ajax请求头部方便后端识别碰到有特殊头的请求就只输出局部html。

        2. 应该是你浏览器有缓存的原因吧,你源码界面刷新的话应该还是可以看到完整的整个页面的源码的。pjax其实就是传统的ajax+html5的pushstate,当点击页面的链接时,拦截a标签的默认跳转,采用ajax请求,后台获取请求的时候判断如果是ajax请求的页面则只输出局部(只输出中间部分),如果是直接请求的话则输出整个页面(目的是兼容直接敲url进来或者兼容不支持pushstate的浏览器),而pushstate的api主要作用是往浏览器的history添加历史记录却不刷新页面

          1. Qing

            了解了,谢谢。
            话说dplay的api经常挂啊,不稳定。

          2. Qing

            了解了,谢谢。
            话说dplay的api经常挂啊,不稳定。

  3. Qing

    什么header的方法,footer的方法?

  4. 看了下,貌似这个教程是在旧版typecho测试可行,新版试了下不行

    1. 嗯,一直用的稳定版,没用过测试版。

  5. qd

    test

  6. 测试下评论ajax支持不

  7. gc

    testing

添加新评论