Sina blog的用户评论问题and..Opera的bug?
Wednesday, 21. March 2007, 17:21:45
<a name="comment" style="display:none;"/>
这个代码的目的是利用name属性创建一个anchor,但根据w3c的标准,元素的end tag是必须的,也就是说,这种的写法是不标准的,应该写成
有趣的是Opera对这种不标准的tag的处理。我做了两个sample:
http://files.myopera.com/Returner/blog/disappear.htm
http://files.myopera.com/Returner/blog/1disappear.htm
可以看到,相同的代码直接写在html中,opera是会把它显示出来的。但如果是用innerHTML来动态插入,opera就会把内容隐藏了……似乎A标签中的style="display:none;"在动态插入时对后面的元素起了作用?同样的代码的两种解释行为,不知道是不是Opera的bug。
然而在FireFox中,无论直接写进html中还是用innerHTML来插入,效果都是一致的。但在第一个sample中,A元素后边紧接着的是一个DIV,这个DIV没有显示出来。而第二个sample中则是一个TABLE,这个TABLE却显示出来了。这就是为什么FireFox下能看到sina blog的用户评论。
IE下两个sample的行为更加一致,什么都不会显示。但我没研究在IE中那些用户评论最终是怎么显示出来的。
至于解决的办法,自然还是UserJS。需要做的事情很简单,在innerHTML插入之前将A标签正则替换为
<a name="comment" style=" "></a>
这里我把style去掉了,因为在opera中如果这个tag的style是display:none,Opera是不会用它作为一个anchor的,这就不能用#comment跳转到评论的位置了。
由于opera.defineMagicVariable只能覆盖全局变量,经过考虑最后还是选择对base.js中的output函数动手。output函数就是将ajax获取到的代码用innerHTML插入到指定元素中的“最终输出函数”。
UserJS代码如下:
// ==UserScript==
// @name Show user comments in sina blog
// @author Returner
// @include http://blog.sina.com.cn/u/*
// ==/UserScript==
opera.defineMagicFunction(
'output',
function (real, oThis, _sHtml, _box)
{ _sHtml = _sHtml.replace(/(<a\s[^>]+)display\:none;([^>]+)\/>/ig,"$1 $2></a>");
real.apply( oThis, arguments.slice(2) );}
);
或下载下面文件到Opera的UserJS目录
不过添加评论还是有点问题(尤其是使用代理服务器上网时),问题的根源在于验证码的图片没有及时更新,从而总是提示验证码错误。在不使用代理时刷多几次就好了,但使用代理时似乎总是刷新不了验证码图片,郁闷……
新浪可能修改过程序,原来的脚本会找不到新浪脚本里的output函数,于是real.apply时实际上会无限递归地调用自己,从而造成cpu占用率和内存占用率的飙升。
于是只好修改程序,直接把新浪的output函数写到脚本里。不过这样毕竟不是长久之计,新浪如果到时改了程序,脚本又要跟着改,只能算是暂时解决了问题……
新的脚本在这里:
sinablogcomment_v2.js








