Не нашел в сети решение данной проблемы поэтому решил разобраться сам. Если в для API v1.x есть достойное решение с использованием метода redraw, то в API версии 2.0 такого метода нет.
Для начала, посмотрим как это работает в версии 1.x.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $( function () { var map = new YMaps.Map(document.getElementById( 'idmap' )); map.setCenter( new YMaps.GeoPoint(55.952942,54.72998), 17); map.addControl( new YMaps.TypeControl()); map.addControl( new YMaps.ToolBar()); map.addControl( new YMaps.Zoom()); map.addControl( new YMaps.MiniMap()); map.addControl( new YMaps.ScaleLine()); $( "a.mapFan" ).fancybox({ onLoad : function () { // либо для fancybox2 afterLoad map.redraw(); } }); }); |
для такого html
1 | < a href = "#idmap" >Открыть fancy</ a >< div id = "idmap" style = "display:none;" ></ div > |
это работает и сейчас, api поддерживается командой яндекс карт, однако мы ведь идем в ногу со временем, так что будем делать тоже самое для версии Yandex Map API v2.0.
Вся загвоздка в том, что у элемента страницы, у которого css свойство display равно none, т.е. он скрыт, размеры равны нулю. То бишь карту мы создаем, она инициализируется, но ее размеры равны width=0, height=0. Вот такой пример из документации по Yandex Map API предлагает интересное решение. Сперва инициализируется карта, а уже потом сам fancybox( в примере показано на примере другого jQuery плагина), при показе невидимого до этого блока вызывается метод container.fitToViewport();
Как я не мучил данный способ, нормально работать я его так и не заставил. Мы пойдем другим путем. Будем подгружать Яндекс карту каждый раз при открытии fancybox.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ymaps.ready( function () { // Поиск координат центра Уфы $( '.fancybox' ).fancybox({height:600,afterShow : function () { ymaps.geocode( 'г.Уфа ул.Кирова д.34' , { results: 1 }).then( function (res) { // Выбираем первый результат геокодирования window.firstGeoObject = res.geoObjects.get(0); window.myMap = new ymaps.Map( "idmap" , { center: window.firstGeoObject.geometry.getCoordinates(), zoom: 17, behaviors: [ "scrollZoom" , "drag" ] }); }, function (err) { // Если геокодирование не удалось, // сообщаем об ошибке console.log(err.message); }); }, afterClose: function (){ window.myMap.destroy(); myMap = null ; }}); }); |
для fancybox первой версии события будут onComplete и onClosed соответственно. Демо здесь
Комментарии
Решение работает четко.
У меня другая бага. Всё вывел, но селектор выбора типа карты почему-то отображается 30х32 и после ручной смены типа - глюк пропадает. Пока не нашел решение.