Neste artigo, descreverei um exemplo de otimização de uma conexão de mapa Yandex, onde ela será carregada de forma preguiçosa quando você passar o cursor do mouse.
1. Primeiro, vamos construir um mapa Yandex ( aqui ) e obter um script, mais ou menos assim:
<script type="text/javascript"
charset="utf-8"
async
src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1ad4887964fc2e0a6f07c6246ffe638b138f8baacc8983f9a6a0f401a02e833a&width=1280&height=400&lang=ru_RU&scroll=true"></script>
2. Em nosso site, escreveremos um contêiner para o bloco de cartão:
<div id="map_container" class="map container-fluid">
<script id="ymap_lazy"
async
data-src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1ad4887964fc2e0a6f07c6246ffe638b138f8baacc8983f9a6a0f401a02e833a&width=1280&height=400&lang=ru_RU&scroll=true"></script>
</div>
E os estilos de nossa imagem estática (é mais fácil fazer isso com qualquer captura de tela):
<style>
.map.container-fluid {
height: 340px;
padding: 0;
background-image: url(/uploads/common/ymap0.png);
background-position: center center;
}
</style>
3. O mais interessante é escrever um código JavaScript que irá rastrear eventos de passar o mouse ou clicar na tela de toque do telefone e substituir a imagem estática por um mapa interativo:
<script>
let map_container = document.getElementById('map_container');
let options_map = {
once: true,// ,
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. Lucro! Seu site agora está carregando muito mais rápido!
PS: Este método também pode ser adaptado para outros objetos que não são JS e CSS obrigatórios, devido ao qual a velocidade de carregamento da página pode ser inferior a um segundo.