【问题标题】:How do i detect served ad dimensions如何检测投放的广告尺寸
【发布时间】:2012-09-04 16:24:33
【问题描述】:

我目前正在使用带有 DFP 的 google 发布商代码向一个很快就会响应的网站投放广告。我们有一个特定的广告位,它可以提供 2 个可能的宽度,728 或 960,根据提供的宽度,我想将广告呈现在导航上方或下方。

因此,显而易见的第一个问题是,这是否有点理智,而且是否可能?我怀疑我应该定义两个不同的广告位。

虽然可能更多的是学术问题,但主要问题是如何检测已投放的广告的尺寸?我怀疑这个解决方案对于广告平台来说是不可知的,因为我基本上检测到节点插入,然后检查容器元素的尺寸。

我一直在试验 DOMNodeInserted javascript 事件,但它似乎触发了所有“但”广告。我对此感到困惑,除非 gpt 以不会触发此事件的方式插入广告。

【问题讨论】:

    标签: javascript responsive-design ads google-dfp


    【解决方案1】:

    GPT 进行了更新,可以以更优雅的方式完成此操作。 该事件将告诉您是否返回了广告素材,如果返回了尺寸以及其他信息。

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

    还有 event.isEmpty 会告诉您是否返回了实际的广告素材。

    【讨论】:

    【解决方案2】:

    我以前做过类似的事情...我选择的方法是覆盖内部 DFP 函数 (renderEnded),以便我可以看到广告在屏幕上呈现的位置...

    例如,要获取广告的尺寸,您可以执行以下操作(我只在 chrome 中对此进行了测试,但距离完全跨浏览器应该不会太远):

    <html>
    <head>
        <title>DFP test</title>
    
        <script type='text/javascript'>
            var googletag = googletag || {};
            googletag.cmd = googletag.cmd || [];
            (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);
            })();
        </script>
    
    
        <script type="text/javascript">
            googletag.cmd.push(function() {
                var slot1 = googletag.defineSlot('/12345678/TEST', [266, 115], 'div-gpt-ad-1340819095858-0').addService(googletag.pubads());
    
                slot1.oldRenderEnded = slot1.renderEnded;
                slot1.renderEnded = function(){
                    window.console.log('width: '+document.getElementById('div-gpt-ad-1340819095858-0').getElementsByTagName('iframe')[0].contentWindow.document.width);
                    window.console.log('height: '+document.getElementById('div-gpt-ad-1340819095858-0').getElementsByTagName('iframe')[0].contentWindow.document.height);
                    slot1.oldRenderEnded();
                };
    
                googletag.pubads().enableSingleRequest();
                googletag.enableServices();
            });
        </script>
    
    </head>
    <body>
    
        <div id='div-gpt-ad-1340819095858-0' style='width:266px; height:115px;'>
            <script type='text/javascript'>
                googletag.cmd.push(function() {
                    googletag.display('div-gpt-ad-1340819095858-0');
                });
            </script>
        </div>
    
    </body>
    </html>
    

    这可能不是您所追求的,但覆盖该功能应该可以让您到达您需要的地方...如果您有任何问题,请告诉我。

    【讨论】:

    • 这实际上是我正在寻找的最接近的解决方案。下一步是持续检测广告位内呈现的广告素材的预期宽度。对我们来说,创意可以在 iframe、图像和 Flash 对象之间变化。我发现它们几乎总是有一个我可以阅读的宽度参数。如果容器 div 太小,则检测呈现的宽度似乎有问题,因为广告素材刚刚被水平粉碎。
    • @Matt Cooper - 您是在哪里以及如何发现内部 DFP 函数 renderEnded 的?如果有其他功能我可以覆盖,那就太好了。
    • @umami 我只是通过使用 chrome 检查器查看 googletag 名称空间找到了它。如果您启动检查器并在控制台中输入 googletag ,您将看到 googletag 对象......那里有一些功能,如果您查看 slot_manager_instance 并深入了解各个广告单元,您会发现一大堆其他功能...我稍后发现的另一个 repo 挂钩了内部 dfp 记录器,并且还可以挂钩其他 dfp 功能,您可能会发现这很有趣:github.com/mcountis/dfp-events
    • @Ken 下面的答案现在更正确了,尽管这在当时是正确的答案 - 它也被记录和支持,所以希望将来不会被撤回(而 renderEnded 可能是)
    • 是的@MarkD,你是对的......我的答案现在已经过时,因为 GPT 的新变化 - 很高兴他们终于发布了一个可靠的方法来做到这一点!
    【解决方案3】:

    我在 WiiMusic.net 上使用 Google AdSense 遇到了类似的问题。我最终做的是使用 JavaScript 检测包含广告的 div 的大小,然后加载广告。在这种情况下,一旦加载,就无法更改页面的分辨率或大小,所以这行得通。

    在你的情况下,你的页面当然可以改变大小,什么不能。如果您希望根据您的响应式设计显示不同的广告版本,我认为您将不得不重新加载广告。如果您使用的是异步广告代码,这应该是可能的。

    总而言之,是的,这对于 JavaScript 来说是合理的并且是可能的。无论如何,您的广告都需要 JavaScript 才能正常工作,因此这应该不是太大的障碍。

    【讨论】:

    • 在我的情况下,我实际上需要做相反的事情。我将根据所投放广告的大小调整包含 div 的大小/位置,而不是相反。为了做到这一点,我需要找到一些方法来定义插入广告时的回调。正如我所说,我已经尝试了 DOMNodeInserted 事件,并且我正在尝试使用 DOMSubtreeModified 来检测何时插入广告内容。
    • @sphoid,请原谅我的无知,但我认为 DFP 广告位只能包含一种尺寸? DFP 如何确定为您提供哪种尺寸的广告?根据返回的广告尺寸,您的页面尺寸会有所不同?我认为 DOMNodeInserted 问题是由于投放广告的 iframe 造成的。
    • 您可以在 googletag.defineslot() 中为一个广告位定义多个广告尺寸,用逗号分隔。我这样做主要是为了排行榜广告位,它可以提供整页宽度的横幅以及较窄的居中横幅。我的一些广告不插入 iframe,而是动态生成一个 div 并插入一些脚本标签,如果广告是基于 Flash 的,有时还会插入对象标签。我至少应该能够检测到这些元素何时插入。
    【解决方案4】:

    所以像往常一样,我想太多了。我没有检测到 DOM 更改的原因是因为在我分配事件处理程序时已经插入了广告。当同步加载广告时,我可以立即测量容器 div 的尺寸并获取广告尺寸。异步加载时,我可以通过使用存储原始 html 并轮询更改并在更改发生时测量容器 div 来轮询内部 html 更改。感谢 Brad 抽出宝贵时间。

    【讨论】:

    • 我说得太早了。此解决方案仅适用于容器 div 可以并且将在创意允许时调整大小的情况。我有一个场景,容器 div 无法调整大小,因此创意被水平粉碎,这是我试图避免的问题。我想我需要一种合法的方法来检测广告素材的尺寸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多