Insérer des adsense en Javascript après le chargement de la page

Le 03 janvier 2009 à 01h32 | Publié sous | 4 commentaires

Afin de ne pas faire subir mes publicités adsense à mes visiteurs réguliers, j’ai mis en place un système d’affichage des bannières en fonction de leur refferer. Typo me générant des pages HTML statiques, j’ai été obligé de faire tout cela en Javascript.

La solution propre aurait été d’utiliser la fonction suivante :

display_adsense = function(client, slot, width, height, div) {
  if (document.referrer == "") {
    return(0);    
  }

  var referrers = ["/search", "search.live.com", "ask.com", "images.google", "soso.com", "baidu"];

  for (var i = 0; i < referrers.length; i++) {
    if (document.referrer.toLowerCase().indexOf(referrers[i]+'') != -1) {
      google_ad_client = client;
      google_ad_slot = slot;
      google_ad_width = width;
      google_ad_height = height;

      var e = document.createElement("script");
      e.type = "text/javascript";
      e.src = "http://pagead2.googlesyndication.com/pagead/show_ads.js";
      document.getElementById(div).appendChild(e);
      return(0);
    }
  }  
}

L’appel se faisant dans le window.onload :

window.onload = function() {
   display_adsense("client", "slot", width, height, div);
}

Il est ainsi possible de placer plusieurs encarts publicitaires sur une même page.

Malheureusement, ça ne marche pas, et les comportements sont très différents en fonction des navigateurs (et pas toujours très rationnels).

Si j’utilise le window.onload :

    <li>Firefox 3 : affiche une page blanche et tourne en boucle sans rien charger.</li>
    <li>Safari : affiche la bannière adsense au bon endroit, ou à la fin du document, selon les fois, de manière totalement aléatoire.</li>
    <li>Internet Explorer 7 : rien ne s'affiche, sauf quand je rajoute un alert("toto") dans le code, histoire de valider que ma fonction est bien interprétée.</li>
    

Si j’appelle simplement ma fonction en bas du document :

    <li>Firefox 3 : affiche la bannière n'importe où dans le document. Firebug me montre bien une div vide, et la publicité dans une div aléatoire (souvent la sidebar, mais pas toujours).</li>
    <li>Safari : affiche au bon endroit, ou à la fin du document, selon les fois, de manière totalement aléatoire.</li>
    <li>Internet Explorer 7 : affiche le bloc adsense à la fin du document systématiquement, sauf quand je rajoute un alert("toto") dans le code, histoire de valider que ma fonction est bien interprétée.</li>
    

Selon Anthony Ricaud, cela pourrait venir du fait que Google utilise document.write pour afficher ses encarts publicitaires. Tenter de modifier le DOM après le chargement complet du document avec un script tentant un document.write serait à l’origine de tous mes problèmes, lesquels m’ont pris, au passage, une bonne partie de la journée.

La solution retenue est particulièrement sale, mais a le mérite de fonctionner : appeler ma fonction depuis les div de destination et utiliser moi aussi du document.write.

Ma fonction finale donne alors :

display_adsense = function(client, slot, width, height, div) {
  if (document.referrer == "") {
    return(0);    
  }

  var referrers = ["/search", "search.live.com", "ask.com", "images.google", "soso.com", "baidu"];

  for (var i = 0; i < referrers.length; i++) {
    if (document.referrer.toLowerCase().indexOf(referrers[i]+'') != -1) {
      google_ad_client = client;
      google_ad_slot = slot;
      google_ad_width = width;
      google_ad_height = height;
            document.write('<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>');
      return(0);
    }
  }  
}

L’appel de la fonction se fait alors comme ceci :

<div id="adsense">
    <script type="text/javascript">
        display_adsense(client, slot, width, height);
    </script>
</div>

[Edit]

Je rajoute également la méthode proposée par Sunny Rippert :

function display_adsense(client, slot, width, height, element_id) {
  var referrers = /(/search|search</span>.live</span>.com|ask</span>.com|images</span>.google|soso</span>.com|baidu)/i;
  if (!document.referrer.match(referrers))

<span class="kw">return</span>;

google_ad_client = client; google_ad_slot = slot; google_ad_width = width; google_ad_height = height;

document.write(<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>); }

J’ai également utilisé la méthode utilisant DOMContentLoaded (et ses adaptations sur les navigateurs ne la supportant pas), et le résultat est encore pire, notamment sous Firefox. Si vous connaissez une méthode qui fonctionne pour faire ça proprement, n’hésitez pas à vous signaler, je suis preneur.

  1. jean-mi 27 minutes plus tard :

    Outre le fait que tu t’es royalement fait chier pour mettre en place la solution. Ça te rapporte quoi par rapport à mettre de la pub pour tout le monde. Tes habitués me semblait être des power-user du web utilisant sûrement adblock histoire de gagner en vitesse d’affichage de page (entre autre, mais c’est pour le confort). Donc pub ou pas pub dans la page web :). Tant que tu ne te mets pas au publi-reportage (mais là je ne viens plus).

    Tiens autrement, c’est quoi ton ratio habitué/perdu au niveau visite de page?

  2. Olivier 5 days plus tard :

    Coïncidence ou pas, un hack pour Wordpress concernant le même sujet : http://www.korben.info/comment-afficher-des-publicites-adsense-uniquement-aux-visiteurs-en-provenance-des-moteurs-de-recherche.html

    A quand 10 hacks pour Typo ? ;)

    @+

  3. samuel 16 days plus tard :

    bonjour, grâce à ce post je vois que je suis pas seul à avoir batailer sur les conflit qu’il peut y avoir entre les document.write et une utilisation plus avancée du dom. Mais sinon il me semble que la solution que tu donne ne répond pas au problème que tu poses dans le titre du post…. à moins que j’ai mal compris

  4. Jukien 2 months plus tard :

    J’ai longuement hésité à écrire le code d’appel des publicités en Javascript. Non pas pour les afficher ou non selon le visiteur, mais pour le faire uniquement lorsque la page est totalement chargée (et donc charger le contenu avant la pub, le visiteur gagne en temps d’affichage du contenu).

    Cependant, j’y ai renoncé : Je ne sais pas exactement comment fonctionne Google Adsense, je ne sais pas exactement ce que fait leur robot. S’assure-t-il de la présence du code de l’annonce ?

Merci de vous exprimer dans un français correct. Les commentaires déplacés, injurieux et le spam seront supprimés.

Les trackbacks sont fermés pour cause de spam.