http://my.opera.com/chinese/forums/topic.dml?id=98685
作者:niltsh
版权归作者所有,本文系转载,如果作者认为此帖侵犯了作者版权,请email版主,将此帖删除
原文:
脚本原文:
代码: 全选
var keyadex = new Array(/[^oe]ad[^d]/i, /cn\.yimg\.com/i, /icast/i);
var keyadin = new Array(/[^\/]\/ad[^dj]/i, /[a-df-np-z]ad[^a-z=\/-]/i, /[^a-z\/,\s]ad[^dj]/i);
var blist = new Array();
var wlist = new Array(/mail\.yahoo/i);
var dbg = 0;
function IsAD(str, flag)
{
var keyad;
if ( flag )
keyad = keyadex ;
else
keyad = keyadin ;
for (var i = 0; i < keyad.length; i++) {
if (keyad.test(str) == true)
return 1;
}
return 0;
}
function filterex(e)
{
for (var i = 0; i < blist.length; i++) {
if (blist.test(location.host) == true) {
e.preventDefault();
return;
}
}
var addr=e.element.getAttribute("src");
if (IsAD(addr, 1)){
e.preventDefault();
if (dbg) {
alert("banex"+addr);
return;
}
}
if (dbg)
alert("threx"+addr);
}
function filterin(e)
{
for (var i = 0; i < wlist.length; i++) {
if (wlist.test(location.host) == true)
return;
}
var tsc = e.element.text;
if ( IsAD(tsc, 0) ) {
e.preventDefault();
if (dbg) {
alert("banin"+tsc);
return;
}
}
if (dbg)
alert("thrin "+tsc);
}
window.opera.addEventListener( 'BeforeExternalScript', filterex, false);
window.opera.addEventListener( 'BeforeScript', filterin, false);
有两种event驱动,一种是脚本的源代码,另外一种是外部脚本的url,都会引发event
也就是说,对于本身网页内脚本,只需要通过filterin的过滤;但是对于有src属性的外部脚本,会首先考察src(filterex函数过滤),如果url的地址通过的话,opera就会得到这个脚本的源代码,这个时候就还要再进行源代码的过滤。
过滤就是靠关键字,都是用正则表达,分别保存在keyadex和keyadin中。
另外,加入黑名单和白名单。
对于黑名单,只用来控制外部脚本,对于来自黑名单的外部脚本,一律无视,全部打倒。
对于白名单,只用来控制内部脚本,对于来自白名单的外部脚本,一律无视,全部通过。这个用来对付那种把广告脚本和网页内容脚本写一块的网站,比如mail.yahoo.com
变量 var dbg是用来控制是否产生输出,=1的话,哪个脚本是否通过,是否拦截都能看到了。
3.配置指导
ctrl+f12→高级→内容→java脚本选项→用户脚本指定脚本所在目录就可以了
4.使用结果及感想
效果还是明显的,能拦截到很多广告脚本,
但是 过滤js的脚本 毕竟只是一个结构上的filter,对于细节的精雕细琢还是不行,
不过如果是按照opera所说的,那么过滤外部脚本应该还是对浏览速度有所帮助的,因为filter是发生在脚本下载之前。
希望达人体意见,因为鄙人学javascript还不到一周,很多东西都不知道。
现在顺便先问一个,DOM2里面load事件是发生在load已经完成将要生效的时候,有没有哪个event是发生在load之前的?