增加 GitHub 账号登陆 Movable Type 及全站搜索页面恢复 程序人生,站务记录
又是愚人节,只是这个愚人节需要上班, 但愿通知大家上班的信息不要当作愚人节信息而忽略,这样的话估计就欲哭无泪了。呵呵 :D
Blog 自从复活以来,一直修修补补,说说最近的一些变化吧:) 简单如下:
»继续阅读 "增加 GitHub 账号登陆 Movable Type 及全站搜索页面恢复" 。
又是愚人节,只是这个愚人节需要上班, 但愿通知大家上班的信息不要当作愚人节信息而忽略,这样的话估计就欲哭无泪了。呵呵 :D
Blog 自从复活以来,一直修修补补,说说最近的一些变化吧:) 简单如下:
»继续阅读 "增加 GitHub 账号登陆 Movable Type 及全站搜索页面恢复" 。
就像本站的本地评论一样。 虽然,本地评论我修改了后台程序,一样存储了评论者 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--
This is a sitelog of Easun.org.
因为 本地评论 JS 化,又重写了一遍 MT 的 ajax 提交过程。梳理了一下流程。
主要是删除了 MT 提交过程的 2次服务器认证,把第一次服务器认证(登录信息预提交验证) mtCommentSessionVerify
有限度地交给 JS
+ cookie
。
简单的说,就是设置全局变量 user
为 null
,然后重新在 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 ,简单完成效果如下:
--EOF--
8月快过去了。时间真的是。。。。
顺便记下这几天对网站的一些小小的折腾吧。
1. 多说评论显示逻辑调整:
还是要从多说说起: 路杨已经基本上实现了把所有的多说评论同步到了本地。 默认同步到多说评论处于未发布状态,防止和多说JS载入的评论形成重复评论。 定时把本地数据库的多说评论转成发布状态,以防止多说服务器抽风导致评论不显示。
但是问题来了: 怎么让同步并本地发布的同一条评论只显示一次呢? 原来的实现办法是在 多说JS 中识别这条评论是否已经本地发布,如果发布则 hook 多说JS 的 templates.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;
}
»继续阅读 "[SiteLog]近日网站折腾小记" 。
昨天晚上,又经历了一次多说服务器的当机。SQLSTATE[08004] [1040] Too many connections
。显然是数据库连接数超过资源限制。
于是乎,多说的稳定性又得到了挑战。
看看长草的官方 和久久不更新的Blog。。不由叹息: 这本来是多好的互联网产品啊。。。
不说这些了。这几天抽空在研究 多说的API,为把多说的评论同步回本地而做准备。 研究过程中谈谈多说的一些不足吧。
meta
为 delete
或者 delete-forever
。 开始没有搞明白这个逻辑,将 http://api.duoshuo.com/log/list.json?short_name=short_name&secret=secret_key&limit=200
拉下来的数据直接写入数据库,发现了很多已经删除的评论。。。 http://short_name.duoshuo.com/admin/users/
)无法删除。。 这个是什么逻辑?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--
曾经,本站在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>
»继续阅读 "[MT Hack]修改模板来完成MT的AJAX提交评论" 。