世界之窗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文件中的一處小錯誤。
剛剛發現CSDN的代碼框支持複製了,內牛滿面中.......這麼簡單的功能現在才搞出來
(對彈窗廣告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.csdn.net/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.csdn.net/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) {}
}
}
})();