2011-01-15 3 views
35

Я пытаюсь настроить карту Google, которая будет отображаться при нажатии ссылки, а затем скрыть, когда будет нажата другая ссылка. Все работает отлично, за исключением случаев, когда я показываю карту с дисплея: нет, она не отображается должным образом.Карт Google Maps: Нет Проблема

Я прочитал об использовании google.maps.event.trigger (map, 'resize'); но я не достаточно с Javascript и JQuery специалистами, чтобы узнать, как добавить его в

Вот код, я использую:.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN"> 
<html> 
    <head> 
     <title></title> 
     <style type="text/css"> 
      #viewmap { 
       position:relative; 
       width:944px; 
       float:left; 
       display:none; 
      } 
      #hidemap { 
       position:relative; 
       width:944px; 
       float:left; 
       display:block; 
      } 
      #map_canvas { 
       position:relative; 
       float:left; 
       width:944px; 
       height:300px; 
      } 
     </style> 
     <script type="text/javascript" 
      src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"> 
     </script> 
     <script type="text/javascript"> 
      function initialize() { 
       var latlng = new google.maps.LatLng(-27.999673,153.42855); 
       var myOptions = { 
        zoom: 15, 
        center: latlng, 
        mapTypeId: google.maps.MapTypeId.ROADMAP, 
        mapTypeControl: true, 
        mapTypeControlOptions: { 
         style: google.maps.MapTypeControlStyle.DROPDOWN_MENU 
        } 
       }; 

       var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 

       var contentString = 'blah'; 

       var infowindow = new google.maps.InfoWindow({ 
        content: contentString 
       }); 

       var marker = new google.maps.Marker({ 
        position: latlng, 
        map: map 
       }); 

       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.open(map,marker); 
       }); 
      } 

      google.maps.event.addDomListener(window, 'load', initialize); 
     </script> 
     <script type="text/javascript"> 
      function toggleDiv1(viewmap){ 
       if(document.getElementById(viewmap).style.display == 'block'){ 
        document.getElementById(viewmap).style.display = 'none'; 
       }else{ 
        document.getElementById(viewmap).style.display = 'block'; 
       } 
      } 
      function toggleDiv2(hidemap){ 
       if(document.getElementById(hidemap).style.display == 'none'){ 
        document.getElementById(hidemap).style.display = 'block'; 
       }else{ 
        document.getElementById(hidemap).style.display = 'none'; 
       } 
      } 
     </script> 
    </head> 
    <body> 
     <div id="viewmap"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap');">Hide map</a> 
      <div id="map_canvas"></div> 
     </div> 
     <div id="hidemap"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap');">View map</a> 
     </div> 
    </body> 
</html> 

Любая помощь будет высоко ценится,

Квентин

ответ

40

Это проблемы также происходит с вкладками Jquery, а не применяя «дисплей: нет», вы можете попробовать Hidding карту следующим образом:

добавить followin г стили, когда вы пытаетесь скрыть карту, вместо того, чтобы с помощью дисплея: нет

position: absolute; 
left: -100%; 

Вы также можете добавлять переходы, как: переход: левое 1s легкость;

Вы можете попробовать прослушиватель событий Google запуск его после отображения карты:

<script type="text/javascript"> 
    var map; //I placed here the map variable so other functions can see it. 
    var latlng = new google.maps.LatLng(-27.999673,153.42855); 
    // in order to center again the map... 
    function initialize() { 

     var myOptions = { 
      zoom: 15, 
      center: latlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP, 
      mapTypeControl: true, 
      mapTypeControlOptions: { 
       style: google.maps.MapTypeControlStyle.DROPDOWN_MENU 
      } 
     }; 

     map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 

     var contentString = 'blah'; 

     var infowindow = new google.maps.InfoWindow({ 
      content: contentString 
     }); 

     var marker = new google.maps.Marker({ 
      position: latlng, 
      map: map 
     }); 

     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.open(map,marker); 
     }); 
    } 

    google.maps.event.addDomListener(window, 'load', initialize); 
</script> 
<script type="text/javascript"> 
    function toggleDiv1(viewmap){ 
     if(document.getElementById(viewmap).style.display == 'block'){ 
      document.getElementById(viewmap).style.display = 'none'; 
     }else{ 
      document.getElementById(viewmap).style.display = 'block'; 
      //here is where your map is being displayed again, try here 
      // to trigger the resize event. 
      google.maps.event.trigger(map, 'resize'); 
      map.setCenter(latlng); 
     } 
    } 
    function toggleDiv2(hidemap){ 
     if(document.getElementById(hidemap).style.display == 'none'){ 
      document.getElementById(hidemap).style.display = 'block'; 
     }else{ 
      document.getElementById(hidemap).style.display = 'none'; 
     } 
    } 
</script> 
+0

Привет Хавьер, есть ли способ сделать это без использования абсолютного позиционирования? Вы знаете, как реализовать google.maps.event.trigger (map, 'resize'); в мой код? –

+0

Привет, я внес некоторые незначительные изменения в ваш javascript и отлично работает для меня, я поместил переменную map вне функции, чтобы она могла быть доступна для других функций (в вашем случае функция toggleDiv1), а затем, когда ваш div отобразится снова , вы можете вызвать событие изменения размера. Я предлагаю вам сделать это с помощью jQuery, чтобы избежать лишнего кода. – javiertoledos

+0

Это похоже на отображение карты, но по какой-то причине оно не сосредоточено там, где должно быть. Если вы прокрутите влево, появится красный шар, где он должен быть центрирован. Он отлично работает, если сделать карту видимой с самого начала. Но что-то происходит, когда div не блокирует, и он не остается центрированным. Вы знаете, почему это может быть? –

1

Вы действительно лучше, используя off-left техники!
Вот мои правки:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN"> 
<html> 
    <head> 
     <title></title> 
     <style type="text/css"> 
      #viewmap { 
       position:relative; 
       width:944px; 
       float:left; 
      } 
      #hidemap { 
       position:relative; 
       width:944px; 
       float:left; 
      } 
      #map_canvas { 
       position:relative; 
       float:left; 
       width:944px; 
       height:300px; 
      } 
      .good-bye { 
      position: absolute !important; 
      left: -10000px !important; 
      } 
     </style> 
     <script type="text/javascript" 
      src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"> 
     </script> 
     <script type="text/javascript"> 
      function initialize() { 
       var latlng = new google.maps.LatLng(-27.999673,153.42855); 
       var myOptions = { 
        zoom: 15, 
        center: latlng, 
        mapTypeId: google.maps.MapTypeId.ROADMAP, 
        mapTypeControl: true, 
        mapTypeControlOptions: { 
         style: google.maps.MapTypeControlStyle.DROPDOWN_MENU 
        } 
       }; 

       var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 

       var contentString = 'blah'; 

       var infowindow = new google.maps.InfoWindow({ 
        content: contentString 
       }); 

       var marker = new google.maps.Marker({ 
        position: latlng, 
        map: map 
       }); 

       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.open(map,marker); 
       }); 
      } 

      google.maps.event.addDomListener(window, 'load', initialize); 
     </script> 
     <script type="text/javascript"> 
      function toggleDiv1(viewmap){ 
       if(hasClass(document.getElementById(viewmap), 'good-bye')) 
       removeClass(document.getElementById(viewmap), 'good-bye'); 
       else 
       addClass(document.getElementById(viewmap), 'good-bye'); 
       return; 
      } 
      function toggleDiv2(hidemap){ 
       if(hasClass(document.getElementById(hidemap), 'good-bye')) 
       removeClass(document.getElementById(hidemap), 'good-bye'); 
       else 
       addClass(document.getElementById(hidemap), 'good-bye'); 
       return; 
      } 

      // http://snipplr.com/view/3561/addclass-removeclass-hasclass/ 
      function hasClass(ele,cls) { 
       return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)')); 
      } 

      function addClass(ele,cls) { 
       if (!this.hasClass(ele,cls)) ele.className += " "+cls; 
      } 

      function removeClass(ele,cls) { 
       if (hasClass(ele,cls)) { 
       var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)'); 
       ele.className=ele.className.replace(reg,' '); 
       } 
      } 
     </script> 
    </head> 
    <body> 
     <div id="viewmap" class="good-bye"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap'); return false;">Hide map</a> 
      <div id="map_canvas"></div> 
     </div> 
     <div id="hidemap"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap');">View map</a> 
     </div> 
    </body> 
</html> 

Example Link.

+0

Спасибо за другое решение, я попробую оба метода и посмотрю, какая из них лучше всего подходит для того, что я пытаюсь сделать. –

12

Проблема с размером карты в том, что она должна знать размер div, на который он оказывает рендеринг. В настоящий момент вы инициализируете карту при загрузке документа, когда ваш div скрыт, поэтому карта не может правильно рассчитать свой размер. Чтобы решить эту проблему, вам просто нужно ее инициализировать в первый раз, когда вы показываете div (а не нагрузка).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN"> 
<html> 
    <head> 
     <title></title> 
     <style type="text/css"> 
      #viewmap { 
       position:relative; 
       width:944px; 
       float:left; 
       display:none; 
      } 
      #hidemap { 
       position:relative; 
       width:944px; 
       float:left; 
       display:block; 
      } 
      #map_canvas { 
       position:relative; 
       float:left; 
       width:944px; 
       height:300px; 
      } 
     </style> 
     <script type="text/javascript" 
      src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"> 
     </script> 
     <script type="text/javascript"> 
     //your global map object 
     var map = null; 
      function initialize() { 
       var latlng = new google.maps.LatLng(-27.999673,153.42855); 
       var myOptions = { 
        zoom: 15, 
        center: latlng, 
        mapTypeId: google.maps.MapTypeId.ROADMAP, 
        mapTypeControl: true, 
        mapTypeControlOptions: { 
         style: google.maps.MapTypeControlStyle.DROPDOWN_MENU 
        } 
       }; 

       map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 

       var contentString = 'blah'; 

       var infowindow = new google.maps.InfoWindow({ 
        content: contentString 
       }); 

       var marker = new google.maps.Marker({ 
        position: latlng, 
        map: map 
       }); 

       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.open(map,marker); 
       }); 

      } 


      function toggleDiv1(viewmap){ 
       if(document.getElementById(viewmap).style.display == 'block'){ 
        document.getElementById(viewmap).style.display = 'none'; 
       }else{ 
        document.getElementById(viewmap).style.display = 'block'; 
        //check if map object exists (it is created by you initialize function), if not initialize it 
        if (!map) { 
        initialize(); 

        } 
       } 
      } 
      function toggleDiv2(hidemap){ 
       if(document.getElementById(hidemap).style.display == 'none'){ 
        document.getElementById(hidemap).style.display = 'block'; 
       }else{ 
        document.getElementById(hidemap).style.display = 'none'; 
       } 
      } 
     </script> 
    </head> 
    <body> 
     <div id="viewmap"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap');">Hide map</a> 
      <div id="map_canvas"></div> 
     </div> 
     <div id="hidemap"> 
      <a href="#" onmousedown="toggleDiv1('viewmap'); toggleDiv2('hidemap');">View map</a> 
     </div> 
    </body> 
</html> 
+0

Ах, ну, это имеет смысл. Спасибо за ответ. –

+0

Привет, спасибо. Не знаю, почему ваш ответ не принят. – unexist

0

Я пытался оживить свои карты, не повезло, и, наконец, пришел с этим:

CSS: Мы установили карту обертку с position:absolute; и visibility:hidden;, потому что он должен иметь свой нормальные размеры для правильной визуализации.

JavaScript:

$(document).ready(function() 
{ 
    // We then run this function only once per page load. It places out map back in the document flow but hides it before it starts to toggle its height. 
    $("#mapBtn").one("click", function() 
    { 
     $("#myMap").hide(); 
     $("#myMap").css("visibility", "inherit"); 
     $("#myMap").css("position", "relative"); 
    }); 

    // And now we toggle away nicely 
    $("#mapBtn").click(function() 
    { 
     $("#myMap").slideToggle(400); 
    }); 
}); 
0

Этот код работать прямо (с помощью JQuery 1.2.6): Css: #gog-map{position:absolute; visibility:hidden;}

$(document).ready(function() { 
    $('a#link').click(function() { 
    if ($('#gog-map').is(':visible')){ 
     $('#gog-map').slideUp('slow');    
    } else{ 
     $('#gog-map').slideDown('slow'); 
     $("#gog-map").css('visibility','inherit'); 
     $("#gog-map").css('position','relative'); 
    } 
    return false; 
    }); 
}); 

71

Я столкнулся с этой же проблемой сегодня, и в конце концов нашел это на официальное сообщение Google Maps Javascript API V3 Reference:

Разработчикам следует tr igger это событие на карте, когда div изменяет размер: google.maps.event.trigger(map, 'resize').

Как display:none эквивалентно оставляя <div> с размером 0, изменяя его display:block фактически становится изменение размера, что делает поэтому необходимо, чтобы вызвать отображение изменения размера событие.

Работали как очарование для меня.

+0

Это все, что нужно. Никаких махинаций, всего один простой триггер. –

+0

Для людей, прибывающих из угловых js, это может сделать трюк 'google.maps.event.trigger ($ scope.map.control.getGMap(), 'resize');' –

+0

Это должен быть правильный ответ. – LanceLafontaine

0
document.getElementById('map_canvas').style.display = 'none'; 

Это работало отлично для меня - не знаю, если это потому, что я прячусь холст, а не содержащей DIV .... отлично работает в IE, Firefox и Chrome. Конечно, вы можете скрыть свой контейнер, как только холст карты будет скрыт.

2

.map_container {дисплей: нет;}

$('.show_hide').click(function(){ 
    $('.map_container').toggle({ 
     complete:function(){ 
      google.maps.event.trigger(map, 'resize'); 
     }, 
     duration:'slow' 
    }); 
}) 
1

Довольно просто ... к тому времени, как инициализировать карту все его внешние дивы должны быть уже отображены.

Так просто инициализировать карту в самом конце:

setTimeout(function(){ 
    $mapsOuterDiv.slideToggle(700); 
    setTimeout(function(){ 
     initializeGoogleMap(); 
    },300); 
},300); 
1

Также я нашел другое решение. Иногда вам нужно позвонить refresh() на объект google maps, и карта будет вынуждена изменить размер.

// gmaps - instance of particular map ... 
gmaps.refresh() 
3

Просто инициализируйте карту, когда хотите ее отобразить. У меня была такая же проблема, и я решил это так.

Удалить эту строку:

google.maps.event.addDomListener(window, 'load', initialize); 

и изменить toggleDiv скрипт так:

function toggleDiv1(viewmap){ 
    if(document.getElementById(viewmap).style.display == 'block'){ 
     document.getElementById(viewmap).style.display = 'none'; 
    }else{ 
     document.getElementById(viewmap).style.display = 'block'; 
     initialize(); 
    } 
} 
function toggleDiv2(hidemap){ 
    if(document.getElementById(hidemap).style.display == 'none'){ 
     document.getElementById(hidemap).style.display = 'block'; 
    }else{ 
     document.getElementById(hidemap).style.display = 'none'; 
    } 
} 
+0

** Лучшее подход**. Загружается только при отображении карты. –

0

Вообще google.maps.event.trigger (карта 'изменить размер') будет обновить в карту и, таким образом, добавить код после каждого отображения, поскольку предыдущее состояние дисплея «нет»:

document.getElementById(hidemap).style.display = 'block'; 
    Generally google.maps.event.trigger(map, 'resize') 
Смежные вопросы