Czy można użyć asynchronicznego programu Google AdSense, tzn. Nieblokującego?

Odpowiedzi:

6

to robi:

<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> 

zobacz ten element blogu „ Google Ads Async (asynchroniczny) ” w zasadzie znalazłem sposób, aby kod reklamy działał naprawdę asynchronicznie.

Figment Engine
źródło
1
+1 za inteligentne rozwiązanie podane w łączu. To bardzo ciekawe, jak tworzy kopię zapasową standardu document.write functioni przywraca go później. Jedynym minusem jest to, że zastanawiam się, czy Google Adsense TOS pozwala robić takie rzeczy?
Marco Demaio,
+1 za pomysł, biorę go i sprawiam, że działa trochę lepiej, i zamieszczam go tutaj. Nie mogę sprawić, by ta GS_googleAddAdSenseService działała z innym pomysłem.
Aristos
5

Tak, istnieje sposób - użycie iframe. Wykonujemy asynchroniczne ładowanie treści reklam na jednej z witryn naszych klientów.

Najpierw musisz skontaktować się z Google, aby uzyskać wsparcie dla ich reklam w elementach iframe (które nie były powszechnie dostępne, gdy budowaliśmy tę witrynę). Następnie możesz użyć JavaScript, aby uruchomić ładowanie treści iframe AdSense, co właśnie robimy.

Rozwiązanie jest naprawdę proste, gdy masz obsługę iframe firmy Google.

Edycja: Wygląda na to - z postów wymienionych przez Virtuosi Media - ta praktyka może nie być mile widziana przez Google ...

Edycja 2: To jest kod, którego używamy w ramce iframe. Wypróbuj, aby sprawdzić, czy to działa, może nawet bez wyraźnego pytania Google o wsparcie. Usunięto type="text/javascript" language="JavaScript"dla lepszej czytelności:

<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>

Wszystkie boksy wypełniamy za pomocą identyfikatorów reklam, więc nie widzimy żadnych umów PSA.

Oliver
źródło
1
Czy możesz podać więcej szczegółów na temat kontaktowania się z Google w tej sprawie? Nie widzę nic na ten temat na moim koncie AdSense.
Virtuosi Media
Byłbym również ciekawy, czy jednostki reklamowe nadal wyświetlają trafne reklamy lub tylko reklamy PSA i jak obejrzałeś ten problem.
Virtuosi Media
W rzeczywistości wypełniamy wszystkie nasze boksy za pomocą identyfikatorów boksów reklamowych, więc nie widzimy żadnych umów PSA.
Oliver,
podczas korzystania z tej metody otrzymuję błąd GA_googleFillSlotWithSize nie jest zdefiniowany
Timo Huovinen
@YuriKolovsky: wygląda na to, że skrypt Google nie ładuje się poprawnie. Zobacz moją Edycję 2: może być konieczne zastosowanie tej metody w Google.
Oliver,
2

O ile mi wiadomo, obecnie nie oferują tej opcji. Najlepszą opcją, jeśli zezwala na to Google TOS, byłoby użycie elementu zastępczego i dynamiczne zastąpienie go JavaScript po załadowaniu strony. Wygląda jednak na to, że może być sprzeczne z TOS. Zobacz ten wątek, aby uzyskać więcej informacji.

Virtuosi Media
źródło
2

Możesz użyć symbolu zastępczego, wywołać kod AdSense, a następnie zamienić symbol zastępczy na reklamę. Używam czegoś takiego na mojej stronie:

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

Google zaleca nawet to zrobić, gdy mówią, że w kodzie HTML powinna znajdować się najważniejsza pozycja reklamy. Jeśli chcesz to osiągnąć, musisz użyć JS lub CSS, aby przenieść mniej ważne jednostki reklamowe na (wizualną) górę strony.

Ale o ile wiem, AdSense już wyświetla reklamy asynchronicznie. Bardzo rzadko widziałem, jak blokuje ładowanie stron. Nie jestem tego jednak pewien.


źródło
0

Ponieważ Google mówi „pozwala nam przyspieszyć Internet”, zmieniam powyższy kod, aby ładować reklamy Google tylko wtedy, gdy są widoczne. Kod działa „tak jak jest” tylko w przypadku jednej reklamy miejsca w Google, ale myślę, że można łatwo go zmodyfikować, aby wyświetlać więcej reklam. Inne z innym kodem są

  • Ładuj reklamy tylko wtedy, gdy są widoczne dla użytkownika
  • Ładuje reklamy i umieszcza je na div (nie na końcu strony)
  • Działa ze wszystkimi przeglądarkami, ponieważ ładuję wszystkie potrzebne elementy (nie tylko pierwsze)

Począwszy od tego div, że umieszczam reklamy później.

<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>

Testowałem to i pracuję ze wszystkimi przeglądarkami, po prostu używam jQuery, aby być bardziej bezpiecznym niż to, że unikam trudnych przeglądarek.

ps, zrobiłem podobny kod, aby załadować google plus, facebook i wszystkie te elementy, które ładują się bez powodu przez większość czasu.

Arystos
źródło
0

Nie ma takiej potrzeby. Show_ads.js Google AdSense jest teraz nieco asynchroniczny. Możesz przeczytać więcej o krwawych szczegółach na oficjalnym blogu:

Twoja sieć, pół sekundy wcześniej

Nie ma potrzeby zmiany kodu reklamy.

Salman A.
źródło