9

私は現在、DFPでGoogleパブリッシャータグを使用して、間もなくレスポンシブになるサイトに広告を配信しています。728または960の2つの潜在的な幅を提供できる可能性のある、特定の広告スロットが1つあります。提供される幅に応じて、ナビゲーションの上または下に広告を表示します。

したがって、明らかな最初の質問は、これがリモートでさえ正気であるかどうかであり、さらにそれは可能ですか?おそらく2つの異なる広告スロットを定義する必要があると思います。

おそらくもっと学術的な質問であるが、主な質問は、配信された広告のサイズをどのように検出できるかということです。基本的にノードの挿入が検出され、コンテナ要素のサイズが検査されるため、これに対する解決策は広告プラットフォームに依存しないと思われます。

私はDOMNodeInsertedjavascriptイベントを試してきましたが、すべての広告に対して「しかし」トリガーされるようです。gptがこのイベントをトリガーしない方法で広告を挿入しない限り、私はこれに混乱しています。

4

4 に答える 4

12

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もあります。

于 2014-04-17T17:52:38.740 に答える
4

私は以前にこのようなことをしたことがあります...そして私が決めた方法は、内部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>

それはあなたが求めているものではないかもしれませんが、その関数をオーバーライドすると、必要な場所に到達できるはずです...ご不明な点がありましたらお知らせください。

于 2012-09-12T08:48:19.480 に答える
0

私はGoogleAdSenseでWiiMusic.netで同様の問題を抱えていました。最終的には、JavaScriptを使用して広告を含むdivのサイズを検出し、広告をロードしました。この状況では、一度ロードしたページの解像度やサイズを変更することはできなかったので、これは機能しました。

あなたの状況では、あなたのページは確かにサイズを変えることができます。レスポンシブデザインに応じて異なる広告バージョンを表示したい場合は、その時点で広告を再読み込みする必要があると思います。非同期広告コードを使用している場合、これは可能であるはずです。

要約すると、はい、これは正気で、JavaScriptで可能です。とにかく広告が機能するにはJavaScriptが必要なので、これはそれほど大きな障壁にはなりません。

于 2012-09-11T17:24:38.070 に答える
0

いつものように、私はこれを考えすぎていました。DOMの変更を検出しなかった理由は、イベントハンドラーを割り当てた時点で広告が既に挿入されていたためです。広告を同期的に読み込むと、コンテナdivのサイズをすぐに測定して、広告のサイズを取得できます。非同期でロードする場合、変更を使用してポーリングし、変更が発生したときにコンテナdivの測定を行うことで、元のhtmlを保存し、内部htmlの変更をポーリングできます。ブラッド、ありがとうございました。

于 2012-09-11T18:09:05.287 に答える