Sina blog的用户评论问题and..Opera的bug?
Wednesday, March 21, 2007 5:21:45 PM
<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








Csineneo # Wednesday, March 21, 2007 6:02:47 PM
yumumao # Wednesday, March 21, 2007 6:15:11 PM
易名gcy001 # Tuesday, March 27, 2007 4:54:32 AM
Returner # Wednesday, March 28, 2007 4:54:48 PM
opera:config#UserPrefs|UserJavaScript
确保"User JavaScript"项选中了
"User JavaScript File"把.js文件放在这项中指定的位置
重新启动Opera,应该就可以了
okwebhelp # Monday, April 9, 2007 4:37:25 AM
Returner # Tuesday, April 10, 2007 8:02:12 AM
okwebhelp # Tuesday, April 10, 2007 12:29:24 PM