世界之窗3升级后主站论坛恢复后,更新了一下规则!
2013.5.31更新:优化遍历DOM逻辑,整个脚本代码不足50行!
终于做了个在线更新,不用在网盘上做更新了!!
在世界之窗3中进我的帖子点击那个绿色图标: 世界之窗论坛(汗!不支持站外直接在线添加规则)
这里发发世界之窗3牢骚三点:
当网页内容(最典型是脚本文件)被网址黑名单(<urlrule>)屏蔽后,广告过滤插件并未对主程序返回调用,主程序也就一直等待调用返回,而导致界面显示一直在访问;
第二点诟病之处,就是网址黑名单功能并不稳定,有时对一些地址的过滤并不起作用。
最后一点还是广告过滤的,其易用性还有待提高,应提供一个和火狐ABP类似的直观过滤项查看界面;过滤规则的维护性不高,特别是网址黑名单~内容一多就混乱不好维护。
更新记录:
2012-11-25 最近学JQuery,真强大!!用上了~去华军软件园的下载验证!这里做个Mark: 调用JQuery的方法得加上小括号,不然返回的可是方法对象!
这次更新,属于重大更新!!!!!已经解决和迅雷冲突的BUG!!
增加几个网站的处理,如2ccc.com的45秒等待真令人恼火!!取消它,不过还是有提示!
2012-06-26 解决诸多在线邮和JS广告过滤 规则的冲突
2012-06-19 重大更新,优化newkillAd.js:修正浮动判断依据;修正网址判断逻辑。查杀和执行效率都提高很多,也少了很多误杀!请即更新!!【只贴到代码框了】。
更新网易及其视频站点的过滤规则,完美过滤其二个域名v.163.com,163.letv.com的广告,不会出现之前有的播放不了,有些广告又过滤不掉的情形!
加入网址黑名单,个人建议:网址黑名单 只保留我的 gsf url、xwhyc url、絮的通用url 规则三项(E版的更新不太及时)。象我的Xml规则文件就38KB大小
启用CSS定义网站样式和过滤网页显示元素,58小说网、闪舞小说网 、556677文字小说网三个站点都采用注入CSS进行定义及过滤,原有的元素过滤并未删除只是禁用。相关CSS注入技术、更多细节请访问世界之窗论坛
11-10 添加了几个广告联盟的处理,和讯网广告!
11-25 整理过滤规则,删除一些重复作用的规则;添加了浮动广告处理killAd.js,可选!
11-29 浮动广告处理killAd.js修正完成,做了基本测试;增加了对QQ网站的广告处理。此次更新,规则默认开启JS。
11-30 花了一晚测试浮动广告处理killAd.js,解决:空框架问题、误删正常内容框架。及修改若干Bug。测试:FireFox 8,IE 8,网站:和讯期货实时行情、万卷书库、中关村在线、广西政府网、QQ、www.qzwap.com等。你可直接用本规则到中关村在线测试,可正常删除其没被过滤的浮动广告!
今天二次更新,修正滚动事件的取消Bug,在太平洋电脑网测试通过!!
12- 2 增加对网易评论的免过滤处理,新增太平洋电脑网的规则;修正脚本的一个Bug!
12-11 killAd.js脚本用onreadystatechange代替onload事件
2012元旦 增加对HTML5的支持,即增加对Video标签的处理。 killAd.js更新,精简代码到只有50行,只处理浮动广告,并进行类封装【killAd.js更稳定些】。
重写了JS,文件名newkillAd.js。该JS能比较智能的识别广告并删除,效率也高些。对广告容忍性差点,机器配置低的朋友推荐使用!newkillAd.js对产生广告的JS标签进行监控处理,但该JS受出错网页的影响也大,有时网页出错时不能正确处理广告。
2012.01.05 newkillAd.js用正则表达式判断广告媒体;增加对出错网页的广告过滤处理;整个JS用类封装。已经完成测试:和讯期货实时行情【原来误删行情数据已解决】、万卷书库、中关村在线、广西政府网、QQ、www.qzwap.com等。网页出错的情形下JS照常过滤广告。推荐使用newkillAd.js进行过滤!!!!!!!
2012.01.18 春节前更新一次 删除并更新一些过时、不合相应网站变化的规则,将絮的通用元素规则删除了,太复杂、耗时、太多误删了;修正JS文件中的一处小错误。
刚刚发现优快云的代码框支持复制了,内牛满面中.......这么简单的功能现在才搞出来
(对弹窗广告JS还是没办法啊!!TW3对弹窗也是挺乏力的,个人建议用防火墙如Nod32的HTTP防火墙,将ABP中带Third-Part的网址列表【即广告联盟网址】全加入到防火墙的黑名单中!嘿嘿,这样做的话,配合newkillAd.js基本上可杜绝广告,也无须再怎么更新规则了)
另外一点 要说的是:浮动广告处理killAd.js可直接用于世界之窗2,有个叫Killad脚本插件,直接替换其中的内容即可,可把事件处理删除,只执行onBodyLoad(),最后设置插件自动运行。2版中的元素管理器捕获网页富媒体文件还是很好用的!!我经常用!!
关于脚本还有一点要说,如果感觉脚本的执行对网页的装入速度没影响【说明:脚本是本地执行,对网速肯定是没影响】,那基本上无须再更新过滤规则了,甚至可把过滤规则逐步试着删除!请用IE6、7、9的朋友帮忙测试一下脚本,有问题请到评论反馈!!谢谢
(BS一下微软,在IE下JS不好调试不说,在FF下执行一点问题都没,在IE下就一次一个结果,如:removeChild这条DOM,感觉IE有一套克隆DOM!让我想刚做IT时用VB也是这情形,让人发狂!!以后可能长期不更新规则了,改用FF和Chrome)
关于浮动广告处理killAd.js脚本有点遗憾的是:IE的setCapture( )只能捕获鼠标事件,不像W3c标准的captureEvents( )可捕获onload事件,不然脚本可精减到十几二十行!关于这个思路哪位脚本高手有好的建议可以提一提!
滚动事件肯定是不能指望,对速度的影响太大;再则有些网页一页不用滚动的!
这几天没事翻翻正则表达式,本着活学活用的精神,顺便学了世界之窗3的广告过滤规则,加之没事喜欢看看小说,写了几条规则。
世界之窗3被收购,它的网站已经不可在线更新过滤规则的,这么好一款软件被360了,可惜了!!
现把过滤规则放上来,有需要的朋友可以用用!集成了xwhyc、絮和E(TW3官方)规则,并稍作修增,自己增加了一条通用元素过滤规则专门处理广告脚本,可处理绝大多数脚本广告。
很佩服凤凰工作室,一二个人就写出了这么好一款软件!!
(记个事,58小说网打开后总处于访问状态,一开始总不明所以,明明打开了网页~标签还转个不停,每次打开一个页面后都还得按一下ESC键,怪别扭的!!可将规则文件中的58小说网的规则暂时删除体验一下后来将其脚本广告禁了,终于世界清静了!)
不学过滤不知道,一学吓一跳啊,仔细一看网页源码,很多网站都是一大堆连接其它站点的广告:图片,Flash等,消耗系统资源不说,打开速度也慢,占用本就不多的带宽!!实在可恶啊!!!!
<enable><![CDATA[0]]></enable> 禁用其下过滤规则
<enable><![CDATA[1]]></enable> 启用其下过滤规则
TW3的广告过滤有一个优点:加载HTML前滤过处理,无须下载广告图片Flash等。但少个ADBlock Plus的Third-Part来禁用非本页面地址的广告。
ABP的Third-Part/first-Part,CSS选择器强大啊,这里Mark一下:
# 是CSS的ID选择符
> 是子元素选择符
. 类选择符
+ 紧接的兄弟选择符
~ 指定元素后面的同级选择符
{} 属性选择符
举例一个:
TW3中 (?<=<span id=ms_1>.+?;)<a href.+?</font></a>正则表达式用于过滤紧挨着span的 ID为ms_1的A标签,复杂吧【其实可在TW3中注入CSS实现CSS方式的过滤,详见本页前面的论坛帖子链接】
在ABP中用58xs.com##span#ms_1 + a就搞定了,哎
而且ABP中的规则更易于维护!!
有兴趣交流的正则表达式和规则过滤的朋友可留个脚印!
newkillAd.js查杀广告比较严格,如果觉得配置不错,宽带足就用killAd.js吧,浮动广告比较讨厌!!
/********************************************************************************
2012-01-05版权所有,转载请注明出处:http://blog.youkuaiyun.com/king_xing,欢迎反馈问题!
文件名:killAd.js
功能说明将该JS文件加入网页中可查杀大多数浮动广告!!
********************************************************************************/
var KillAd = function () {
var cnstMedia;
function enumNodeTree(el) {
for (var i = 0; i < 5; i++) {
if (el.getElementsByTagName(cnstMedia[i]).length > 0)
return true;
}
return false;
}
function getStyle(elem, styleName) {
if (elem.style[styleName])
return elem.style[styleName];
else if (elem.currentStyle)
return elem.currentStyle[styleName];
}
function scan() {
var i,
x,
c,
elStyle;
c = document.getElementsByTagName("div");
cnstMedia = ["IFRAME", "IMG", "OBJECT", "EMBED", "VIDEO"];
for (i = c.length - 1; i >= 0; i--) {
x = c[i];
if (!x)
continue;
elStyle = getStyle(x, "position");
if ((elStyle === "fixed" || elStyle === "absolute") && enumNodeTree(x)) {
elStyle = getStyle(x.parentElement, "position");
if (elStyle === "fixed" || elStyle === "absolute")
x = x.parentElement;
x.parentNode.removeChild(x);
}
}
cnstMedia = null;
}
function onBodyLoad() {
var s = document.readyState;
if (s !== "loading")
scan();
if (s === "loaded" || s === "complete")
document.detachEvent("onreadystatechange", onBodyLoad);
}
function onBodyScroll() {
window.detachEvent("onscroll", onBodyScroll);
setTimeout(scan(), 200);
}
document.attachEvent("onreadystatechange", onBodyLoad);
window.attachEvent("onscroll", onBodyScroll);
}
new KillAd();
newkillAd.js一开始的时候放Html文本最后的,但遇到网页出错的情况,不能正确处理。也试过script标签的defer属性,但在TW3下,很多网页会处于一直加载状态,使JS一直得不到执行!也试过定时器,但定时的时间不好处理,跟硬件和网速的关系太大了!
用<attachhtml>和defer一样的延迟效果,但方便点。可用于指定站点执行脚本,如自定义站点样式!如下:
<attachhtml>
<![CDATA[<script type="text/javascript" src="file:///U:/TheWorld3/newkillAd.js"></script>]]>
</attachhtml>
/********************************************************************************
版权所有,转载请注明出处:http://blog.youkuaiyun.com/king_xing,欢迎反馈问题!
2012-06-18
文件名:newkillAd.js
功能说明将该JS文件加入网页中可查杀大多数非弹窗广告!!
有些动态生成的网页元素可能查询不到,而导致查杀失败
********************************************************************************/
(function () {
var urlRegp = /^(?:[a-z]+:\/{2})?(?:\w+\.)+[a-z]+\//,
urlLoc = window.location.hostname;
urlLoc = urlLoc.substring(urlLoc.indexOf(".")); //句点开头
if (urlLoc.lastIndexOf(".") === 0)
urlLoc = window.location.hostname;
urlLoc = urlLoc.toLowerCase();
function hasAdLink(o) {
var x = o.parentElement;
if (x.tagName !== "A") {
var c = x.getElementsByTagName("a");
if (c && c.length === 1)
//&& c[0].scrollHeight === o.scrollHeight &&
//c[0].scrollWidth === o.scrollWidth)
x = c[0];
else
return false;
}
return isAdURL(x.href);
}
function isAdURL(x) {
var s = x.toLowerCase().match(urlRegp); //提取出hostname
return s && (s[0].indexOf(urlLoc) === -1);
}
function getStyle(elem, styleName) {
if (elem.style[styleName])
return elem.style[styleName];
else if (elem.currentStyle)
return elem.currentStyle[styleName];
}
//var dbg;
function isFloatLay(el) {
var x = el.offsetParent;
//if (!x && getStyle(el, "display") !== "none") return false;
//return !x.offsetParent || x.tagName === "BODY";
//dbg = x && x.tagName === "HTML";
//天极网http://dc.yesky.com/45/32258045.shtml ,这广告太诡异了:明明删除动作执行了还存在、和傲游中看到的网页结构也不一样! 都TMD是IE的错:操,每个JS程序都执行二遍以上
//if (el.id="AC_TR86_2386") (x) ? alert(x.tagName+" style: "+getStyle(x, "1display")) : alert("null");
//if (!x) alert(el.tagName + " ;html, run in isFloatLay(), id: " + el.id);
//if (!x) return true;// || (x.tagName === "BODY");
return (!x) || (x.tagName === "BODY"); // || (x.tagName === "BODY")|| (x.tagName === "HTML")|| (getStyle(el, "display") === "none") || (getStyle(el, "z-index") == -1);
}
function testStyle(o) {
var s = getStyle(o, "position");
return (s === "fixed" || s === "absolute");
}
function scan(el) {
var i, j, k, c, x, b, bo, s,
cnstMedia = ["iframe", "img", "object", "embed", "video"]; //video是Html5标签
bo = document.body;
for (i = 0; i < 5; i++) {
c = el.getElementsByTagName(cnstMedia[i]);
for (j = c.length - 1; j >= 0; j--) {
x = c[j];
if (!x)
continue;
//如果只处理浮动广告,注释下面这句
b = (i === 0) ? (x.src && isAdURL(x.src)) : hasAdLink(x);
if (x.offsetParent) { //可见与否~如被其它层遮挡住了
//进行浮动判断:网页DOM向上层回溯
while (x !== bo) {
if ((x.tagName === "DIV" || x.tagName === "SPAN") && testStyle(x)) {
while (testStyle(x.parentElement)) {
//alert(x.tagName +" src: "+ x.src);
x = x.parentElement;
}
if (isFloatLay(x)) { //css, offsetParent动态定位
//s = x.tagName + " ;del id: " + x.id + " ; It's offsetParent: ";
//(x.offsetParent) ? s = s + x.offsetParent.tagName : s = s + "null";
//alert(s);
x.parentNode.removeChild(x); //x.style.display = "none";
//x.visable = false;
}
//if (dbg) alert(x.tagName + ",last ;html, id " + x.id);
break;
}
x = x.parentElement;
}
}
if (b && c[j])
c[j].parentNode.removeChild(c[j]); //只想处理浮动广告,注释这句
}
}
}
function onBodyLoad() {
var s = document.readyState;
scan(document);
if (s === "loaded" || s === "complete") {
document.detachEvent("onreadystatechange", onBodyLoad);
}
}
function onBodyScroll() {
window.detachEvent("onscroll", onBodyScroll);
setTimeout(scan(document), 200);
}
//扫描脚本并设置其事件
function scanScript() {
var c, i, me;
c = document.getElementsByTagName("script");
me = document.getElementById("jsKillAD");
for (i = c.length - 1; i >= 0; i--) {
if (c[i].readyState !== "complete" &&
//c[i].readyState !== "loaded" &&
c[i] !== me) {
c[i].attachEvent("onreadystatechange", onADScript);
}
}
}
function onADScript() {
var x,
el = event.srcElement;
x = el.parentElement;
(!x || x.tagName === "HEAD") ? scan(document) : scan(x);
if (el.readyState === "complete" || el.readyState === "loaded") //interactive防止下载媒体内容
el.detachEvent("onreadystatechange", onADScript);
}
//if (window.top === window.self){//不在静态子框架中执行
document.attachEvent("onreadystatechange", onBodyLoad);
window.attachEvent("onscroll", onBodyScroll);
setTimeout(scanScript, 10);
setTimeout(scan(document), 90);
//}
})();
2013-5-31版本
(function () {
function getStyle(o, styleName) {
return o.style[styleName] || o.currentStyle[styleName];
}
function testStyle(o) {
var s = getStyle(o, "position");
return s === "fixed" || s === "absolute";
}
/*
function sameDomain(o) {
try {
return o.document.body;
} catch (e) {
return 0;
}
}
*/
function isFloatLay(o) {
var x = o.offsetParent;
return !x || x.tagName === "BODY" || x.tagName === "HTML";
}
function nodeToElement(node) {
if (!node || node.innerHTML) return node;
var s, oldId = node.id;
s = node.id = "__alFwo8dz_fAo3_N";
try {
s = node.ownerDocument.getElementById(s);
}
finally {
oldId ? node.id = oldId : node.removeAttribute("id");
}
return s || node;
}
function scan(el) {
var i, j, c, x,
oMedia = ["iframe", "img", "object", "embed", "video"];
/*
c = el.querySelectorAll ? el.querySelectorAll("div>script") : el.getElementsByTagName("script");
for (j = c.length - 1; j >= 0; j--) {
x = c[j].parentNode;
if (x.childNodes.length === 1)
x.parentNode.removeChild(x);
}
*/
for (i = 0; i < 5; i++) {
c = el.getElementsByTagName(oMedia[i]);
for (j = c.length - 1; j >= 0; j--) {
x = c[j];
//if (i === 0 && sameDomain(x) ) continue;
while (x) {
if (isFloatLay(x)) {
if (testStyle(x))//要删除的层得同时满足二个条件
x.parentNode.removeChild(x);
break;
}
//else
x = nodeToElement(x.offsetParent);
}
}
}
}
/*
//扫描广告脚本
function scanADjs(){
var c, i, o;
c = document.getElementsByTagName("script");
for (i=c.length-1;i>=0;i--) {
o = c[i];
if (o.src && o.readyState !== "complete")
o.parentNode.removeChild(o);
}
}
scanADjs();
*/
scan(document);
if (frames) {
for (var i = 0; i < frames.length; i++) {
try {
scan(frames[i].document);
} catch (e) {}
}
}
})();