Как мы можем удержать OpenX от блокировки загрузки страницы?

Мы используем OpenX для показа рекламы на нескольких сайтах. Однако, если у сервера OpenX есть проблемы, он блокирует загрузку страниц на этих сайтах. Я бы предпочел, чтобы сайты не работали изящно, то есть загружали страницы без рекламы и заполняли их, когда они стали доступны.

Мы используем OpenXодностраничный вызови мы даем div в явном размере в CSS, чтобы их можно было выкладывать без их содержимого, но при этом загрузка скриптовых блоков загружает страницу. Существуют ли другие рекомендации по ускорению страниц с помощью OpenX?

 Mauricio Scheffer30 сент. 2010 г., 20:35

Ответы на вопрос(5)

После превосходного ответа @Rafa, я использую этот код для вызова баннеров OpenX после загрузки страницы. Я также использую jquery, и мне пришлось добавить новый вызов замены для «document.write», который используют флэш-баннеры, и заменить его на «$ ('#" + oDIV.id + "'). Append". Я использую пользовательский вызов 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>
Решение Вопроса

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>
 pjmorse06 июн. 2014 г., 14:49
Эй, это хорошие новости! Я не работаю с OpenX уже более 2-х лет, но приятно видеть, что они нагоняют такую ​​производительность.

Мы загружаем нашу рекламу в iframes, чтобы избежать проблемы, с которой вы столкнулись. Размеры div и iframe одинаковы, при этом iframe указывает на страницу, которая содержит только фрагмент объявления (вы можете передать зону и другие необходимые параметры в качестве параметров этой странице).

ура

подветренный

 cherouvim01 окт. 2010 г., 09:03
Есть ли у загрузки рекламы в iframe какие-либо недостатки, такие как потеря контекста? (то есть объявление не может "видеть" остальную часть страницы). Или вы передаете какие-либо обязательные параметры контекста в URL iframe?
 leebutts01 окт. 2010 г., 11:37
Мы добавляем на страницу ключевые слова и контент (не видимый с внешней страницы), а также фрагмент, поэтому, если они сканируют URL-адрес, они получают соответствующий контент.

Я искал это, чтобы загрузить рекламу с моего сервера openX только тогда, когда реклама должна быть видимой. Я использую iFrame версию openX, которая загружается в div. Ответ здесь дал мне возможность решить эту проблему, но опубликованное решение слишком простое. Прежде всего, когда страница не загружается сверху (в случае, если пользователь заходит на страницу, нажимая «назад»), ни один из элементов 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, работает как шарм!

Мы лениво загружаем код OpenX. Вместо того, чтобы помещать одностраничный вызов вверху страницы, мы помещаем его внизу. После загрузки страницы вызов получит данные баннера, а пользовательский код добавит правильные баннеры в правильные зоны.

Код ниже требует правильного DOM. Если у вас есть jQuery, DOMAssistant, FlowJS и т. Д., DOM должен быть исправлен для вас. Этот код будет работать с обычными баннерами с изображениями, flash или HTML-контентом. В некоторых случаях это может не работать, например, при использовании баннеров от внешних поставщиков (adform и т. Д.). Для этого вам может понадобиться немного взломать код.

Как это использовать?

добавьте ваш код SinglePageCall к концу вашего HTML-кодадобавьте этот код под кодом SPC.Примерно через полсекунды ваш код OpenX должен быть готов, а код ниже поместит баннеры в указанные DIV.О, да, вам нужно добавить в свой HTML-код некоторые DIV в качестве заполнителей для ваших баннеров. По умолчанию эти баннеры установлены с CSS-классом «скрытый», который полностью скрывает DIV (с видимостью, отображением и высотой). Затем, после того, как баннер в данном DIV успешно загружен, мы удаляем скрытый класс, и DIV (и баннер внутри) становятся видимыми.

Используйте на свой риск! :) Надеюсь, поможет

(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.&l,t;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();
})();
 pjmorse29 окт. 2010 г., 13:41
Рафа, это пользовательский код что-то вроде этого:jqueryad.web2ajax.fr ? Мы обнаружили это недавно, но еще не реализовали это в качестве теста.
 Gregor Petrin29 окт. 2010 г., 09:01
Не могли бы вы предоставить образец этого пользовательского кода? Я пытался заменить функцию document.write, но у меня были некоторые проблемы с загрузкой содержимого в надлежащие контейнеры, так как у нас есть несколько баннеров на одной странице.
 Rafa23 нояб. 2011 г., 17:45
pjmorse> Я только что понял, что никогда не отвечал на ваш комментарий и просто обновил ответ. Интересно, вы получили какое-то уведомление. Если нет, вот комментарий "ping" / "poke", на всякий случай ... год спустя ;-)

Ваш ответ на вопрос