187 lines
4.7 KiB
JavaScript
187 lines
4.7 KiB
JavaScript
|
/*
|
||
|
* BlockAdBlock 3.1.1
|
||
|
* Copyright (c) 2015 Valentin Allaire <valentin.allaire@sitexw.fr>
|
||
|
* Released under the MIT license
|
||
|
* https://github.com/sitexw/BlockAdBlock
|
||
|
*/
|
||
|
|
||
|
(function(window) {
|
||
|
var BlockAdBlock = function(options) {
|
||
|
this._options = {
|
||
|
checkOnLoad: false,
|
||
|
resetOnEnd: false,
|
||
|
loopCheckTime: 50,
|
||
|
loopMaxNumber: 5,
|
||
|
baitClass: 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links',
|
||
|
baitStyle: 'width: 1px !important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;'
|
||
|
};
|
||
|
this._var = {
|
||
|
version: '3.1.1',
|
||
|
bait: null,
|
||
|
checking: false,
|
||
|
loop: null,
|
||
|
loopNumber: 0,
|
||
|
event: { detected: [], notDetected: [] }
|
||
|
};
|
||
|
if(options !== undefined) {
|
||
|
this.setOption(options);
|
||
|
}
|
||
|
var self = this;
|
||
|
var eventCallback = function() {
|
||
|
setTimeout(function() {
|
||
|
if(self._options.checkOnLoad === true) {
|
||
|
if(self._var.bait === null) {
|
||
|
self._creatBait();
|
||
|
}
|
||
|
setTimeout(function() {
|
||
|
self.check();
|
||
|
}, 1);
|
||
|
}
|
||
|
}, 1);
|
||
|
};
|
||
|
if(window.addEventListener !== undefined) {
|
||
|
window.addEventListener('load', eventCallback, false);
|
||
|
} else {
|
||
|
window.attachEvent('onload', eventCallback);
|
||
|
}
|
||
|
};
|
||
|
BlockAdBlock.prototype._options = null;
|
||
|
BlockAdBlock.prototype._var = null;
|
||
|
BlockAdBlock.prototype._bait = null;
|
||
|
|
||
|
BlockAdBlock.prototype.setOption = function(options, value) {
|
||
|
if(value !== undefined) {
|
||
|
var key = options;
|
||
|
options = {};
|
||
|
options[key] = value;
|
||
|
}
|
||
|
for(var option in options) {
|
||
|
this._options[option] = options[option];
|
||
|
}
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
BlockAdBlock.prototype._creatBait = function() {
|
||
|
var bait = document.createElement('div');
|
||
|
bait.setAttribute('class', this._options.baitClass);
|
||
|
bait.setAttribute('style', this._options.baitStyle);
|
||
|
this._var.bait = window.document.body.appendChild(bait);
|
||
|
|
||
|
this._var.bait.offsetParent;
|
||
|
this._var.bait.offsetHeight;
|
||
|
this._var.bait.offsetLeft;
|
||
|
this._var.bait.offsetTop;
|
||
|
this._var.bait.offsetWidth;
|
||
|
this._var.bait.clientHeight;
|
||
|
this._var.bait.clientWidth;
|
||
|
};
|
||
|
BlockAdBlock.prototype._destroyBait = function() {
|
||
|
window.document.body.removeChild(this._var.bait);
|
||
|
this._var.bait = null;
|
||
|
};
|
||
|
|
||
|
BlockAdBlock.prototype.check = function(loop) {
|
||
|
if(loop === undefined) {
|
||
|
loop = true;
|
||
|
}
|
||
|
|
||
|
if(this._var.checking === true) {
|
||
|
return false;
|
||
|
}
|
||
|
this._var.checking = true;
|
||
|
|
||
|
if(this._var.bait === null) {
|
||
|
this._creatBait();
|
||
|
}
|
||
|
|
||
|
var self = this;
|
||
|
this._var.loopNumber = 0;
|
||
|
if(loop === true) {
|
||
|
this._var.loop = setInterval(function() {
|
||
|
self._checkBait(loop);
|
||
|
}, this._options.loopCheckTime);
|
||
|
}
|
||
|
this._checkBait(loop);
|
||
|
|
||
|
return true;
|
||
|
};
|
||
|
BlockAdBlock.prototype._checkBait = function(loop) {
|
||
|
var detected = false;
|
||
|
|
||
|
if(this._var.bait === null) {
|
||
|
this._creatBait();
|
||
|
}
|
||
|
|
||
|
if(window.document.body.getAttribute('abp') !== null
|
||
|
|| this._var.bait.offsetParent === null
|
||
|
|| this._var.bait.offsetHeight == 0
|
||
|
|| this._var.bait.offsetLeft == 0
|
||
|
|| this._var.bait.offsetTop == 0
|
||
|
|| this._var.bait.offsetWidth == 0
|
||
|
|| this._var.bait.clientHeight == 0
|
||
|
|| this._var.bait.clientWidth == 0) {
|
||
|
detected = true;
|
||
|
}
|
||
|
if(window.getComputedStyle !== undefined) {
|
||
|
var baitTemp = window.getComputedStyle(this._var.bait, null);
|
||
|
if(baitTemp.getPropertyValue('display') == 'none'
|
||
|
|| baitTemp.getPropertyValue('visibility') == 'hidden') {
|
||
|
detected = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(loop === true) {
|
||
|
this._var.loopNumber++;
|
||
|
if(this._var.loopNumber >= this._options.loopMaxNumber) {
|
||
|
clearInterval(this._var.loop);
|
||
|
this._var.loop = null;
|
||
|
this._var.loopNumber = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(detected === true) {
|
||
|
if(loop === true) {
|
||
|
this._var.checking = false;
|
||
|
}
|
||
|
this._destroyBait();
|
||
|
this.emitEvent(true);
|
||
|
} else if(this._var.loop === null || loop === false) {
|
||
|
if(loop === true) {
|
||
|
this._var.checking = false;
|
||
|
}
|
||
|
this._destroyBait();
|
||
|
this.emitEvent(false);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
BlockAdBlock.prototype.emitEvent = function(detected) {
|
||
|
var fns = this._var.event[(detected===true?'detected':'notDetected')];
|
||
|
for(var i in fns) {
|
||
|
if(fns.hasOwnProperty(i)) {
|
||
|
fns[i]();
|
||
|
}
|
||
|
}
|
||
|
if(this._options.resetOnEnd === true) {
|
||
|
this.clearEvent();
|
||
|
}
|
||
|
return this;
|
||
|
};
|
||
|
BlockAdBlock.prototype.clearEvent = function() {
|
||
|
this._var.event.detected = [];
|
||
|
this._var.event.notDetected = [];
|
||
|
};
|
||
|
|
||
|
BlockAdBlock.prototype.on = function(detected, fn) {
|
||
|
this._var.event[(detected===true?'detected':'notDetected')].push(fn);
|
||
|
return this;
|
||
|
};
|
||
|
BlockAdBlock.prototype.onDetected = function(fn) {
|
||
|
return this.on(true, fn);
|
||
|
};
|
||
|
BlockAdBlock.prototype.onNotDetected = function(fn) {
|
||
|
return this.on(false, fn);
|
||
|
};
|
||
|
|
||
|
window.BlockAdBlock = BlockAdBlock;
|
||
|
})(window);
|