Связать метки Yandex карт со списком адресов

12 Марта 2019
javascript

Задача достаточно распространенная: настроить связь между метками на карте и списком адресов.

  1. Нам потребуется сам список адресов с атрибутами data-objectId, в них мы поместим id метки. Например:

    <div data-objectId="1">м. Автово — пр.Стачек, д.75 - за пав."Мастер Кебаб"</div>
    <div data-objectId="2">м. Автово2 [до 10 кг] — ул. Маршала Казакова, д.1</div>
    <div data-objectId="3">м. Академическая — пр.Науки, д.17 к2, вверх по пандусу</div>
    
  2. Потребуется карта с метками, подробно как её создать написано тут.

  3. Основная функция включает в себя события, которые произойдут и при клике по метке и при выборе адреса из списка

    function viewObject(objectId){
        // Удаляем со всего списка класс active затем добавляем к выранному
        for (var object of document.querySelectorAll('[data-objectId]')) {
    		object.classList.remove('active');
    	}
        document.querySelector('[data-objectId="'+objectId+'"]').classList.add('active');
        
        /*
        Если подключен jquery можно заменить вверхний цикл этим:
        $('[data-objectId]').removeClass('active');				
        $('[data-objectId='+objectId+']').addClass('active');
        */
        
        
        // Выделяем все метки в синий
        objectManager.objects.each(function (item) {
            objectManager.objects.setObjectOptions(item.id, {
                preset: 'islands#blueIcon'
            });
        });
    
        // Выделяем выбранную метку в красный
        objectManager.objects.setObjectOptions(objectId, {
            preset: 'islands#redDotIcon'
        });
    
        // Центруем по метке
        myMap.setCenter(objectManager.objects.getById(objectId).geometry.coordinates, 15, {
            checkZoomRange: true
        });
    }
    
  4. И еще нам придется создать 2 события: при клике на список адресов и при клике по метке.

    //Клик по метке в карте
    objectManager.objects.events.add('click', function (e) {
    	var objectId=e.get('objectId');
    	viewObject(objectId);
    });
    
    //Клик в списке
    [].forEach.call(document.querySelectorAll('[data-objectId]'), function(el) {
    	el.addEventListener('click', function() {
    		var objectId=el.getAttribute("data-objectId");
    		viewObject(objectId);
    	});
    });
    
    /*
    Если подключен jquery можно заменить этим:
    $(document).on('click', '[data-objectId]', function(){
    	var objectId=$(this).attr('data-objectId');
    	viewObject(objectId);
    });
    */
    

Пример