我们怎样才能阻止OpenX阻止页面加载?

时间:2010-09-22 14:59:31

标签: javascript performance client-side openx page-load-time

我们正在使用OpenX在多个网站上投放广告。但是,如果OpenX服务器出现问题,它会阻止这些站点上的页面加载。我宁愿让这些网站优雅地失败,即加载没有广告的网页,并在它们可用时填写它们。

我们正在使用OpenX的single page call,我们在CSS中给div显式大小,这样它们可以在没有内容的情况下布局,但仍然加载脚本块页面加载。是否还有其他使用OpenX加速页面的最佳实践?

5 个答案:

答案 0 :(得分:5)

我们在iframe中加载广告,以避免您遇到的问题。我们将div和iframe的大小相同,iframe指向一个只包含广告代码段的页面(您可以将区域和其他必需的选项作为参数传递给该页面)。

欢呼声

答案 1 :(得分:5)

我们懒惰加载OpenX的代码。我们将其放在底部,而不是将单页调用放在页面顶部。页面加载后,调用将获得横幅数据,自定义代码将在正确的区域中添加正确的横幅。

以下代码需要适当的DOM。如果您有jQuery,DOMAssistant,FlowJS等,那么应该为您修复DOM。 此代码适用于包含图像,Flash或HTML内容的普通横幅。在某些情况下,例如使用来自外部提供商(adform等)的横幅时,它可能无效。为此,您可能需要稍微破解代码。

如何使用它?

  1. 将您的SinglePageCall代码添加到HTML代码的末尾
  2. 在SPC代码下添加此代码。
  3. 半秒左右后,您的OpenX代码应该准备就绪,下面的代码会将横幅放在指定的DIV中。
  4. 哦,是的,您需要在HTML代码中添加一些DIV作为横幅的占位符。默认情况下,我将这些横幅设置为CSS类“隐藏”,它完全隐藏了DIV(具有可见性,显示和高度)。然后,在成功加载给定DIV中的横幅之后,我们删除隐藏的类,并且DIV(以及其中的横幅)变得可见。
  5. 使用风险自负! :)希望有所帮助

    (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();
    })();
    

答案 2 :(得分:1)

关注@Rafa优秀的答案,我正在使用此代码在页面加载后调用OpenX横幅。我也在使用jquery,并且必须为flash横幅使用的“document.write”添加一个新的替换调用,并将其替换为“$('#”+ oDIV.id +“')。附加”。我正在使用自定义“my_openx()”调用来替换“OA_show()”。我的横幅区域由zone_id调用,并包含在div中,如下所示:

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

它正在工作:)

<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>

答案 3 :(得分:1)

我一直在寻找这个,只有在广告应该可见时才从我的openX服务器加载广告。我正在使用加载在div中的openX的iFrame版本。这里的答案让我开始解决这个问题,但是发布的解决方案有点过于简单了。首先,当页面未从顶部加载时(如果用户通过单击“返回”进入页面),则不会加载任何div。所以你需要这样的东西:

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

另外,你需要知道什么定义了一个可见的div。这可以是完全可见或部分可见的div。如果对象的底部大于或等于窗口的顶部并且对象的顶部小于或等于窗口的底部,则它应该是可见的(或者在这种情况下:加载)。你的函数lazyload可能如下所示:

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);
      }
   });
}

在所有主流浏览器上测试,甚至在我的iPhone上测试,就像魅力一样!

答案 4 :(得分:1)

OpenX有一些关于如何异步加载标记的文档: http://docs.openx.com/ad_server/adtagguide_synchjs_implementing_async.html

我测试了它,它在当前的Chrome / Firefox中运行良好。

需要手动调整广告代码。他们应该如何结束广告代码的示例:

<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>