2010-09-22 11 views
9

Estamos utilizando OpenX para publicar anuncios en una serie de sitios. Sin embargo, si el servidor de OpenX tiene problemas, bloquea cargas de página en estos sitios. Prefiero que los sitios fallen correctamente, es decir, carguen las páginas sin los anuncios y los completen cuando estén disponibles.¿Cómo podemos evitar que OpenX bloquee la carga de la página?

Estamos usando OpenX's single page call, y estamos dando a los divs tamaño explícito en CSS para que puedan distribuirse sin su contenido, pero aún cargando la carga de la página de bloques de script. ¿Existen otras mejores prácticas para acelerar las páginas con OpenX?

+0

ver http://stackoverflow.com/questions/3106782/openx-aysnc-tags –

Respuesta

1

OpenX tiene algún tipo de documentación sobre cómo hacer que su carga de etiquetas de forma asíncrona: http://docs.openx.com/ad_server/adtagguide_synchjs_implementing_async.html

Lo he probado, y funciona bien en la corriente de Chrome/Firefox.

Se requiere un ajuste manual de su código de anuncio. Su ejemplo de cómo las etiquetas de anuncios deben terminar:

<html> 
<head></head> 

<body> 

Some content here. 

Ad goes here. 

<!-- Preserve space while the rest of the page loads. --> 

<div id="placeholderId" style="width:728px;height:90px"> 

<!-- Fallback mechanism to use if unable to load the script tag. --> 

<noscript> 
<iframe id="4cb4e94bd5bb6" name="4cb4e94bd5bb6" 
src="http://d.example.com/w/1.0/afr?auid=8&target= 
_blank&cb=INSERT_RANDOM_NUMBER_HERE" 
frameborder="0" scrolling="no" width="728" 
height="90"> 
<a href="http://d.example.com/w/1.0/rc?cs= 
4cb4e94bd5bb6&cb=INSERT_RANDOM_NUMBER_HERE" 
target="_blank"> 
<img src="http://d.example.com/w/1.0/ai?auid=8&cs= 
4cb4e94bd5bb6&cb=INSERT_RANDOM_NUMBER_HERE" 
border="0" alt=""></a></iframe> 
</noscript> 
</div> 

<!--Async ad request with multiple parameters.--> 

<script type="text/javascript"> 
    var OX_ads = OX_ads || []; 
    OX_ads.push({ 
     "slot_id":"placeholderId", 
     "auid":"8", 
     "tid":"4", 
     "tg":"_blank", 
     "r":"http://redirect.clicks.to.here/landing.html", 
     "rd":"120", 
     "rm":"2", 
     "imp_beacon":"HTML for client-side impression beacon", 
     "fallback":"HTML for client-side fallback" 
    }); 
</script> 

<!-- Fetch the Tag Library --> 

<script type="text/javascript" src="http://d.example.com/w/1.0/jstag"></script> 

Some other content here. 

</body> 
</html> 
+1

¡Oye, son buenas noticias! Hace más de 2 años que no trabajo con OpenX, pero es bueno ver que están alcanzando un rendimiento como este. – pjmorse

5

Cargamos nuestros anuncios en iframes para evitar el problema que está teniendo. Igualamos el tamaño de div y el iframe, con el iframe apuntando a una página que solo contiene el fragmento de anuncio (puede pasar la zona y otras opciones requeridas como parámetros a esa página).

aplausos

Lee

+0

¿Se cargar el anuncio en un iframe tiene ningún inconvenientes tales como la pérdida de ¿contexto? (es decir, el anuncio no puede "ver" el resto de la página). ¿O pasa los parámetros de contexto necesarios en la URL iframe? – cherouvim

+0

Agregamos palabras clave y contenido a la página (no visible desde la página externa), así como el fragmento, por lo que si escanean la URL de referencia obtienen un contenido relevante. – leebutts

5

Nos perezoso-carga de código de OpenX. En lugar de poner la llamada de una sola página en la parte superior de la página, la colocamos en la parte inferior. Después de que la página se haya cargado, la llamada recibirá los datos del banner y un código personalizado agregará los banners adecuados en las zonas correctas.

El siguiente código requiere un DOM correcto. Si tiene jQuery, DOMAssistant, FlowJS, etc., el DOM debe ser arreglado por usted. Este código funcionará con pancartas normales con imágenes, flash o contenido HTML. Es posible que no funcione en algunos casos, como cuando se utilizan banners de proveedores externos (anuncios, etc.). Para eso es posible que tengas que piratear el código un poco.

¿Cómo usarlo?

  1. añadir su código SinglePageCall hacia el final de su código HTML
  2. añadir este código en el código SPC.
  3. después de medio segundo más o menos, su código OpenX debe estar listo, y el código siguiente colocará los banners dentro de los DIV especificados.
  4. Oh, sí, necesita agregar a su código HTML algunos DIV como marcadores de lugar para sus pancartas. De forma predeterminada, tengo estos banners establecidos con la clase CSS "oculta", que oculta por completo los DIV (con visibilidad, visualización y altura). Luego, después de que el banner en un DIV dado se cargue exitosamente, eliminamos la clase oculta y el DIV (y el banner dentro) se vuelven visibles.

¡Corra bajo su propio riesgo! :) Espero que ayuda

(function(){ 
if (!document || !document.getElementById || !document.addEventListener || !document.removeClass) { 
return; // No proper DOM; give up. 
} 
var openx_timeout = 1, // limit the time we wait for openx 
oZones = new Object(), // list of [div_id] => zoneID 
displayBannerAds; // function. 


// oZones.<divID> = <zoneID> 
// eg: oZones.banner_below_job2 = 100; 
// (generated on the server side with PHP) 
oZones.banner_top = 23; 
oZones.banner_bottom = 34; 



displayBannerAds = function(){ 
if(typeof(OA_output)!='undefined' && OA_output.constructor == Array){ 
    // OpenX SinglePageCall ready! 

    if (OA_output.length>0) { 

    for (var zone_div_id in oZones){ 
     zoneid = oZones[zone_div_id]; 

     if(typeof(OA_output[zoneid])!='undefined' && OA_output[zoneid]!='') { 

     var flashCode, 
      oDIV = document.getElementById(zone_div_id); 

     if (oDIV) { 

      // if it's a flash banner.. 
      if(OA_output[zoneid].indexOf("ox_swf.write")!=-1) 
      { 

      // extract javascript code 
      var pre_code_wrap = "<script type='text/javascript'><!--// <![CDATA[", 
       post_code_wrap = "// ]]> -->"; 

      flashCode = OA_output[zoneid].substr(OA_output[zoneid].indexOf(pre_code_wrap)+pre_code_wrap.length); 
      flashCode = flashCode.substr(0, flashCode.indexOf(post_code_wrap)); 


      // replace destination for the SWFObject 
      flashCode = flashCode.replace(/ox\_swf\.write\(\'(.*)'\)/, "ox_swf.write('"+ oDIV.id +"')"); 


      // insert SWFObject 
      if(flashCode.indexOf("ox_swf.write")!=-1){ 
       eval(flashCode); 
       oDIV.removeClass('hidden'); 
      }// else: the code was not as expected; don't show it 


      }else{ 
      // normal image banner; just set the contents of the DIV 
      oDIV.innerHTML = OA_output[zoneid]; 
      oDIV.removeClass('hidden'); 
      } 
     } 
     } 
    } // end of loop 
    }//else: no banners on this page 
}else{ 
    // not ready, let's wait a bit 
    if (openx_timeout>80) { 
    return; // we waited too long; abort 
    }; 
    setTimeout(displayBannerAds, 10*openx_timeout); 
    openx_timeout+=4; 
} 
}; 
displayBannerAds(); 
})(); 
+0

¿Podría proporcionar una muestra de ese código personalizado? He jugado con reemplazar la función document.write, pero tuve algunos problemas para cargar el contenido en contenedores adecuados ya que tenemos varios banners en la misma página. –

+0

Rafa, ¿es el código personalizado algo como esto: http://jqueryad.web2ajax.fr/? Lo encontramos recientemente, pero aún no lo hemos implementado como una prueba. – pjmorse

+0

pjmorse> Me acabo de dar cuenta de que nunca respondí tu comentario y solo actualicé la respuesta. Me pregunto si recibiste algún tipo de notificación. Si no, aquí hay un comentario de "ping"/"poke", por si acaso ... un año después ;-) – Rafa

1

Siguiendo @Rafa respuesta excelente, estoy usando este código para invocar banderas OpenX después se carga la página. También estoy usando jquery y tuve que agregar una nueva llamada de reemplazo para el "document.write" que utilizan los banners flash, y reemplazarlo por "$ ('#" + oDIV.id + "') append" en su lugar. Estoy usando una llamada personalizada "my_openx()" para reemplazar "OA_show()". Mi área de banners llamado por el IdDeZona y están envueltos dentro de un div, así:

<div id="openx-4"><script>wm_openx(4);</script></div> 

Está funcionando :)

<script type="text/javascript">    
$is_mobile = false; 
$document_ready = 0; 
$(document).ready(function() { 
    $document_ready = 1; 
    if($('#MobileCheck').css('display') == 'inline') { 
     $is_mobile = true; 
     //alert('is_mobile: '+$is_mobile); 
    } 
}); 

function wm_openx($id) { 
    if($is_mobile) return false; 
    if(!$document_ready) { 
     setTimeout(function(){ wm_openx($id); },1000); 
     return false; 
    } 

    if(typeof(OA_output[$id])!='undefined' && OA_output[$id]!='') { 

     var flashCode, 
      oDIV = document.getElementById('openx-'+$id); 

     if (oDIV) { 

      // if it's a flash banner.. 
      if(OA_output[$id].indexOf("ox_swf.write")!=-1) { 

       // extract javascript code 
       var pre_code_wrap = "<script type='text/javascript'><!--// <![CDATA[", 
        post_code_wrap = "// ]]> -->"; 

       flashCode = OA_output[$id].substr(OA_output[$id].indexOf(pre_code_wrap)+pre_code_wrap.length); 
       flashCode = flashCode.substr(0, flashCode.indexOf(post_code_wrap)); 

       // replace destination for the SWFObject 
       flashCode = flashCode.replace(/ox\_swf\.write\(\'(.*)'\)/, "ox_swf.write('"+ oDIV.id +"')"); 
       flashCode = flashCode.replace(/document.write/, "$('#"+ oDIV.id +"').append"); 


       // insert SWFObject 
       if(flashCode.indexOf("ox_swf.write")!=-1) { 
        //alert(flashCode); 
        eval(flashCode); 
        //oDIV.removeClass('hidden'); 
       }// else: the code was not as expected; don't show it 


      }else{ 
       // normal image banner; just set the contents of the DIV 
       oDIV.innerHTML = OA_output[$id]; 
       //oDIV.removeClass('hidden'); 
      } 
     } 
    } 
    //OA_show($id); 
} 
</script> 
1

que estaba buscando esto para cargar la publicidad de mi servidor OpenX sólo cuando el la publicidad debe ser visible. Estoy usando la versión iFrame de openX que está cargada en un div.La respuesta aquí me puso en camino para resolver este problema, pero la solución publicada es un poco demasiado simple. En primer lugar, cuando la página no se carga desde la parte superior (en caso de que el usuario ingrese a la página haciendo clic en "volver"), ninguno de los divs se carga. Entonces necesitarás algo como esto:

$(document).ready(function(){ 
    $(window).scroll(lazyload); 
    lazyload(); 
}); 

Además, necesitarás saber qué define un div visible. Eso puede ser un div que sea completamente visible o parcialmente visible. Si la parte inferior del objeto es mayor o igual que la parte superior de la ventana Y la parte superior del objeto es más pequeña o igual que la parte inferior de la ventana, debería estar visible (o en este caso: cargada). Su lazyload función puede tener este aspecto:

function lazyload(){ 
    var wt = $(window).scrollTop(); //* top of the window 
    var wb = wt + $(window).height(); //* bottom of the window 

    $(".ads").each(function(){ 
     var ot = $(this).offset().top; //* top of object (i.e. advertising div) 
     var ob = ot + $(this).height(); //* bottom of object 

     if(!$(this).attr("loaded") && wt<=ob && wb >= ot){ 
     $(this).html("here goes the iframe definition"); 
     $(this).attr("loaded",true); 
     } 
    }); 
} 

Probado en todos los principales navegadores, e incluso en mi iPhone, funciona como un encanto !!

Cuestiones relacionadas