Можно ли использовать асинхронный Google AdSense, то есть неблокировать?

Ответы:

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 (асинхронный) ", в основном я нашел способ заставить рекламный код работать действительно асинхронно.

FigmentEngine
источник
1
+1 за умное решение, представленное в ссылке. Очень интересно, как он выполняет резервное копирование стандарта document.write functionи восстанавливает его позже. Единственным недостатком является то, что мне интересно, если Google Adsense TOS позволяет делать такие вещи?
Марко Демайо
+1 за идею, я беру это и заставляю это работать немного лучше и публикую это здесь. Я не могу заставить этот GS_googleAddAdSenseService работать с другой идеей.
Аристос
5

Да, есть способ - использование фреймов. Мы делаем асинхронную загрузку рекламного контента на одном из сайтов наших клиентов.

Сначала вы должны связаться с Google для поддержки их рекламы в iframes (которые не были широко доступны, когда мы создавали этот сайт). Затем вы можете использовать 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>

Мы заполняем все наши слоты с помощью идентификаторов рекламных блоков, поэтому не видим никаких СРП.

Оливер
источник
1
Можете ли вы предоставить более подробную информацию о том, как связаться с Google по этому поводу? Я ничего не вижу в моем аккаунте AdSense.
Virtuosi Media
Кроме того, мне было бы любопытно узнать, по-прежнему ли в рекламных блоках показываются релевантные объявления или только рекламные ролики, и как вы решили эту проблему.
Virtuosi Media
На самом деле, мы заполняем все наши слоты с помощью идентификаторов рекламных блоков, поэтому мы не видим никаких СРП.
Оливер
при использовании этого метода я получаю GA_googleFillSlotWithSize не определена ошибка
Тимо Хуовинен
@YuriKolovsky: похоже, скрипт Google не загружается должным образом. См. Мой Edit 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 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 и все те элементы, которые загружаются без причины большую часть времени.

Аристос
источник
0

Больше нет необходимости делать это. Show_ads.js в Google AdSense теперь несколько асинхронный. Вы можете прочитать больше о кровавых подробностях в официальном блоге:

Ваш веб, полсекунды рано

Нет необходимости менять рекламный код.

Салман А
источник