GreaseMonkey装在FF上有段时间了,一直处于禁用状态
前几天和香草山讨论浏览器插件,提到了这只猴子,抽空测试了一下
对GM有了个大体的印象:
这个东东本质上就是块JS
它通过浏览器这个层面,在解析完页面之后,往页面里丢进去一块js让其运行
这块js运行的时候,可以对页面中的DOM进行增删改查的操作,由此实现用户想要的一些效果。
可能是出于安全性的考虑,GM的js似乎有自己单独的空间(sand-box?)
不能直接修改原页面的JS变量和函数,除非使用unsafeWindow来改变原页面的变量和函数
因为这个原因,我无法修复原网页加载过程中出现的错误以及导致的一些未定义变量。
而且那些加载过程中的动作我也无法控制。
关于unsafeWindow,参考:
http://suddymail.org/show-165-1.html
http://lifegoo.pluskid.org/?p=113
这个难题目前我还没找到解决的方法,不过Opera给了我一点希望。。。
opera的USERJS
operachina是这样描述USERJS的执行原理的:
浏览器在加载页面时,网页、脚本、样式,及图片等相继被加载。但是,当页面中的首个脚本被执行前,用户脚本就已经被执行了。由于它是最早执行被执行的脚本,所以它获得的控制权就比较早,它可以:
* 决定所浏览页面中,哪些外部 JavaScript 文件可以被加载;
* 改写所加载网页中的任何脚本(<script>)块代码;
* 拦截页面上正在被检测的事件,以此改变事件的处理方式;
* 替换网页脚本中定义的变量和函数;
除此之外,用户脚本做为所浏览网页的一部分,当然也能完成网页自身脚本所能完成的功能。包括,检测事件、创建变量、创建函数,并且读取所应用到页面的 Cookie 等。用户脚本能拥有如此高的控制权,完全依赖于它是从 Opera 内核进行支持的,并且通过这种特性所获得的能力,同样被扩展到了 Opera Mini 及 Opera Mobile 平台上。
根据它这里的描述,用户脚本是在页面加载前被执行的,所以能够在加载前做些事情
但是进而一想,这也不对啊,用户脚本先执行,事儿倒是干了,但是刚才初始化的变量、函数,待会儿不还是给页面里的同名变量、函数给覆盖掉了。
Opera的设计者当然想到了这点,所以提供了很多相关的接口,比如下面这两个:
window.opera.defineMagicVariable(targetVariableName, fun1,fun2)
window.opera.defineMagicFunction(targetFunctionName,fun1)
这两个“魔术接口”的详情我不转贴过来了,我还没研究清楚的东西就先不贴。
有兴趣的可以点击这里前往观看。
我想,我的难题也许可以通过这几个接口,在Opera上得到解决?
抽空继续研究中。。。