Обратный вызов DFP после рендеринга

Мне нужно активировать JavaScript после того, как DFP завершит показ всех объявлений на странице или, по крайней мере, когда он активирует collapseEmptyDivs (который скрывает рекламные блоки, не содержащие позиций ).

Кто-нибудь знает, как заставить DFP инициировать обратный вызов после любого из этих событий?


person Sp4cecat    schedule 27.06.2012    source источник
comment
В каком направлении вы в итоге пошли с этим? Предполагая, что проблема заключалась в том, что вы пытались предотвратить мигание пустого рекламного места, вызванное коллапсомEmptyDivs?   -  person Brian Wigginton    schedule 29.07.2013
comment
Я нашел решение проблемы, о которой говорил ранее: stackoverflow.com/a/17931853/105061   -  person Brian Wigginton    schedule 29.07.2013


Ответы (6)


GPT API теперь имеет обратный вызов, который запускается после заполнения каждого слота.

Например:

googletag.pubads().addEventListener('slotRenderEnded', function(event) {
 console.log('Creative with id: ' + event.creativeId +
  ' is rendered to slot of size: ' + event.size[0] + 'x' + event.size[1]);
});

См. https://developers.google.com/doubleclick-gpt/reference#googletag.events.SlotRenderEndedEvent

person z12345    schedule 01.04.2014
comment
Следует отметить, что slotRenderEnded запускается после того, как объявление, возвращенное из DFP/AdX, записано на страницу. Если в креативе есть дополнительные ресурсы, они, скорее всего, еще не будут обработаны. - person mmilleruva; 23.05.2018
comment
@mmilleruva или кто-нибудь, есть ли способ узнать, когда все креативы загрузились? Я предполагаю, что нет, но просто ищу подтверждение - person Scott Leonard; 17.08.2020

Я взломал функцию debug_log.log googletag и отправил ее через jQuery, чтобы запускать события для многих действий DFP. Для взлома требуется jQuery.

https://github.com/mcountis/dfp-events

  • gpt-google_js_loaded
  • gpt-gpt_fetch
  • gpt-gpt_fetched
  • gpt-page_load_complete
  • gpt-queue_start
  • gpt-service_add_slot
  • gpt-service_add_targeting
  • gpt-service_collapse_containers_enable
  • gpt-service_create
  • gpt-service_single_request_mode_enable
  • gpt-slot_create
  • gpt-slot_add_targeting
  • gpt-slot_fill
  • gpt-slot_fetch
  • gpt-slot_receive
  • gpt-slot_render_delay
  • gpt-slot_rendering
  • gpt-slot_rendered
person Countis    schedule 12.12.2012
comment
Вышеупомянутая реализация, в которой вы проверяете, не существует ли объявление, проверяя дочерние элементы первого отображаемого iframe, может не работать каждый раз. Например, стороннее объявление, такое как sharethrough, не отображает рекламу в iframe, а как простой контейнер div. Вышеупомянутая реализация потерпит неудачу в этом случае. Зайдите сюда, чтобы просмотреть общий доступ и посмотреть, как он отображается.imm.io/1kPqP - person agaase; 25.11.2013
comment
Хороший код. Хотелось бы, чтобы были какие-то комментарии, объясняющие, что именно вы делаете, чтобы заставить их стрелять. Код кажется достаточно простым, но я не совсем понимаю, откуда берутся эти идентификационные номера. Я предполагаю, что именно так они скомпилированы в минимизированном выводе DFP? Если да, то как вы остаетесь в курсе изменений? - person Brad; 26.02.2014

Загрузите скрипт в часть вашей страницы:

// set global variable if not already set
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];

// load asynchronously the GPT JavaScript library used by DFP,
// using SSL/HTTPS if necessary
(function() {
  var gads   = document.createElement('script');
  gads.async = true;
  gads.type  = 'text/javascript';

  var useSSL = 'https:' === document.location.protocol;
  gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';
  var node =document.getElementsByTagName('script')[0];
  node.parentNode.insertBefore(gads, node);
})();

Инициализируйте тег издателя Google следующим скриптом, желательно также в разделе вашей страницы:

// can be moved as well in the body
// if using async mode, wrap all the javascript into googletag.cmd.push!
googletag.cmd.push(function() {
  // set page-level attributes for ad slots that serve AdSense
  googletag.pubads().set("adsense_background_color", "FFFFFF");
  googletag.pubads().setTargeting("topic","basketball");

  // enables Single Request Architecture (SRA)
  googletag.pubads().enableSingleRequest();

  // Disable initial load, we will use refresh() to fetch ads.
  // Calling this function means that display() calls just
  // register the slot as ready, but do not fetch ads for it.
  googletag.pubads().disableInitialLoad();

  // Collapses empty div elements on a page when there is no ad content to display.
  googletag.pubads().collapseEmptyDivs();

  // Enables all GPT services that have been defined for ad slots on the page.
  googletag.enableServices();
});

Регистрируйте слоты по отдельности (можно создать с помощью цикла foreach) и визуализируйте их. Слушатель событий также может быть зарегистрирован для каждого слота. Здесь важная часть: убедитесь, что вы обновляете их вместе, чтобы избежать появления одной и той же рекламы на обоих слотах (если реклама назначена на оба слота) => googletag.pubads().refresh([slot1, slot2]]) ;

// this code can be moved externally to improve performance
googletag.cmd.push(function() {
  // define slot1
  slot1 = googletag.defineSlot(
    "/1234/travel/asia/food",
    [728, 90],
    "banner1"
  )
  .addService(googletag.pubads())
  .setTargeting(
    "interests",
    ["sports", "music", "movies"]
  );
  // prerender the slot but don't display it because of disableInitialLoad()
  googletag.display("banner1");

  // define slot2    
  slot2 = googletag.defineSlot(
    "/1234/travel/asia/food",
    [[468, 60], [728, 90], [300, 250]],
    "banner2"
  )
  .addService(googletag.pubads())
  .setTargeting("gender", "male")
  .setTargeting("age", "20-30");

  // prerender the slot but don't display it because of disableInitialLoad()
  googletag.display("banner2");  


  // add event to sign the slot as redered or not
  googletag.pubads().addEventListener('slotRenderEnded', function(event) {
    if (event.slot === slot1 || event.slot === slot2) {
      // do something related to the slot
    }
  });

  // refresh all container ads and show them
  // very important to call refresh with an array to avoid 
  // multiple callback to the registered event 
  googletag.pubads().refresh([slot1, slot2]);
});
<div id="banner1" style="width:300px; height:250px;"></div>

<div id="banner2" style="width:300px; height:250px;"></div>

После отображения объявления срабатывает обратный вызов.

Для получения дополнительной информации просмотрите этот файл: https://github.com/davidecantoni/googletag.

person Spidi    schedule 21.08.2015
comment
@kleopatra спасибо за отзыв! Я торопился... позор мне :) - person Spidi; 22.08.2015

Я почти уверен, что DFP не обеспечивает обратный вызов после отображения объявления. Для этого я использовал следующий код. Он вызывает функцию обратного вызова после того, как произошло одно из следующих событий:

-Объявление загрузилось, и iframe отобразился

-Объявление не было загружено, а рекламный блок был скрыт с помощью функции convertEmptyDivs().

- Прошло определенное количество времени (в данном случае 2 секунды), и ничего не произошло. Например, если произошла какая-то сетевая ошибка при подключении к DFP.

adId будет идентификатором вашего рекламного контейнера.

предполагает, что вы используете jQuery

function callback() {
   //your callback function - do something here
}

function getIframeHtml(iframe) {
   if(iframe.contentWindow && iframe.contentWindow.document && iframe.contentWindow.document.body && iframe.contentWindow.document.body.innerHTML) {
       return iframe.contentWindow.document.body.innerHTML;
   }
   return null;
}

var dfpNumChecks = 20;
var dfpCheckCount = 0;
var dfpCheckTimer = 100;

function dfpLoadCheck(adId) {
   var nodes = document.getElementById(adId).childNodes;

   if(nodes.length && nodes[0].nodeName.toLowerCase() == 'iframe' && getIframeHtml(nodes[0])) {
       //the iframe for the ad has rendered
       callback();
       return;
   } else if($('#' + adId).css('display') == 'none' || (dfpCheckCount >= dfpNumChecks)) {
       //the ad unit has been hidden by collapseEmptyDivs()
       callback();
       return;
   } else {
       dfpCheckCount++;
       setTimeout(function() { dfpLoadCheck(adId) }, dfpCheckTimer); 
   }
} 
person alexp    schedule 13.07.2012


Если вам нужно определить конец рендеринга определенного слота (полезно, если вы используете одно и то же объявление для нескольких слотов), вы можете сделать следующее.

googleAd =  googletag.defineSlot('/xxxxx/web_top_AAAxAAA', [xxx, xxx], 'div-id').addService(googletag.pubads());    


googletag.pubads().addEventListener('slotRenderEnded', function(event) {
                    if( event.slot.W == googleAd.W ){
                        // your code here
                    }
                });
person Aman Verma    schedule 26.04.2016