shkola/wp-content/themes/dekart/assets/js/yandex-map.js
2026-07-12 13:06:48 +00:00

80 lines
2.3 KiB
JavaScript

/**
* Yandex Maps lazy loader — shared across all pages
*
* Activates only when #ya-map[data-coords] is present.
* Loads Yandex Maps API on first scroll > 100px (passive) or after 3s fallback.
* Creates map with a placemark at the given coordinates.
*
* Required data attributes on #ya-map:
* data-coords — comma-separated lat,lng (e.g. "55.7558,37.6173")
* data-label — placemark text (e.g. "Детский центр «Декарт»")
*
* @package Dekart
*/
(function () {
var mapEl = document.getElementById('ya-map');
if (!mapEl) return;
var coordsAttr = mapEl.getAttribute('data-coords');
var label = mapEl.getAttribute('data-label') || '';
if (!coordsAttr) return;
var parts = coordsAttr.split(',');
if (parts.length < 2) return;
var mapCoords = [parseFloat(parts[0]), parseFloat(parts[1])];
if (isNaN(mapCoords[0]) || isNaN(mapCoords[1])) return;
var mapLoaded = false;
var apiLoading = false;
function initMap() {
if (typeof ymaps === 'undefined') return;
ymaps.ready(function () {
var map = new ymaps.Map('ya-map', {
center: mapCoords,
zoom: 16
}, {
searchControlProvider: 'yandex#search'
});
var placemark = new ymaps.Placemark(
mapCoords,
{ iconContent: label },
{ preset: 'islands#redStretchyIcon' }
);
map.geoObjects.add(placemark);
mapLoaded = true;
});
}
function loadYandexMaps() {
if (mapLoaded || apiLoading) return;
apiLoading = true;
var script = document.createElement('script');
script.src = 'https://api-maps.yandex.ru/2.1/?lang=ru_RU';
script.onerror = function () {
apiLoading = false;
};
script.onload = initMap;
document.head.appendChild(script);
}
// Scroll trigger — first >100px
function onScroll() {
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > 100) {
loadYandexMaps();
window.removeEventListener('scroll', onScroll);
}
}
// Fallback — 3 seconds after page load
window.addEventListener('load', function () {
setTimeout(function () {
if (!mapLoaded && !apiLoading) loadYandexMaps();
}, 3000);
});
window.addEventListener('scroll', onScroll, { passive: true });
})();