Skip to content

Instantly share code, notes, and snippets.

@itchief
Last active March 14, 2021 05:08
Show Gist options
  • Save itchief/e8ea981f5000e18545aa34b21d249201 to your computer and use it in GitHub Desktop.
Save itchief/e8ea981f5000e18545aa34b21d249201 to your computer and use it in GitHub Desktop.
Скрипт для динамического добавления AdSense и РСЯ рекламы на сайт
(function () {
// функция для создания элемента, который в дальнейшем будет использоваться сервисами AdSense и РСЯ для размещения в нём рекламы
function createAd(id, className) {
var hasYandex = className === 'adsbyyandex';
var tag = hasYandex ? 'div' : 'ins';
var $element = document.createElement(tag);
$element.className = className;
if (hasYandex) {
$element.id = id;
} else {
$element.style.display = 'block';
$element.dataset.adClient = adClientByGoogle;
$element.dataset.adSlot = id;
$element.dataset.adFormat = adFormatByGoogle;
$element.dataset.fullWidthResponsive = fullWidthResponsiveByGoogle;
}
$element.style.marginTop = '15px';
$element.style.marginBottom = '15px';
return $element;
}
// функция для вставки элемента (рекламного блока) после указанного элемента
function insertAdAfterElement(id, className, selector, index, media) {
if (!window.matchMedia(media).matches && media !== undefined) {
return;
}
var $ad = createAd(id, className);
var $elements = document.querySelectorAll(selector);
if ($elements.length > index) {
$elements[index].parentNode.insertBefore($ad, $elements[index].nextSibling);
}
}
// функция для вставки элементов (рекламных блоков) через каждые n-символов
function insertAdsAfterNChars(ads, selector, nChars, media) {
var accumChars = 0; // накопленное количество символов
var accumTotalChars = 0; // итоговое накопленное количество символов
var totalChars = 0; // всего символов
var indexAd = 0; // текущий индекс рекламного объявления
var $elements = document.querySelectorAll(selector);
if (!window.matchMedia(media).matches && media !== undefined) {
return;
}
for (var i = 0, length = $elements.length; i < length; i++) {
totalChars += $elements[i].textContent.length;
}
for (var i = 0, length = $elements.length; i < length; i++) {
var numberChars = $elements[i].textContent.length;
accumChars += numberChars;
accumTotalChars += numberChars;
if (accumTotalChars + nChars >= totalChars) {
break;
}
if (accumChars >= nChars) {
if (indexAd >= ads.length) {
break;
}
var $ad = createAd(ads[indexAd].id, ads[indexAd].className);
$elements[i].parentNode.insertBefore($ad, $elements[i].nextSibling);
accumChars = 0;
indexAd++;
}
}
}
// функция для инициализации рекламы
function initAds() {
// РСЯ
var $ads = document.querySelectorAll('.adsbyyandex');
for (var i = 0, length = $ads.length; i < length; i++) {
(function (w, d, n, adId, s, t) {
w[n] = w[n] || [];
w[n].push(function () {
Ya.Context.AdvManager.render({
blockId: adId.slice(11),
renderTo: adId,
async: true,
});
});
t = d.getElementsByTagName('script')[0];
s = d.createElement('script');
s.src = '//an.yandex.ru/system/context.js';
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, 'yandexContextAsyncCallbacks', $ads[i].id);
}
// AdSense
$ads = document.querySelectorAll('.adsbygoogle');
for (var i = 0, length = $ads.length; i < length; i++) {
(adsbygoogle = window.adsbygoogle || []).push({});
}
if ($ads.length) {
// загрузка adsbygoogle.js
var s = document.createElement('script');
s.src = '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
s.async = true;
document.head.appendChild(s);
}
}
// настройки Google Ad
var adClientByGoogle = 'ca-pub-xxxxxxxxxxxxxxxx';
var adFormatByGoogle = 'auto';
var fullWidthResponsiveByGoogle = 'true';
document.addEventListener('DOMContentLoaded', function () {
// вставим РСЯ блок после 2 параграфа, расположенного в article (max-width: 575px)
insertAdAfterElement(
'yandex_rtb_R-A-xxxxxx-x',
'adsbyyandex',
'article p',
1,
'(max-width: 575px)'
);
// вставим РСЯ блок после 2 параграфа, расположенного в article (min-width: 576px)
insertAdAfterElement(
'yandex_rtb_R-A-xxxxxx-x',
'adsbyyandex',
'article p',
1,
'(min-width: 576px)'
);
// вставим через каждые 2500 символов рекламу
insertAdsAfterNChars(
[
{ className: 'adsbyyandex', id: 'yandex_rtb_R-A-xxxxxx-x' },
{ className: 'adsbygoogle', id: 'xxxxxxxxxx' },
{ className: 'adsbyyandex', id: 'yandex_rtb_R-A-xxxxxx-x' },
],
'article p',
1500
);
// вставим рекламный блок AdSense в aside после 4 элемента div, расположенного в нём
insertAdAfterElement('xxxxxxxxxx', 'adsbygoogle', 'aside>div', 3, '(min-width: 992px)');
// выполним инициализацию
initAds();
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment