1/** 2 * СиÑÑема оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑмоÑÑов ÑекламнÑÑ Ð±Ð°Ð½Ð½ÐµÑов Ñ ERID 3 * ÐоддеÑживаеÑ: 4 * - Swiper ÑлайдеÑÑ (Ð³Ð»Ð°Ð²Ð½Ð°Ñ ÑÑÑаниÑа) 5 * - Slick ÑлайдеÑÑ (инÑеÑнеÑ-магазин) 6 * - СÑаÑиÑеÑкие блоки (ÑпиÑок новоÑÑей) 7 * - AJAX подгÑÑÐ·ÐºÑ ÐºÐ¾Ð½ÑенÑа 8 */ 9 10(function() { 11 'use strict'; 12 13 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑпÑавки пÑоÑмоÑÑа на ÑеÑÐ²ÐµÑ 14 function trackAdView(erid) { 15 console.log('[AdViewsTracker] trackAdView вÑзван Ñ erid:', erid); 16 17 if (!erid || erid.trim() === '') { 18 console.warn('[AdViewsTracker] ERID пÑÑÑой или не Ñказан:', erid); 19 return; 20 } 21 22 // ÐÑовеÑÑем, не бÑл ли Ñже заÑÑиÑан пÑоÑмоÑÑ Ð´Ð»Ñ ÑÑого erid в ÑекÑÑей ÑеÑÑии 23 const sessionKey = 'tracked_erid_' + erid; 24 if (sessionStorage.getItem(sessionKey)) { 25 console.log('[AdViewsTracker] ÐÑоÑмоÑÑ Ð´Ð»Ñ ERID Ñже заÑÑиÑан в ÑÑой ÑеÑÑии:', erid); 26 return; 27 } 28 29 console.log('[AdViewsTracker] ÐÑпÑавка запÑоÑа на ÑеÑÐ²ÐµÑ Ð´Ð»Ñ ERID:', erid); 30 31 // ÐÑпÑавлÑем запÑÐ¾Ñ Ð½Ð° ÑеÑÐ²ÐµÑ 32 fetch('/forms/track-ad-view/', { 33 method: 'POST', 34 headers: { 35 'Content-Type': 'application/json', 36 'X-Requested-With': 'XMLHttpRequest' 37 }, 38 body: JSON.stringify({ 39 erid: erid 40 }) 41 }) 42 .then(response => { 43 console.log('[AdViewsTracker] ÐÑÐ²ÐµÑ ÑеÑвеÑа полÑÑен:', response.status, response.statusText); 44 return response.json(); 45 }) 46 .then(data => { 47 console.log('[AdViewsTracker] ÐаннÑе Ð¾Ñ ÑеÑвеÑа:', data); 48 if (data.success) { 49 // Ð¡Ð¾Ñ ÑанÑем в sessionStorage, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑÑиÑаÑÑ Ð¿Ð¾Ð²ÑоÑнÑе пÑоÑмоÑÑÑ 50 sessionStorage.setItem(sessionKey, '1'); 51 console.log('[AdViewsTracker] ÐÑоÑмоÑÑ ÑÑпеÑно заÑÑиÑан Ð´Ð»Ñ ERID:', erid); 52 } else { 53 console.error('[AdViewsTracker] СеÑÐ²ÐµÑ Ð²ÐµÑнÑл оÑибкÑ:', data.message || 'ÐеизвеÑÑÐ½Ð°Ñ Ð¾Ñибка'); 54 } 55 }) 56 .catch(error => { 57 console.error('[AdViewsTracker] ÐÑибка пÑи оÑпÑавке пÑоÑмоÑÑа:', error); 58 }); 59 } 60 61 // ÐлобалÑнÑй обÑÐµÐºÑ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ observer 62 let adObserver = null; 63 64 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÐµÑ ÑекламнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² 65 function initAdTracking(container) { 66 // ÐÑли конÑÐµÐ¹Ð½ÐµÑ Ð½Ðµ Ñказан, иÑполÑзÑем document 67 const searchContainer = container || document; 68 69 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑекламнÑе блоки, коÑоÑÑе еÑе не оÑÑлеживаÑÑÑÑ 70 const adBlocks = searchContainer.querySelectorAll('.reklama-block:not([data-tracked])'); 71 console.log('[AdViewsTracker] Ðайдено .reklama-block ÑлеменÑов:', adBlocks.length); 72 73 // Также Ð½Ð°Ñ Ð¾Ð´Ð¸Ð¼ блоки Ñ ÐºÐ»Ð°ÑÑом .tooltip.advert (инÑеÑнеÑ-магазин) 74 const tooltipAdverts = searchContainer.querySelectorAll('.tooltip.advert:not([data-tracked])'); 75 console.log('[AdViewsTracker] Ðайдено .tooltip.advert ÑлеменÑов:', tooltipAdverts.length); 76 77 if (adBlocks.length === 0 && tooltipAdverts.length === 0) { 78 console.log('[AdViewsTracker] ÐÐµÑ Ð½Ð¾Ð²ÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ Ð¾ÑÑлеживаниÑ'); 79 return; 80 } 81 82 // Создаем Intersection Observer, еÑли его еÑе Ð½ÐµÑ 83 if (!adObserver) { 84 const observerOptions = { 85 root: null, // viewport 86 rootMargin: '0px', 87 threshold: 0.5 // блок ÑÑиÑаеÑÑÑ Ð¿ÑоÑмоÑÑеннÑм, еÑли видно 50% 88 }; 89 90 adObserver = new IntersectionObserver(function(entries) { 91 console.log('[AdViewsTracker] IntersectionObserver обÑабоÑал', entries.length, 'ÑлеменÑов');
92 entries.forEach(function(entry) { 93 console.log('[AdViewsTracker] ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÐµÑеÑек viewport:', entry.isIntersecting, entry.target); 94 if (entry.isIntersecting) { 95 let erid = ''; 96 97 // ÐÑовеÑÑем блоки Ñ ÐºÐ»Ð°ÑÑом .reklama-block (Ð³Ð»Ð°Ð²Ð½Ð°Ñ ÑÑÑаниÑа) 98 const eridElement = entry.target.querySelector('.reklama-description_erid'); 99 console.log('[AdViewsTracker] Ðайден ÑÐ»ÐµÐ¼ÐµÐ½Ñ erid:', eridElement); 100 if (eridElement) { 101 erid = eridElement.textContent.trim(); 102 console.log('[AdViewsTracker] ERID из .reklama-description_erid:', erid); 103 } else if (entry.target.classList.contains('tooltip') && entry.target.classList.contains('advert')) { 104 // ÐÑовеÑÑем блоки Ñ ÐºÐ»Ð°ÑÑом .tooltip.advert (инÑеÑнеÑ-магазин) 105 const tooltipBody = entry.target.querySelector('.tooltip__body'); 106 if (tooltipBody) { 107 const text = tooltipBody.textContent || tooltipBody.innerText; 108 const eridMatch = text.match(/erid:\s*([^\s\n<]+)/i); 109 if (eridMatch && eridMatch[1]) { 110 erid = eridMatch[1].trim(); 111 console.log('[AdViewsTracker] ERID из .tooltip.advert:', erid); 112 } 113 } 114 } 115 116 if (erid) { 117 trackAdView(erid); 118 } else { 119 console.warn('[AdViewsTracker] ERID не найден в ÑлеменÑе:', entry.target); 120 } 121 122 // ÐомеÑаем блок как оÑÑлеженнÑй и пÑекÑаÑаем наблÑдение 123 entry.target.setAttribute('data-tracked', '1'); 124 adObserver.unobserve(entry.target); 125 } 126 }); 127 }, observerOptions); 128 } 129 130 // ÐаÑинаем наблÑдение за новÑми ÑекламнÑми блоками 131 adBlocks.forEach(function(block, index) { 132 console.log('[AdViewsTracker] ÐаÑинаем наблÑдение за блоком', index + 1, ':', block); 133 // ÐÑовеÑÑем ERID пеÑед наÑалом наблÑÐ´ÐµÐ½Ð¸Ñ 134 const eridElement = block.querySelector('.reklama-description_erid'); 135 if (eridElement) { 136 const erid = eridElement.textContent.trim(); 137 console.log('[AdViewsTracker] ERID в блоке', index + 1, ':', erid || '(пÑÑÑой)'); 138 } 139 adObserver.observe(block); 140 }); 141 142 // Также оÑÑлеживаем блоки .tooltip.advert 143 tooltipAdverts.forEach(function(block, index) { 144 console.log('[AdViewsTracker] ÐаÑинаем наблÑдение за .tooltip.advert блоком', index + 1, ':', block); 145 adObserver.observe(block); 146 }); 147 } 148 149 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼ÑÑ Ñлайдов в Swiper 150 function trackVisibleSwiperSlides(container) { 151 const searchContainer = container || document; 152 153 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ Swiper конÑейнеÑÑ 154 const swiperContainers = searchContainer.querySelectorAll('.preview-gallery'); 155 156 swiperContainers.forEach(function(swiperContainer) { 157 // ÐолÑÑаем ÑкземплÑÑ Swiper, еÑли он ÑÑÑеÑÑвÑÐµÑ 158 const swiperInstance = swiperContainer.swiper; 159 if (!swiperInstance) { 160 return; 161 } 162 163 // ÐолÑÑаем видимÑе ÑÐ»Ð°Ð¹Ð´Ñ 164 const visibleSlides = swiperInstance.visibleSlides || 165 Array.from(swiperInstance.slides).filter(function(slide) { 166 return slide.classList.contains('swiper-slide-visible'); 167 }); 168
169 // ÐÑовеÑÑем ÑекламнÑе блоки в видимÑÑ ÑÐ»Ð°Ð¹Ð´Ð°Ñ 170 visibleSlides.forEach(function(slide) { 171 const adBlock = slide.querySelector('.reklama-block:not([data-tracked])'); 172 if (adBlock) { 173 const eridElement = adBlock.querySelector('.reklama-description_erid'); 174 if (eridElement) { 175 const erid = eridElement.textContent.trim(); 176 if (erid) { 177 trackAdView(erid); 178 adBlock.setAttribute('data-tracked', '1'); 179 } 180 } 181 } 182 }); 183 }); 184 } 185 186 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼ÑÑ Ñлайдов в Slick ÑлайдеÑе 187 function trackVisibleSlickSlides(container) { 188 const searchContainer = container || document; 189 190 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ Slick ÑлайдеÑÑ 191 const slickSliders = searchContainer.querySelectorAll('.slick-slider, .hero.js-hero-slider'); 192 193 slickSliders.forEach(function(slider) { 194 // ÐÑовеÑÑем, иниÑиализиÑован ли Slick 195 if (typeof jQuery !== 'undefined' && jQuery(slider).hasClass('slick-initialized')) { 196 // ÐолÑÑаем видимÑе ÑÐ»Ð°Ð¹Ð´Ñ 197 const visibleSlides = jQuery(slider).find('.slick-slide.slick-active, .slick-slide.slick-current'); 198 199 visibleSlides.each(function() { 200 const slide = this; 201 202 // ÐÑовеÑÑем блоки Ñ ÐºÐ»Ð°ÑÑом .reklama-block (Ð³Ð»Ð°Ð²Ð½Ð°Ñ ÑÑÑаниÑа) 203 const adBlock = slide.querySelector('.reklama-block:not([data-tracked])'); 204 if (adBlock) { 205 const eridElement = adBlock.querySelector('.reklama-description_erid'); 206 if (eridElement) { 207 const erid = eridElement.textContent.trim(); 208 if (erid) { 209 trackAdView(erid); 210 adBlock.setAttribute('data-tracked', '1'); 211 } 212 } 213 } 214 215 // ÐÑовеÑÑем блоки Ñ ÐºÐ»Ð°ÑÑом .tooltip.advert (инÑеÑнеÑ-магазин) 216 const tooltipAdvert = slide.querySelector('.tooltip.advert:not([data-tracked])'); 217 if (tooltipAdvert) { 218 // ÐÑем erid в ÑекÑÑе tooltip__body 219 const tooltipBody = tooltipAdvert.querySelector('.tooltip__body'); 220 if (tooltipBody) { 221 const text = tooltipBody.textContent || tooltipBody.innerText; 222 const eridMatch = text.match(/erid:\s*([^\s\n<]+)/i); 223 if (eridMatch && eridMatch[1]) { 224 const erid = eridMatch[1].trim(); 225 if (erid) { 226 trackAdView(erid); 227 tooltipAdvert.setAttribute('data-tracked', '1'); 228 } 229 } 230 } 231 } 232 }); 233 } 234 }); 235 } 236 237 // ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸Ð½Ð¸ÑиализаÑии 238 function init() { 239 console.log('[AdViewsTracker] ÐниÑиализаÑÐ¸Ñ ÑиÑÑÐµÐ¼Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑмоÑÑов баннеÑов'); 240 // ÐеболÑÑÐ°Ñ Ð·Ð°Ð´ÐµÑжка, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо DOM и ÑлайдеÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ 241 setTimeout(function() { 242 console.log('[AdViewsTracker] ÐаÑало оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле задеÑжки'); 243 // ÐÑÑлеживание ÑÑаÑиÑеÑÐºÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² 244 initAdTracking(); 245 246 // ÐÑÑлеживание Swiper ÑлайдеÑов 247 trackVisibleSwiperSlides(); 248 249 // ÐÑÑлеживание Slick ÑлайдеÑов 250 trackVisibleSlickSlides(); 251 }, 500); 252 } 253 254 // ÐниÑиализаÑÐ¸Ñ Ð¿Ñи загÑÑзке ÑÑÑаниÑÑ 255 console.log('[AdViewsTracker] СкÑÐ¸Ð¿Ñ Ð·Ð°Ð³ÑÑжен. СоÑÑоÑние док
255ÑменÑа:', document.readyState); 256 if (document.readyState === 'loading') { 257 console.log('[AdViewsTracker] Ðжидание DOMContentLoaded'); 258 document.addEventListener('DOMContentLoaded', init); 259 } else { 260 console.log('[AdViewsTracker] DOM Ñже загÑÑжен, запÑÑкаем иниÑиализаÑиÑ'); 261 init(); 262 } 263 264 // ÐÑÑлеживание пеÑеклÑÑÐµÐ½Ð¸Ñ Ñабов (Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑÑÑаниÑÑ) 265 if (typeof jQuery !== 'undefined') { 266 jQuery(document).on('click', '.tab-set__item > *', function() { 267 const $tabItem = jQuery(this).parent(); 268 // ÐеболÑÑÐ°Ñ Ð·Ð°Ð´ÐµÑжка Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии пеÑеклÑÑÐµÐ½Ð¸Ñ Ñаба 269 setTimeout(function() { 270 initAdTracking(); 271 trackVisibleSwiperSlides(); 272 trackVisibleSlickSlides(); 273 }, 300); 274 }); 275 276 // ÐÑÑлеживание ÑобÑÑий Slick ÑлайдеÑа 277 jQuery(document).on('afterChange', '.slick-slider, .hero.js-hero-slider', function() { 278 setTimeout(function() { 279 trackVisibleSlickSlides(); 280 }, 100); 281 }); 282 283 // ÐÑÑлеживание AJAX подгÑÑзки новоÑÑей 284 jQuery(document).on('click', '.show-more-news', function(e) { 285 e.preventDefault(); 286 const $button = jQuery(this); 287 const offset = $button.attr('data-offset'); 288 const id = $button.attr('data-id'); 289 290 jQuery.ajax({ 291 url: '/forms/news-pager/?limit=9&offset=' + offset + '&id=' + id, 292 dataType: 'html', 293 success: function(data) { 294 jQuery('.article-list').append(data); 295 $button.attr('data-offset', parseInt(offset) + 9); 296 297 if (jQuery('#news-all-count').length) { 298 const newsAllCount = jQuery('#news-all-count').val(); 299 if (parseInt(offset) + 9 > newsAllCount) { 300 $button.hide(); 301 } 302 } 303 304 // ÐниÑиализиÑÑем оÑÑлеживание Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð·Ð°Ð³ÑÑженнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² 305 setTimeout(function() { 306 initAdTracking(); 307 }, 200); 308 }, 309 complete: function() { 310 // ÐниÑиализаÑÐ¸Ñ LazyLoad Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð¸Ð·Ð¾Ð±Ñажений 311 if (typeof LazyLoad !== 'undefined') { 312 const ll = new LazyLoad({ 313 elements_selector: '.lazy', 314 callback_set: function(el) { 315 jQuery(el).addClass('hidden'); 316 setTimeout(function() { 317 jQuery(el).removeClass('hidden'); 318 }, 400); 319 } 320 }); 321 } 322 } 323 }); 324 }); 325 } 326 327 // ÐÑÑлеживание изменений в Swiper ÑеÑез MutationObserver 328 const swiperContainers = document.querySelectorAll('.preview-gallery'); 329 swiperContainers.forEach(function(container) { 330 const observer = new MutationObserver(function(mutations) { 331 mutations.forEach(function(mutation) { 332 if (mutation.type === 'attributes' && mutation.attributeName === 'class') { 333 const target = mutation.target; 334 if (target.classList.contains('preview-gallery__item') || 335 target.classList.contains('swiper-slide')) { 336 setTimeout(function() { 337 trackVisibleSwiperSlides(); 338 }, 100); 339 } 340 } 341 }); 342 }); 343 344 observer.observe(container, { 345 attributes: true, 346 subtree: true, 347 attributeFilter: ['class'] 348 }); 349 }); 350 351 // ÐÑÑлеживание ÑобÑÑий Swiper напÑÑмÑÑ, еÑли доÑÑÑÐ¿Ð½Ñ 352 setTimeout(function() {
353 swiperContainers.forEach(function(container) { 354 if (container.swiper) { 355 container.swiper.on('slideChange', function() { 356 setTimeout(function() { 357 trackVisibleSwiperSlides(); 358 }, 100); 359 }); 360 } 361 }); 362 }, 1000); 363 364 // ÐкÑпоÑÑ ÑÑнкÑий Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð²Ð½Ðµ (еÑли нÑжно) 365 window.AdViewsTracker = { 366 init: init, 367 initAdTracking: initAdTracking, 368 trackVisibleSwiperSlides: trackVisibleSwiperSlides, 369 trackVisibleSlickSlides: trackVisibleSlickSlides 370 }; 371 372})(); 373
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.