是否可以使用异步Google Adsense,即非阻塞?


Answers:


6

做到了:

<script type="text/javascript"><!--
// dynamically Load Ads out-of-band
setTimeout((function ()
{
    // placeholder for ads
        var eleAds = document.createElement("ads");  
        // dynamic script element
        var eleScript = document.createElement("script");  
        // remember the implementation of document.write function
        w = document.write;
        // override and replace with our version
        document.write = (function(params)
        {
        // replace our placeholder with real ads
        eleAds.innerHTML = params;
        // put the old implementation back in place
        // Aristos, add this check because called more than ones
        //  and ends, with this symbol.
        if(params.indexOf("</ins>") != -1)
            document.write=w;
        });
        // setup the ads script element
        eleScript.setAttribute("type", "text/javascript");
        eleScript.setAttribute("src", "http://pagead2.googlesyndication.com/pagead/show_ads.js");
        // add the two elements, causing the ads script to run
        document.body.appendChild(eleAds);              
        document.body.appendChild(eleScript);           
}), 1);
                //-->
        </script> 

看到这个博客文章“ Google Ads Async(asynchronous) ”,基本上我已经找到了一种使广告代码真正运行的方法。


1
+1为链接中提供的智能解决方案。备份标准document.write function并在以后还原它的方式非常有趣。唯一的缺点是我想知道Google Adsense TOS是否允许执行此类操作?
Marco Demaio 2011年

为这个想法+1,我接受了它,并使它工作得更好,然后将其发布在这里。我无法使GS_googleAddAdSenseService与其他想法一起使用。
亚里士多德(Aristos)2012年

5

是的,有一种方法-使用iframe。我们在客户的网站之一上异步加载广告内容。

首先,您必须与Google联系以获取iframe中广告支持的支持(当我们建立该网站时,这种支持并不广泛)。然后,您可以使用JavaScript触发AdSense iframe内容的加载,这就是我们要做的。

一旦有了Google的iframe支持,该解决方案便非常简单。

编辑:看起来-从Virtuosi Media引用的帖子中-Google可能不欢迎这种做法...

编辑2: 这是我们在iframe中使用的代码。尝试尝试一下是否可行,甚至无需特别向Google寻求支持。删除type="text/javascript" language="JavaScript"以提高可读性:

<head runat="server">
    <script src="http://partner.googleadservices.com/gampad/google_service.js">
    </script>

    <script>
        GS_googleAddAdSenseService("ca-pub-YOURKEY");
        GS_googleEnableAllServices();
    </script>

    <!-- For this method, it is not necessary to define the slots in advance 
         and we do not use the FetchAds function -->
    <script>
        GA_googleUseIframeRendering(true);    //<%-- This indicates iframe rendering for all slots --%>
    </script>
</head>
<body>
    <form id="formAd" runat="server">
        <div>
            <script>
                GA_googleFillSlotWithSize("ca-pub-YOURKEY", "AdSlotId",
                                          iframeWidth, iframeHeight);
            </script>
        </div>
    </form>
</body>

我们通过adslot ID填充了所有广告位,因此看不到任何PSA。


1
您能否提供有关与Google联系的更多详细信息?我的AdSense帐户中没有任何相关信息。
Virtuosi Media

另外,我很想知道广告单元是否仍然投放相关广告或仅投放PSA,以及您如何解决该问题。
维塔士媒体

实际上,我们通过adslot ID填充了所有广告位,因此看不到任何PSA。
奥利弗

使用这种方法时,我得到GA_googleFillSlotWithSize未定义错误
Timo Huovinen

@YuriKolovsky:看起来Google的脚本未正确加载。请参阅我的修改2:您可能需要向Google申请此方法。
奥利弗·

2

据我所知,他们目前不提供该选项。如果Google TOS允许,最好的选择是使用一个占位符元素,并在页面加载后用JavaScript动态替换它。但是,似乎似乎违反了TOS。有关更多详细信息,请参见此线程


2

您可以使用占位符,调用Adsense代码,然后将占位符与广告一起切换。我在网站上使用的是这样的内容:

if ( ad1 = document.getElementById('ad-top') )
{
    ad2 = document.getElementById('banner_tmp468');
    ad1.appendChild(ad2);
    ad2.style.display = 'block';
}

Google甚至建议这样做,因为他们说您应该在HTML代码中首先拥有最重要的广告位置。如果要完成此操作,则必须使用JS或CSS将不太重要的广告单元移动到页面的(视觉)顶部。

但是据我所知,AdSense已经异步呈现广告。我只很少看到它阻止页面加载。虽然不确定。


0

因为Google说“让网络更快”,所以我将上面的代码更改为仅在可见时加载google广告。该代码仅适用于一个Google地方广告“按原样”工作,但是我认为您可以轻松修改它以用于更多广告。与其他代码的不同之处在于

  • 仅在用户可见的情况下加载广告
  • 加载广告并将其放置在div上(不在页面末尾)
  • 适用于所有浏览器,因为我加载了所有需要的项目(不仅是第一个)

首先div,我稍后放置广告。

<div id="adSpot" ></div>

<script type="text/javascript">
    // load the script with cache
    function getScriptCcd(url, callback)
    {
        jQuery.ajax({
                type: "GET",
                url: url,
                success: callback,
                dataType: "script",
                cache: true
        });
    };

    // to unbind the scroll I keep the total binds of scroll
    // in this example I have only one.
    var cPosaScrollExo = 0;
    // bind the scrool to monitor if ads are visible    
    function addThisScroll(RunThisFunction)
    {
        jQuery(window).scroll(RunThisFunction);
        cPosaScrollExo++;
    }
    // unbind all scroll if all they not needed any more
    function unBindScroll()
    {
        cPosaScrollExo--;

        if(cPosaScrollExo <= 0)
        {
            cPosaScrollExo = 0;
            jQuery(window).unbind('scroll');
        }
    }

    // here I check if the element is visible to the user with a 100pixel advanced.
    function isScrolledOnMatia(pioSimio) 
    {
        var SimioPouTheloNaFenete = (jQuery(pioSimio).offset().top - 100 );
        var scrollPosition = jQuery(window).height() + jQuery(window).scrollTop();

        return (scrollPosition >= SimioPouTheloNaFenete );
    }   

    // the ads informations
    google_ad_client = "pub-XXXXXXXXXXXXXXX";
    google_ad_slot = "XXXXX";
    google_ad_width = 468;
    google_ad_height = 60;

    var GoogleIsVisible = false;
    // we call this function on every window scroll
    function CheckAdsVisibility()
    {
        if(!GoogleIsVisible)
        {
            if(isScrolledOnMatia("#adSpot"))
            {
                unBindScroll();
                GoogleIsVisible = true;

                            // finally I go to show the ads
                LoadAdsLater();
            }
        }
    }

    // here is a modification of the function that load the ads
    function LoadAdsLater()
    {
        try
        {
                    // Aristos: nice trick here 
            // remember the implementation of document.write function
            w = document.write;

            // override and replace with our version
            document.write = (function(params)
            {
                jQuery("#adSpot").append(params);

                // put the old implementation back in place when
                            //  all writes are finish
                if(params.indexOf("</ins>") != -1)
                    document.write=w;
            });             

            // loading script
            getScriptCcd("http://pagead2.googlesyndication.com/pagead/show_ads.js");
        }
        catch(e)
        {
            // check for errors on debug
        }
    }

    // and here we setup the hole thin
    jQuery(document).ready(function() 
    {       
            // check if all ready is visible !
        CheckAdsVisibility();
            // bind the scroll
        addThisScroll(CheckAdsVisibility);
    });
</script>

我已经对其进行了测试,并且可以与所有浏览器一起使用,但我只是使用jQuery来提高安全性,因此避免了浏览器的麻烦。

ps,我已经做了类似的代码来加载google plus,facebook和所有大多数原因加载的项目。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.