标签/Tag为[评论]的文章

增加 GitHub 账号登陆 Movable Type 及全站搜索页面恢复 ,

又是愚人节,只是这个愚人节需要上班, 但愿通知大家上班的信息不要当作愚人节信息而忽略,这样的话估计就欲哭无泪了。呵呵 :D

Blog 自从复活以来,一直修修补补,说说最近的一些变化吧:) 简单如下:

[JS] 静态输出的评论也显示UA ,

就像本站的本地评论一样。 虽然,本地评论我修改了后台程序,一样存储了评论者 Useragent 。但是除非 JS 方式显示。 不然默认是不会显示的。

原因很简单。 本站解析 UA 是用的这个JS库,而非后台的 Perl 程序。 而本站的本地评论现在显示是动静结合的。 简单的说,每篇文章都是一个静态的HTML页面,定期更新评论在这个页面上。同时JS载入评论,进行判断是否写入静态页面并动态更新之。 显然静态页面解析不可能对 Useragent 字符串进行处理。 而路杨并不像完全对静态评论进行JS替换。。 复杂的的办法就是在后台用 Perl 再写一个解析 UA 的程序出来作为静态HTML的 UA 解析输出。但是 UA 的构造太杂乱了。。。。

今天想了想,其实很简单,还是前段解决吧。 一个 JQ each搞定。 代码如下:

code$("span[rel='ua']").each(function(){
if ( $(this).hasClass("done") ) return;
var $el = $(this).closest(".comment");
var _id= $el.attr("data-comment-id");
$(this).replaceWith(tt.show_ua_by_id(_id))
// $(this).html( tt.show_ua_by_id(_id) ).addClass("done").removeAttr("rel");
});

tt.show_ua_by_id() 代码片段如下:

codeshow_ua_by_id: function(idx){
var s = json_data.comments[idx];
if (!s) return '';
if (s.agent) return tt.show_ua(s.agent);
return '';
},

而静态网页在要显示 UA 的位置加入 <span rel="ua"></span> 就一切OK了。

上面的 JS 都是片段, 完整可以查看本站 评论JS:http://static.easunlee.cn/js/new_mt_comments.js

记录下来,给自己备忘。

--EOF--

[随笔]关于 JS 和 ajax 提交评论等等 ,

This is a sitelog of Easun.org.

因为 本地评论 JS 化,又重写了一遍 MTajax 提交过程。梳理了一下流程。

主要是删除了 MT 提交过程的 2次服务器认证,把第一次服务器认证(登录信息预提交验证) mtCommentSessionVerify 有限度地交给 JS + cookie

简单的说,就是设置全局变量 usernull,然后重新在 cookie 中读取 user 来判断登录信息是否正常? 然后其他的认证在 提交表格 时完成就好。 简单 JS 片段如下:

code var refresh_user = function(u) {
if (u) mtSetUser(u);
if (!u) { user = null; mtFireEvent('usersignin'); u = mtGetUser(); }
if ( u && u.is_authenticated ) { /* do nothing*/ }
else { $f.find(':input[name="sid"]').attr("value","") ; ShowCommentsOpenData(); }
};

然后发现 JQ $.ajax 的小问题:

我的 $.ajax 如下:

code$.ajax({
type: 'POST',
cache:false,
url: url,
context: el,
xhrFields: { withCredentials: true },
data: $f.serialize(),
success: successfuc,
beforeSend:beforefun,
error: errorfun,
complete:completefuc
});

本来是吧 refresh_user 写到 beforeSend 中的,但是执行的时候发现 refresh_user 中对 $f 的改变,并没有在 data: $f.serialize() 中 体现出来。 所以只好显式在 $.ajax 前调用此函数了。

笔记下来,为自己提醒。

另外,本来对 JS 全面进行 JQ 改写来着,但是实际对 form 元素操作中发现,同样对

code<form name="comments_form" id="comments-form">
<input type="hidden" name="preview" value="" />
...
</form>

中 的 name="preview"value 操作。 原来的代码是

codevar f = document['comments_form'];
if (f.preview.value == '') f.preview.value = '1';

JQ 呢? 貌似。。。。。

codevar $f = $("#comments-form");
var $preview= $f.find(':input[name="preview"]');
if ($preview.attr("value") == '') $preview.attr("value","1");

f$f 是为了方便操作预先定义好的。 貌似还是不用 JQ 操作的快一点。或者就现在这样混合用吧。。。。

另外,给 ajax 提交完成后刷新新评论搞了一段简单的 JQ 特效: 代码如下:

code var animate_item = function(id) {
var $el =$("#comments-content .comment#comment-"+id);
var _top = $el.offset().top - ( $(window).height() - $el.height() )/2;
$("html,body").animate({scrollTop:_top},1000);
$el.addClass("notice")
.animate({left:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'30px',opacity:'0.2'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'30px',opacity:'0.8'},"slow")
.animate({left:'0px',right:'0px',top:'0px',bottom:'0px',opacity:'1'},"slow");
var total= parseInt( $("#comments").attr("data-total"));
function c() { $el.removeClass("notice").addClass( (total%2) ? "odd":"even" ); }
$el.one('click',c).one('mouseover',c);
};

没有抓 gif ,简单完成效果如下:

jq_submit_png.png

--EOF--

[SiteLog]近日网站折腾小记 ,

8月快过去了。时间真的是。。。。
顺便记下这几天对网站的一些小小的折腾吧。

1. 多说评论显示逻辑调整:

还是要从多说说起: 路杨已经基本上实现了把所有的多说评论同步到了本地。 默认同步到多说评论处于未发布状态,防止和多说JS载入的评论形成重复评论。 定时把本地数据库的多说评论转成发布状态,以防止多说服务器抽风导致评论不显示。

但是问题来了: 怎么让同步并本地发布的同一条评论只显示一次呢? 原来的实现办法是在 多说JS 中识别这条评论是否已经本地发布,如果发布则 hook 多说JStemplates.post 函数,让它不生成这条评论
核心代码如下:

codevar DSinMTids = [];
function check_ds_in_mts() {
DSinMTids = [];
$("#comments-content div.ds-post-self").each(function()
{
if ( ( $(this).attr("data-source") == 'duoshuo' ))
{
DSinMTids.push($(this).attr("data-post-id"));
}
});
}
check_ds_in_mts();
var _D_post=DUOSHUO.templates.post;
DUOSHUO.templates.post=function (e,t){
var rs=_D_post(e,t);
if ( $.inArray(e.post.post_id, DSinMTids) != -1 return '';
/* sth others*/
return rs;
}

[随笔]多说的几项不足 ,

ds.png

昨天晚上,又经历了一次多说服务器的当机。SQLSTATE[08004] [1040] Too many connections 。显然是数据库连接数超过资源限制。
于是乎,多说的稳定性又得到了挑战。

看看长草的官方 和久久不更新的Blog。。不由叹息: 这本来是多好的互联网产品啊。。。

不说这些了。这几天抽空在研究 多说的API,为把多说的评论同步回本地而做准备。 研究过程中谈谈多说的一些不足吧。

  1. API文档严重不足: 这倒是像搞技术的通病。茶壶里的饺子的事情,不说也罢。 不单是多说的API这样,腾讯的API文档也是。
  2. 数据库储存逻辑很奇怪。 从反向同步API返回的数据来看。 多说对于用户评论并没有真正的删除说法,而是永久存储? 所谓的删除仅仅是新加上一条记录。 设置 metadelete 或者 delete-forever。 开始没有搞明白这个逻辑,将 http://api.duoshuo.com/log/list.json?short_name=short_name&secret=secret_key&limit=200 拉下来的数据直接写入数据库,发现了很多已经删除的评论。。。
    多说的数据库真的富裕成这个样子了吗?
  3. 用户。 在多说管理界面添加或者同步的本地用户http://short_name.duoshuo.com/admin/users/)无法删除。。 这个是什么逻辑?
  4. 删除评论: API文档中没有告诉你怎么*删除评论*。 只有怎么发表评论。 其实这个删除功能还是很必要的,我的想法,同步到本地后随即删除已经同步的的远程服务器评论,是一个多么合适的选择。可惜,官方并没有提供。
  5. 对于 ssl(https) 的漠视: 其实多说自身的代码已经很好的支持https ,但是在 https 下会汇报风险的原因,只是因为头像和表情的地址不支持 https 罢了。 但是官方客服在讨论区中明确回复: 头像和表情不需要HTTPS.。 虽然,第3方修改JS可以完全实现全站https, 但是第3方的修改总是第3方的。

嗯,随便写点流水帐。 附上自写的部分处理逻辑

code return if ( @{$action->{'delete-forever'}} ~~ /$ds->{'post_id'}/ );
return if ( @{$action->{'delete'}} ~~ /$ds->{'post_id'}/);
return if ( @{$action->{'spam'}} ~~ /$ds->{'post_id'}/);

--EOF--

多说,社交登录评论平台 ,

This is a SiteLog for Easun.org。

 多说 是一款追求极致体验的社会化评论框,可以用微博、QQ、人人、豆瓣等帐号登录并评论。

恩,就是这样。

写下这个的原因是路杨正式启用 多说 作为本站博客的评论系统, MT 本身的 评论系统也保留。

原因很简单: MT 的留言系统资源问题。

其实在 多说 和 Disqus 之间选择的时候, 第一选择的是 Disqus,但是分析后发现, Disqus载入方式是 iframe ?

对于 iframe 我貌似有点轻度洁癖。 于是选择 多说。

分析了多说的代码, 利用 JS 把多说的评论框排版折腾的和 原来 MT 布局差不错多了。

觉得 多说 的系统的自定义和配置方面还小有瑕疵,等有空写写。

--EOF--

[MT Hack]修改模板来完成MT的AJAX提交评论 ,

曾经,本站在MT3时代,曾经写过以AJAX提交评论预览 的帖子。

那个也是通过修改模板+自写js实现,没有对MT的源代码进行任何修改,绿色无污染,不影响升级。

后来,通过自己摸索,也实现了 ajax 方式提交评论。但是一直都没有写出教程,今天有点时间。特意写出分享之。

具体效果见本站评论提交(预览和发表)。

言归正传,要实现 ajax 方式首先要定义一系列 js 函数。 由于 本站已经迁移到了 JQuery 平台,所以在改写 mt.js 需要先加入 JQ 支持,即加入:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>