Last active
March 14, 2021 05:08
-
-
Save itchief/e8ea981f5000e18545aa34b21d249201 to your computer and use it in GitHub Desktop.
Скрипт для динамического добавления AdSense и РСЯ рекламы на сайт
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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