Edit 02/07/07: Nouvelle version du script, plus rapide, et compatible avec les dernières versions des différents bloqueurs de pub.
Edit 05/07/07: Le script semble devenir populaire, quelques listes de bloquage d’adblock ont dû white lister les images dont l’adresse contient googlesyndication. J'ai donc modifier l'adresse de l'image témoin: Mettez /ads/ comme adresse.
Script de détection de bloqueurs de publicités.
Comment ça marche ?
On place une image témoin dans la page dont l'URL est susceptible de se faire bloquer. Ensuite on utilise un script pour effectuer divers tests sur l'image. On test si elle a été supprimée de la page, ou caché, ou non chargée, remplacée, etc...
Si le script détecte qu'un bloqueur de publicité est activé, il appel la méthode adblockblock.block(). Par défaut cette méthode fait un alert('Adblock activé'); , mais vous pouvez biensûr modifier son comportement.
À quoi sa sert ?
Vous pouvez l'utiliser pour:
Compatibilité:
Ce script fonctionne avec les techniques de bloquage suivantes:
Le code à copier quelque part dans vos pages:
N'oubliez pas de mettre à jour le code de l'image témoin si vous aviez installé l'ancienne version du script, les arguments onload et onerror sont importants.
Edit 05/07/07: Le script semble devenir populaire, quelques listes de bloquage d’adblock ont dû white lister les images dont l’adresse contient googlesyndication. J'ai donc modifier l'adresse de l'image témoin: Mettez /ads/ comme adresse.
Script de détection de bloqueurs de publicités.
Comment ça marche ?
On place une image témoin dans la page dont l'URL est susceptible de se faire bloquer. Ensuite on utilise un script pour effectuer divers tests sur l'image. On test si elle a été supprimée de la page, ou caché, ou non chargée, remplacée, etc...
Si le script détecte qu'un bloqueur de publicité est activé, il appel la méthode adblockblock.block(). Par défaut cette méthode fait un alert('Adblock activé'); , mais vous pouvez biensûr modifier son comportement.
À quoi sa sert ?
Vous pouvez l'utiliser pour:
- Éduquer vos visiteurs: Expliquez leurs que votre site ne serait pas là où il en est sans la publicité, peut être même qu'il n'existerait pas.
- Afficher une autre publicité non bloquée, faire de l'auto promotion, etc...
- Bloquer les leechers. Après tout, les utilisateurs qui n'affichent pas la publicité sont des leechers, vous payez l'hébergement de votre site pour eux, vous passez du temps sur votre site et eux ils prennent sans donner. Vous pouvez aussi mettre toutes vos images, css et js dans un répertoire /ads/, les leechers ne les téléchargeront pas et vous économiserez de la bande passante.
Compatibilité:
Ce script fonctionne avec les techniques de bloquage suivantes:
- Adblock de Firefox
- Le tueur de pub de Maxthon
- Adblock de Konqueror
- Les styles CSS personnels
- Les serveurs DNS ou fichiers hosts qui truquent la résolution des noms
- Les proxies qui renvoient un autre fichier à la place des pubs
Le code à copier quelque part dans vos pages:
N'oubliez pas de mettre à jour le code de l'image témoin si vous aviez installé l'ancienne version du script, les arguments onload et onerror sont importants.
Code:
<img src="/ads/" width="0" height="0" border="0" alt="adblocktest" id="adblocktest" onload="this.imgloaded=true;" onerror="this.imgloaded=true;" />
<script type="text/javascript">
adblockblock = function() {
if (window.addEventListener) {
window.addEventListener('load', this.bind(this.initialize), false);
} else if (window.attachEvent) {
window.attachEvent('onload', this.bind(this.initialize));
}
};
adblockblock.prototype = {
initialize: function() {
this.interval = setInterval(this.bind(this.test), 1000);
this.test();
},
test: function() {
var element=document.getElementById('adblocktest');
/* On test si l'element a été supprimé par le bloqueur
* Maxthon?, Konqueror
*/
if(!element)
{
this.logger('Element image non trouvé');
return this.block();
}
/* On test si l'image n'a tout pas été chargée dutout
* Adblock, /etc/hosts, proxies, etc
* Gecko: element.complete==true, même si image non trouvée / mauvaise image et onerror||onload appellée
* IE: element.complete==false quand image non trouvée.
*/
if (element.complete && !element.imgloaded)
{
this.logger('Image non chargée');
return this.block();
}
/* On test si l'element a été caché par le bloqueur
* (display:none, ou visibility:hidden, ou position:absolute et top/left hors de la page)
* Old adblock
*/
var display = this.getStyle(element, 'display');
var visibility = this.getStyle(element, 'visibility');
var position = this.getStyle(element, 'position');
if (display != 'inline' || (visibility != 'visible' && visibility != 'inherit') || position != 'static')
{
this.logger('Image cachée: display='+display+' visibility='+visibility+' position='+position);
return this.block();
}
/* On test si l'image a été remplacée
* Pour une image non chargée, naturalWidth/Height doit être indéfini ou 0
*/
if ((element.naturalWidth && element.naturalWidth > 0) || (element.naturalHeight && element.naturalHeight > 0)) {
this.logger('Image remplacée');
return this.block();
}
/* Pour Konqueror
*/
if (element.width && element.width == 64) {
this.logger('Image remplacée (Konqueror)');
return this.block();
}
},
getStyle: function(element, key) {
if (document.defaultView && document.defaultView.getComputedStyle) {
return document.defaultView.getComputedStyle(element, '').getPropertyValue(key);
} else {
return element.currentStyle[key];
}
},
block: function(blockMethod) {
// Ne pas supprimer cette ligne
if (this.interval) clearInterval(this.interval);
// Mettez ce que vous voulez ici
alert('Adblock activé ! ');
},
bind: function(func) {
var obj = this;
return function() {
return func.apply(obj, []);
};
},
logger: function(str) {
if (typeof console == 'undefined') return;
if (typeof console.log == 'undefined') return;
console.log(str);
}
};
/*Décommenter pour débugger (ou utiliser firebug)
if (typeof console == 'undefined') {
console={};
console.log = function(str) {
var el = document.createElement('div');
el.appendChild(document.createTextNode(str));
document.body.appendChild(el);
};
}
*/
new adblockblock();
</script>