解决方法

1.关闭反垃圾保护(觉得没有什么用,而且用户体验不好)
2.修改/var/Widget/Security.php文件,在50行左右,修改为如下代码:

    public function getTokenUrl($path)
    {
        $parts = parse_url($path);
        $params = array();
 
        if (!empty($parts['query'])) {
            parse_str($parts['query'], $params);
        }
 
        $params['_'] = $this->getToken(preg_replace('/\?_pjax=%23body/', '', $this->request->getRequestUrl()));
        $parts['query'] = http_build_query($params);
 
        return Typecho_Common::buildUrl($parts);
    }

做到这一步就可以正常提交评论了

3.但是评论完会发现,网页地址显示xxx/comment
此时无法继续评论,应重新加载文章,才能继续评论
于是要在PJAX加载完之后执行以下代码:

  var now_url_comment = location.href + ' ';
  history.replaceState(null,'',now_url_comment.replace('/comment ',''));

这样就可以在评论提交后,将网页地址改回来
4.恢复 回复评论 功能
在主题的comments.php文件中,添加以下代码:

<script>respondId = '<?php $this->respondId(); ?>';</script>

然后在PJAX结束后执行以下代码:

    window.TypechoComment = {
        dom : function (id) {
            return document.getElementById(id);
        },
    
        create : function (tag, attr) {
            var el = document.createElement(tag);
        
            for (var key in attr) {
                el.setAttribute(key, attr[key]);
            }
        
            return el;
        },

        reply : function (cid, coid) {
            var comment = this.dom(cid), parent = comment.parentNode,
                response = this.dom(respondId()), input = this.dom('comment-parent'),
                form = 'form' == response.tagName ? response : response.getElementsByTagName('form')[0],
                textarea = response.getElementsByTagName('textarea')[0];

            if (null == input) {
                input = this.create('input', {
                    'type' : 'hidden',
                    'name' : 'parent',
                    'id'   : 'comment-parent'
                });

                form.appendChild(input);
            }

            input.setAttribute('value', coid);

            if (null == this.dom('comment-form-place-holder')) {
                var holder = this.create('div', {
                    'id' : 'comment-form-place-holder'
                });

                response.parentNode.insertBefore(holder, response);
            }

            comment.appendChild(response);
            this.dom('cancel-comment-reply-link').style.display = '';

            if (null != textarea && 'text' == textarea.name) {
                textarea.focus();
            }

            return false;
        },

        cancelReply : function () {
            var response = this.dom(respondId()),
            holder = this.dom('comment-form-place-holder'), input = this.dom('comment-parent');

            if (null != input) {
                input.parentNode.removeChild(input);
            }

            if (null == holder) {
                return true;
            }

            this.dom('cancel-comment-reply-link').style.display = 'none';
            holder.parentNode.insertBefore(response, holder);
            return false;
        }
    };

此段代码从/var/Widget/Security.php文件中摘出

我做了这些修改后,就可以恢复正常评论了

参考:海胖博客 Typecho PJAX/AJAX 下评论丢失

标签: none

已有 7 条评论

  1. Jrotty Jrotty 访客 Chrome Linux 回复

    怎么测试这个反垃圾保护有没有效果啊我想试试我的主题

    1. 小さな手は 小さな手は 博主 Chrome Windows 7 回复

      回复 @Jrotty

      设置-评论-开启反垃圾保 打钩√,然后自己发几条评论
      如果认为是垃圾评论的话,提交的评论是不会被保存的

      1. 听书人 听书人 访客 Chrome Windows 10 回复

        回复 @小さな手は

        测试下评论成功会刷新不

    2. 小さな手は 小さな手は 博主 Chrome Windows 7 回复

      回复 @Jrotty

      我把 反垃圾保护 关了
      评论屏蔽插件我也只屏蔽了敏感词而已
      其他的垃圾评论手动删除

      1. Jrotty Jrotty 访客 Chrome Linux 回复

        回复 @小さな手は

        哦,我用默认模板也试过了,发下手打的垃圾不会被判断垃圾,不知道怎么测试好233

        1. 南栀 南栀 访客 Chrome Android 5.1 回复

          回复 @Jrotty

          测试

  2. Jrotty Jrotty 访客 Chrome Linux 回复

    Warning: Undefined array key 220 in /www/wwwroot/moeshin.com/typecho/usr/themes/Littlehands/comments.php on line 199

    纯字母纯数字我都实验过了,测试不出来,你这也是

添加新评论

注意:已开启评论过滤器,无中文无法评论!
泡泡表情