DFP post-rendering callback

后端 未结 6 1714
谎友^
谎友^ 2021-01-31 04:04

I need to trigger some JavaScript after DFP has finished rendering all the ads on the page - or at least when it has triggered collapseEmptyDivs (which

6条回答
  •  隐瞒了意图╮
    2021-01-31 04:27

    Load script in the part of your page:

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

    Initialise google publisher tag with the following script, preferable as well in the section of your page:

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

    Register slots individually (can be generated with a foreach loop) and render them. The event listener can be registered as well per slot. Here the important part: make sure that you refresh them together to avoid ending up with the same ads on both slots (if the ad is assign to both slots) => 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]);
    });
    

    After the ad has been rendered, the callback gets triggered.

    For more information have a look on this file: https://github.com/davidecantoni/googletag

提交回复
热议问题