2011-01-15 20 views
35

リンクがクリックされたときに表示され、別のリンクがクリックされたときに表示されるGoogleマップを設定しようとしています。ディスプレイからマップを表示する場合を除いて、すべて正常に動作します:なし、正しく表示されません。Googleマップ表示:なし問題

私は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> 

、あなたはこのようにhiddingにマップを試すことができます:Quintinの

答えて

40

この問題はまた、代わりに「なし表示」:適用するので、jqueryのタブで発生

followinを追加します。あなたの代わりに使用してディスプレイの、マップを非表示にしようとしているグラムスタイル:トランジション::また、のようなトランジションを追加することができます

position: absolute; 
left: -100%; 

なしでは容易1S左。

<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

こんにちはJavier、絶対配置を使用せずにそれを行う方法はありますか? google.maps.event.trigger(map、 'resize')の実装方法を知っていますか?私のコードに? –

+0

こんにちは、私はあなたのjavascriptにいくつかのマイナーチェンジを行い、私のためにうまくいきます、私は関数の外に(あなたの場合はtoggleDiv1関数で)他の関数で利用できるようにマップ変数を配置し、 、サイズ変更マップ・イベントをトリガーすることができます。 jQueryを使ってこれらのことを行うことをお勧めしますので、余分なコードを書くことは避けてください。 – javiertoledos

+0

地図の表示にはうまくいくようですが、何らかの理由でそれがどこにあるべきかはわかりません。左にスクロールすると、赤いバルーンが中央に配置されます。地図を最初から見えるようにするとうまくいきます。しかし、divが誰もブロックしなくなると、何かが起こり、それは中心に留まらない。なぜこれがあるのか​​知っていますか? –

1

あなたは確かに良くoff-left技術を使用して:あなたはマップを表示した後

は、あなたはそれをトリガーGoogleのイベントリスナーで試すことができます!

<!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

ああ、yerは意味をなさない。答えをありがとう。 –

+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

開発者はdivが変更されたときにこのイベントを地図上に表示する サイズ:google.maps.event.trigger(map, 'resize')display:noneとして

サイズ0の<div>を残すと等価である、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

あなたがその外側のdiv要素のすべてがすでに表示する必要があるマップを初期化します。

だから一番最後にマップを初期化:

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

はまた、私は別の解決策を発見しました。場合によってはGoogleマップのオブジェクトにrefresh()を呼び出す必要があり、地図のサイズを変更する必要があります。

// 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(マップを、 'サイズを変更')更新されます以前の表示状態が「なし」なので、表示されるたびにコードを追加します。

関連する問題