« 抢劫不如去炒股 | 首页 | 警告:不要拿你的Blog测试MT4 Beta版! »

修复评论系统记忆功能

前几天这里的评论系统出了个不大不小的问题评论者的信息无法被住,那个“记住个人信息的”钩选框形同虚设。

说真的,我到现在也没搞明白问题到底出在哪里也没搞清楚为什么这种方法可以修复这个问题,但它确确实实起作用了。这里大体描述一下,如果有知道问题原因的朋友还望不吝赐教。

就像Dimlau说的,问题确实出在cookies上。但为什么会出问题,我现在只能用“灵异”来形容。虽然全站的模板是完全重写的,但评论部分的代码和站点的mt-site.js文件确实是完全按原版copy过来的,最初在单篇文章模板(Individual Entry Archive)中body标签上漏掉的"onload"事件后来也补上了,可cookies还是无法正常记录和读取。

后来在FireFox中查看cookies如下:

cookies_expire_soon

 可以看到,cookies仅在本会话有效,只要这个绘画一过,cookies就会过期失效。所以提交后评论后的一段时间,看起来好像表单信息是被记住了(FireFox如此),但重启浏览器之后cookies信息还是会丢失。

 另外有一点,cookies的作用路径

于是我花了很长的时间检查mt-site.js文件,因为最终的cookies写入、读取都是通过这里面的函数来完成。但还是没发现问题,和其他所有我看到的站点的这个文件一样,表示cookies过期时限的expire变量都通过这句话设定为评论提交后一年

now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000);

 后来在IE中测试,发现情况更加糟糕,评论提交之后cookies根本没有产生,即使在你关闭浏览器之前,表单中也不会记住任何信息。后来再次在firefox中测试,在未关闭浏览器时打开firefox的cookies文件,发现cookies确实根本就没有产生。上面那张图中的cookies似乎是FireFox默认为各种表单自动生成的临时cookies, 一个根本不保存、关掉浏览器就失效的"伪cookies"。

反正后来我也不记得修改过多少次模板和javascript文件了,但没一次修复成功。为什么一样的评论代码,一样的javascript,就我这里不能正常工作?

修复的办法来自这里:http://tweezersedge.com/archives/2004/05/000417.html

他对mt-site.js文件所做的修改,好像仅仅是把cookies的作用路径文章目录(/archives)适用改成了全站(/)适用,文章模板没有任何修改。

fixed_comment_cookies 他的文章是分别存储在各个按时间归档的目录下的(如/archives/2004/5),而我这里的所有文章和各种归档只存放在同一个目录下(/archives)。本来,这样的cookies路径修改对我来说应该是没什么意义的,可却还是莫名奇妙的修复了我这里的问题,完全不关单篇文章模板的事。

从第二张图片可以看到,cookies路径从第一章图中的"/archives"变成了"/",时间也变成了一年后的2008年5月31号。为什么不是6月一号?函数以365天为一年,没记错的话,明年是闰年。

简而言之:

1.单篇文章模板没有任何问题,问题仅仅出在javascript文件中。

2.官方提供的原版javascript以文章目录为cookies作用路径,结果无法写入cookies。

3.作者在javascript中把cookies作用路径改成全站,结果正常工作。

就是这么灵异了,到现在依然不解,学到的唯一一件事就是:模板这东西,自己做的就是不如官方给的来得放心。

FeedBack

引用地址:51

dimlau1:

太长了而且我也没看懂@_@

我觉得应该和模板没关系吧(除了那个onload)
我对js没研究,你看看plod的js分析分析?他的文章路径和你一样是archives/0000xx.html

不过现在已经好了这就好

leavic2:

我还是觉得跟文章路径没什么关系,在换这个模板之前,这里的文章路径也是这样,但那个时候就没有出问题。
plod的js文件我看过的,用的好像就是文章中提到的这种方法,但还是不明白为什么这样可以修复问题,完全没道理。

vick3:

人品问题,绝对是你做人的问题。

我一次都没有发现有问题,害的我每次都得手工删除自己的网址~

vick4:

我的评论系统也是,最近才发现可以选择不用输入验证码的,一直以为是默认的呢。

leavic5:

@vick,
以前好像在你那里的评论中,看到有人说过一句话:人品问题是无解的,人品问题也是一切问题的解。

你不想留网址的话,只要把哪个钩选框取消勾选就行了,这样会自动清除掉过去的cookies。