Заметки

Lazy ленивая загрузка яндекс карты

В последнее время гугл pagespeed отнимает гору очков если на сайте есть интерактивная карта яндекса.

Потому сделаем её статической, а загрузку при наведении мыши:

1. Сначала построим карту яндекса (https://yandex.ru/map-constructor/) и получим скрипт , например такой:

<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1ad4887964fc2e0a6f07c6246ffe638b138f8baacc8983f9a6a0f401a02e833a&amp;width=1280&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>

2. На своем сайте напишем контейнер для блока карты и стили для нашей статичной картинки(её можно сделать скриншотером):

<style>
    .map.container-fluid {
        height: 340px;
        padding: 0;
        background-image: url(/uploads/common/ymap0.png);
        background-position: center center;
    }
</style>

<div id="map_container" class="map container-fluid">
    <script id="ymap_lazy" data-skip-moving="true" async=""
            data-src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1ad4887964fc2e0a6f07c6246ffe638b138f8baacc8983f9a6a0f401a02e833a&amp;width=1280&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
</div>

3. Скрипт обработки события:

<script>
    let map_container = document.getElementById('map_container');
    let options_map = {
        once: true,//once start, thereafter destroy listener
        passive: true,
        capture: true
    };
    map_container.addEventListener('click', start_lazy_map, options_map);
    map_container.addEventListener('mouseover', start_lazy_map, options_map);
    map_container.addEventListener('touchstart', start_lazy_map, options_map);
    map_container.addEventListener('touchmove', start_lazy_map, options_map);

    let map_loaded = false;
    function start_lazy_map() {
        if (!map_loaded) {
            let map_block = document.getElementById('ymap_lazy');
            map_loaded = true;
            map_block.setAttribute('src', map_block.getAttribute('data-src'));
            map_block.removeAttribute('data_src');
            console.log('YMAP LOADED');
        }
    }
</script>

4. Пример работы можно оценить здесь.

Я скопировал эту статью на хабр (там можно поставить ей лайк)

 

Афоризм дня:
Комедия имеет намерение отображать людей худших, а трагедия – лучших, чем существующие. (647)

11 months ago

Спасибо большое, всё работает как надо., :) Это лучшее решение, которое мне удалось найти.

11 months ago

Отлично, рад слышать!

4 months ago

Огромное спасибо! Очень помогло и прекрасно работает. Возможно ли сделать что-то подобное для кода Яндекс.Поиск на сайте ?

3 months ago

не понял, поясните вопрос, какого кода "Яндекс.Поиск"?

Leave a reply