Skip navigation.

Fat R笔记……与减肥无关

Fat awful terrible Rubbish-bin

Posts tagged with "opera"

一个可能有用的userjs...

,

嗯,虽然Opera不支持ActiveX控件,导致一些下载网站的“***专用下载地址”不能点,但通过UserJs还是可以把那个地址对应的URL挖出来……

这是我写的一个简单的UserJS,就是用来干这种事的。目前它只支持FlashGet和迅雷两种下载器的专用下载连接,但通过源代码很容易就可以添加对"超级旋风"之类的其它下载器的专用链接的支持。

它的工作方式很简单,"模拟"了一个ActiveXObject类以及一些相关的方法来欺骗浏览器,比如FlashGet就模拟了IsVersion2()和AddUrl()两个方法,并在AddUrl()方法中打开一个新的窗口,把url显示出来

我并没有限制这个UserJS的作用区域,因此直接野蛮地模拟ActiveXObject也许会带来一些副作用……

而对付迅雷采用的方法则是直接重写OnDownloadClick_Simple()方法。迅雷的下载url是这么写的
 <a href="#" thunderHref="thunder://****" thunderPid="00009"  onClick="return OnDownloadClick_Simple(this)" oncontextmenu="ThunderNetwork_SetHref(this)" class="a_tlan14b" >使用迅雷下载</a>

所以直接重写OnDownloadClick_Simple()方法并把连接中的thunderHref属性显示出来就可以了
然而这样的方法也有副作用,就是所有叫OnDownloadClick_Simple()的方法都会被干掉,不知道会不会有误伤……

以后有空再看看能不能加一些判断把代码弄得严谨一些吧……

下载地址
flashgetshowurl.js

Sina blog的用户评论问题and..Opera的bug?

, , ,

研究了一下,sina blog是用ajax来获取用户评论的,在ajax部分作了针对不同浏览器的处理,然而在将获取到的html代码输出到页面时有一句:
<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目录
sinablogcomment.js

不过添加评论还是有点问题(尤其是使用代理服务器上网时),问题的根源在于验证码的图片没有及时更新,从而总是提示验证码错误。在不使用代理时刷多几次就好了,但使用代理时似乎总是刷新不了验证码图片,郁闷……



新浪可能修改过程序,原来的脚本会找不到新浪脚本里的output函数,于是real.apply时实际上会无限递归地调用自己,从而造成cpu占用率和内存占用率的飙升。
于是只好修改程序,直接把新浪的output函数写到脚本里。不过这样毕竟不是长久之计,新浪如果到时改了程序,脚本又要跟着改,只能算是暂时解决了问题……
新的脚本在这里:
sinablogcomment_v2.js

一个简单的UserJS

, ,

用于“过滤”http://divx.thu.cn/latest.php 输出。其实只是用不同颜色标示不同类型的rlz,目前区分的是internal、screener、tc/ts/cam等类别。代码如下:
// ==UserScript==
// @name             divx.thu.cn filter
// @version          1.00
// @author           Returner
// @namespace        http://my.opera.com/Returner
// @include          http://divx.thu.cn/latest.php*
// ==/UserScript==

/*Changelog:
 *  1.00: First version.
 */

function divxcolor() {
  var titleColors = {    //这些颜色是随便写的,巨丑
    internal: '#A08585',
    historic: '#A0A585',
    screener: '#B0A585',
    ts: '#707070',
    dummy: '#000000'
  };

  var blockColors = {    //三种类型:none表示不显示标题下面的block,ori表示不改变颜色,#xxxxxx表示用指定颜色显示
    //internal: '#ffeeee',
    internal: 'none',
    historic: 'none',
    //screener: 'ori',
    screener: 'none',
    ts: 'none',
    dummy: '#000000'
  };
  var dTables = document.getElementsByTagName("table");
  for (var i = 0, thisTab; thisTab = dTables[i]; i++){
    if (thisTab.getAttribute('id') == 'table14'){
      var URLText = thisTab.rows[0].cells[0].getElementsByTagName("a")[0].innerText;
      var tabType = 'normal';
      if(URLText)
        if (URLText.match(/\.iNT(ERNAL)?[\.\-]/)){
          tabType = 'internal';
        } else if (URLText.match(/\.19[0-8][\d][\.\-]/)){  //电影时间年份较早的rlz
          tabType = 'historic';
        } else if (URLText.match(/\.(DVDSCR)|(screener)[\.\-]/i)){
          tabType = 'screener';
        } else if (URLText.match(/\.((TS)|(TC)|(CAM)|(TELESYNC))+[\.\-]/i) ){
          tabType = 'ts';
        }

      if (tabType == 'normal'){
        thisTab.rows[0].cells[0].setAttribute('background','/images/001.jpg');
      } else{
        thisTab.rows[0].cells[0].setAttribute('background','');
        thisTab.rows[0].cells[0].setAttribute('bgColor',titleColors[tabType]);
        thisTab = dTables[++i];
        if(blockColors[tabType] == 'none'){
          thisTab.innerHTML = '';
        } else if(blockColors[tabType] == 'ori'){

        } else{
          thisTab.rows[0].cells[0].setAttribute('bgColor',blockColors[tabType]);
        }
        /*thisTab = dTables[++i];
        thisTab.setAttribute('bgColor',tagColors.intBlock1);
        thisTab.rows[1].cells[0].setAttribute('bgColor',tagColors.intBlock1);*/
      }
    }
  }
}
window.opera.addEventListener('AfterEvent.DOMContentLoaded',
  function (ev) {
    divxcolor();
  },
false);


Notes:
  * 在判断ts时,如果正则表达式用/.(TC)|(TS)|(CAM)|(TELESYNC)[.\-]/i,会把标题含有.tsxxxx.之类文本的也判断为真,改成/.((TS)|(TC)|(CAM)|(TELESYNC))+[.\-]/i就OK了。所以前面判断screener的严格来说不太完善

  * Opera下不支持thisTab.rows[0].cells[0].background,所以用DOM的方法thisTab.rows[0].cells[0].setAttribute('background','/images/001.jpg')

  * 获得单元格中的<A>标签可以用thisTab.rows[0].cells[0].all.tags["a"],Opera也支持,但这里还是用了W3C DOM的标准thisTab.rows[0].cells[0].getElementsByTagName("a")

  * 访问一个Object的属性,可以用object.property,也可以用object["property"]。这个程序访问titleColors和blockColors时用的是后者

  * 有空一定要多学学DOM的东西,目前为止我还是这方面的白痴……

俺的Opera...

,

我以前在googlepages上贴来玩的,虽然就两张图,还是转过来吧
当然,设置后来有进行过一些修改,这里看到的都是旧的……

主窗口长这样……用的是cocoa的skin,自己改了一下图标、tab和滚动条



字体用了微软雅黑……虽然基线和大小有问题,不过看起来还是挺pp的~ 尤其是白色底
(不知道在crt下看起来如何,大概会比较丑吧)



另外还有一篇,关于我的桌面主题的:
http://slowargo.googlepages.com/myxptheme

继续完善 - My Opera Blog Enhancement

, ,

目前已有的功能:

  • 自动保存
  • 开启完整的7种字体尺寸
  • 自定义字体列表
  • 增加自定义表情
  • 编辑时可以用Tab键输入4个空格


截图:


AutoSave的使用方法:
  1. 需要对myoperaplus.js进行配置才能使用autosave功能。方法如下:
  2. 将myoperaplus.js放到你的User Javascript目录
  3. 登录MyOpera,去到自己blog主页
  4. 点击Add new post新增一篇文章,内容任意,然后保存
  5. 然后Opera会跳转到新增加的这篇文章。记下URL末尾的数字。如:http://my.opera.com/Returner/blog/show.dml/376890,数字就是376890
  6. 打开myoperaplus.js,找到
    var accountsConfig = '<account1%370000><account2%371000>';

    这一行,将account1替换成你的用户名,370000替换成上面那个数字(376890)。如果你只有一个账号,第二个<>可以删掉,即改成
    var accountsConfig = '<account1%376890>';

    这样的格式。修改完后保存退出。
  7. 重新启动Opera,试试新增或编辑一个Post,如果编辑框右下方出现了Preparing或者Ready,则表示AutoSave功能已经可以正常工作了
  8. 在编辑过程中,默认会每2分钟自动保存一次,可以修改myoperaplus.js里的autosaveInterval值来设置保存间隔
  9. 可以点击编辑界面左下方的Save标签,或者在编辑框中按Ctrl+Shift+S来手动保存


下载最新版:
myoperaplus.js

Opera9的一个Bug……挺有意思的

浏览这个网页的时候会崩溃
后来分析了一下,简化了一下会导致崩溃的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML >
<HEAD >

<title>Opera Crash!</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<style type="text/css">
.crash {
width:559px;
height:100%;
vertical-align:top;
display:table-cell;
}
</style>

</head>

<BODY>

<table border="1" width="100%"><tr><td>

<DIV class=crash>
<CRASH/>
<DIV>
<IMG src="http://www.opera.com/img/operalogo.gif"/></DIV></DIV>

</td></tr></table>

</body>
</html>


同时把这个测试页面上传到了这里
Ocrash.html

有意思的是,进行一下改动后,Opera就不会崩溃了:
  • 删除CSS里面的display:table-cell (第13行)
  • 删除<CRASH/> (第24行)
  • 删除IMG标签 (第26行)
  • 在两个< /DIV >标签里的任意一个前面加上任意字符(第26行)