我需要在 DFP广告管理系统完成呈现网页上的所有广告后触发一些JavaScript - 或者至少在触发 collapseEmptyDivs 时隐藏广告单元没有订单项。)
是否有人知道在这些事件发生后让DFP触发回调的方法?
答案 0 :(得分:62)
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
答案 1 :(得分:20)
我攻击了googletag的debug_log.log函数并将其推送到jQuery,以便在很多DFP广告管理系统的操作中触发事件。黑客确实需要jQuery。
https://github.com/mcountis/dfp-events
答案 2 :(得分:7)
在页面部分加载脚本:
// 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 publisher标记,最好也在页面部分中填写:
// 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
答案 3 :(得分:1)
查看我正在处理的jQuery DFP扩展程序...它仍然是一项正在进行的工作,但提供了您正在进行的回调。
如何使用它的示例位于this file。
您会看到两个回调可用...每个广告加载后以及加载完所有广告后。还会在广告单元容器元素上设置一个类,可以是display-none(未找到广告时),display-block(找到广告时)或display-original(当没有找到广告时)容器div包含开头的内容,我使用它来过度使用带有广告内容的网站的某些部分(如果需要)。这些类当然有助于在回调中使用一次。
答案 4 :(得分:1)
如果您需要识别特定广告位的渲染端(如果您对多个广告位使用相同的广告素材,则非常有用),您可以执行以下操作
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
}
});
答案 5 :(得分:0)
我非常确定广告素材呈现后DFP广告管理系统不提供回调功能。我使用以下代码来执行此操作。在发生以下任一情况后,它会调用回调函数:
- 广告已加载且iframe已呈现
未加载广告,广告单元被collapseEmptyDivs()
隐藏- 已经过了一定的时间(在这种情况下,2秒),两者都没有发生。 就像连接到DFP时出现某种网络错误一样。
adId将是广告容器的ID
假设您使用的是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);
}
}