Pull to refresh

Показ рекламы Google AdSense, на страницах загружаемых по технологии ajax

Reading time4 min
Views3.2K
Добрый день хабрачитатели. Вчера я наткнулся на неприятный факт, а именно, код AdSense работает только при загрузке страницы. Если же попытаться обработать код AdSense, который находится в данных, которые мы получаем при помощи ajax, то ничего из этого не выйдет (выйдет только ошибка). Подгружаемый скрипт Google, использует document.write, который работает только при загрузке страницы. Но ведь страница уже загружена. И я начал копать…

Для начала я нашел интересную статью про extsrc.js, хорошая, толковая статья, рабочий код. Но он хорош если в подгружаемом контенте только один рекламный блок. Тогда будет работать без проблем. У меня таких рекламных блоков — 2. Почему данный способ будет не рабочим?

Итак, код AdSense размещается так:

Один

&ltscript type="text/javascript"&gt
google_ad_client = "ca-pub-436345435345";
google_ad_slot = "33454355080";
google_ad_width = 728;
google_ad_height = 90;
&lt/script&gt
&ltscript type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt
&lt/script&gt


Два

&ltscript type="text/javascript"&gt
google_ad_client = "ca-pub-436345435345";
google_ad_slot = "3345434255080";
google_ad_width = 728;
google_ad_height = 90;
&lt/script&gt
&ltscript type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt
&lt/script&gt


Скрипт show_ads.js перехватывает переменные, стоящие перед ним (google_ad_client, google_ad_slot и т.д.), обрабатывает, и их обнуляет. А так как код обрабатывается строго по очереди, у show_ads.js каждый раз есть непустые переменные.

Используя extsrc.js, show_ads.js запускается после отрисовки страницы. И первый запуск этого скрипта обрабатывает последние переменные, ведь имена у переменных в коде AdSense одинаковые, и присваиваются сверху вниз. Скрипт отработал, исходя из данных последнего блока, а далее всё обнулил. Покажется только баннер последнего блока, но на месте первого. Запуск остальных скриптов бесмысенен, данных для них нет.

Ну и к тому же, при использовании extsrc.js нужно менять код загрузки скрипта google.

Было: &ltscript type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt&lt/script&gt
Стало: &ltscript type="text/javascript" extsrc="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt&lt/script&gt
Это уже нарушение правил, код менять нельзя.

Но возможно я нашел выход. Копаясь в сети я наткнулся на один проект — writeCapture. Одна из его возможностей, выполнять код JS, в котором присутствует document.write. Причем этот код можно выполнить в указанном блоке. Использовать его очень просто:

$('#ТвойБлок').writeCapture().html('&ltscript src="http://ТвойСкрипт.js"&gt&lt/script&gt');

Ваместо &ltscript src=«ТвойСкрипт.js»&gt&lt/script&gt можно вставить любой код js.

Итак, я получаю данные по ajax. В этих данных, у меня есть блок с кодом AdSense. Допустим это блок id=«Reklama». Полученные данные мы хотим поместить куда нибудь на страницу. Я в основном работаю с jquery, но всякие html, append и т.д. хорошо переносят что угодно, но если в блоке есть код &ltscript type=«text/javascript»&gtчто нибудь&lt/script&gt и мы его поместим с помощью html, append и т.д. то этого кода мы в блоке потом не увидим. Мне непонятно, почему так происходит, может в комментах кто обьяснит? Да и если бы мы его увидели, то этот код сразу же бы сработал, и мы бы получили ошибку о невозможности операции document.write. Я нашел выход, внедряя полученный код конструкцией

document.getElementById('КудаXотимПоместить').innerHTML="полученые данные ajax"

Так код переносится туда куда мы хотим, без всяких изменений, вместе с &ltscript type=«text/javascript»&gtчто нибудь&lt/script&gt, при такой конструкции, тело скрипта не срабатывает.

Наконец самое интересное, делаем так:

$('#Reklama').writeCapture().html($('#Reklama').html());

Баннер появился. Смотрим код, всё как положено, но не хватает перед баннером строчек от самого кода AdSense. Криминального конечно ничего здесь нет, но внесем ради искусства кое какие изменения. Никто же незапрещает использовать вместо html — append.

$('#Reklama').writeCapture().append($('#Reklama').html());

Ура! Видим баннер! Смотрим код html. Код от AdSense как живой.

Но вот оказалось что это ещё не всё. Количество показов баннеров, google заносит в глобальный массив страницы, т.е. своего рода счетчик. Как только счетчик достигает количества больше 3, баннеры перестают показываться. Google, хозяин своего кода и мы его не тронули, раз уж нельзя. А мы хозяева своего кода и браузера. Перед показом баннеров я делаю так:

delete __google_ad_urls;
delete google_iframe_oncopy;
delete google_jobrunner;
delete google_jobrunner;
delete google_persistent_state;
delete google_persistent_state_async;

А в опере надо поболее параметров

delete google_num_ad_slots;
delete google_num_0ad_slots;
delete google_prev_ad_slotnames_by_region;
delete google_unique_id;


Я удаляю так много массивов, только потому, что не до конца разобрал код show_ads.js, поэтому вот так, чтобы наверняка. При последующем показе баннера, эти массивы успешно восстанавливаются.

Хотя можно пройтись по всем переменным и удалить те, где встречается строка «google», но этот способ хорош только для тех у кого на странице реклама, и нет других приблуд от гугля.

Вот например так:
for (var key in window)
{if(key.toLowerCase().indexOf('google')>-1&&key!='google_ad_client'&&key!='google_ad_slot'&&key!='google_ad_width'&&key!='google_ad_height')
{window[key]=undefined;}}

Тут конечно без разбора все объекты перебираются, но если на странице ничего гуглевского нет, кроме баннеров, то вполне себе содойдет. Отмечаю, что я не воспользовался delete window[key], так как ie ниже 9 версии, это кушать не хочет.

Удачи вам, а мне конструктивной критики.
Tags:
Hubs:
Total votes 7: ↑6 and ↓1+5
Comments4

Articles