Typecho PJAX 评论失败
解决方法
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
文件中摘出
我做了这些修改后,就可以恢复正常评论了
怎么测试这个反垃圾保护有没有效果啊我想试试我的主题
回复 @Jrotty:
设置-评论-开启反垃圾保 打钩√,然后自己发几条评论
如果认为是垃圾评论的话,提交的评论是不会被保存的
回复 @小さな手は:
测试下评论成功会刷新不
回复 @Jrotty:
我把 反垃圾保护 关了
评论屏蔽插件我也只屏蔽了敏感词而已
其他的垃圾评论手动删除
回复 @小さな手は:
哦,我用默认模板也试过了,发下手打的垃圾不会被判断垃圾,不知道怎么测试好233
回复 @Jrotty:
测试
Warning: Undefined array key 220 in /www/wwwroot/moeshin.com/typecho/usr/themes/Littlehands/comments.php on line 199
纯字母纯数字我都实验过了,测试不出来,你这也是