非表示のdiv内のGoogleマップを処理する方法(更新された画像)


127

私はページを持っています、そして最初にグーグルマップは隠されたdivの中にあります。リンクをクリックした後、divを表示しますが、マップの左上だけが表示されます。

クリック後にこのコードを実行してみました:

    map0.onResize();

または:

  google.maps.event.trigger(map0, 'resize')

何か案は。これは、非表示のマップを含むdivを表示した後の画像です。代替テキスト


これに関するSOに関する質問はすでにいくつかあります。これには、隠された領域からのGoogleマップの表示が
Matt Ball

@マットボール-更新されたので、サイズ変更イベントを追加しようとしましたが、まだ機能しません
leora

@マットボール-私はこれを機能させました。グーグルマップオブジェクトを作成した後、それをグローバル変数に保存して後で参照できるようにして、サイズ変更を呼び出すことが機能するようになりました。マップオブジェクトを表示するたびに再作成する必要がないようにしています。これは、ユーザーが前後に切り替えられるようにするためです。
leora 2010年

@oooそれは以下のコードで非常に簡単です。追加する必要があるのは、マップオブジェクトが初期化されているかどうかを確認するif条件だけです。これは、マップを正しくロードするという最初の問題に対処するために書かれたオフカフのコードでした。
Philar、2011年

@philar-うん。。ここにありがとう。。したがって、賛成票:)。どちらの方法でも、再初期化を回避するために変数をグローバルレベルで保存する必要があります
leora

回答:


103

自分でテストしたところ、次のように取り組みました。かなり簡単です。説明が必要な場合はお知らせください

HTML

<div id="map_canvas" style="width:700px; height:500px; margin-left:80px;" ></div>
<button onclick="displayMap()">Show Map</button>

CSS

<style type="text/css">
#map_canvas {display:none;}
</style>

JavaScript

<script>
function displayMap()
{
    document.getElementById( 'map_canvas' ).style.display = "block";
    initialize();
}
function initialize()
{
    // create the map
    var myOptions = {
        zoom: 14,
        center: new google.maps.LatLng( 0.0, 0.0 ),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map( document.getElementById( "map_canvas" ),myOptions );
}
</script>

つまり、基本的には、divが表示されたときにのみマップをインスタンス化しますか?(ページの読み込み時に)マップオブジェクトが1回だけインスタンス化されるようにこれを行う方法はありますか?
lucas

1
サイズ変更の時間を考慮してshow()を呼び出す場合は、2番目の関数を呼び出すためにsetTimeout遅延を提案することもできます。
Eric.18

126

私は同じ問題を抱えていましたが、divを表示するときに電話をかけるgoogle.maps.event.trigger(map, 'resize');と問題が解決するようです。


64
サイズ変更後すぐにマップの元の中心を維持するには、次のようにサイズ変更ステートメントを拡張することを検討してください。var center = map.getCenter(); google.maps.event.trigger(map、 'resize'); map.setCenter(center);
John Doppelmann 2013

10
理由は不明ですが、ソリューションを機能させるには、小さなsetTimeout内にソリューションをラップする必要があります。
HoffZ 14

@JohnDoppelmann先端をありがとう!なぜそれが中心を維持していないのか、それを強制的に戻す方法は直観的ではありませんでした。
ノアダンカン

「サイズ変更」イベントをトリガーした後、マップの中心とズームレベルを再度設定します。詳しくは、code.google.com
p

@HoffZこれはおそらく、表示効果の前にサイズ変更コードが発火したためであり、タイムアウトが表示が実行されるまでそれを遅らせてから、サイズ変更で機能させることができます。イベントの発生時に、マップのサイズ変更の前にdiv表示が確実に実行されるように、実行のコード順序を変更する同じ効果をおそらく達成できます。
Bardo

26
google.maps.event.trigger($("#div_ID")[0], 'resize');

利用可能な変数マップがない場合は、divGMAPを含むの最初の要素(愚かなことをしない限り)にする必要があります。


google.map.Mapオブジェクトの代わりにdivで要素をトリガーできると確信していますか?
Salman A

@SalmanA-ちょうどこれをチェックしました、そしてそれは私のために機能しました(マップは新しいセンターを持っているようですが)。以前の調査から、これが可能であることも知らなかったので、CSNへの称賛
Hal

CS N ...これは私には有効ですが、中央の位置が間違った場所に残ります。私のマップはOPのスクリーンショットのように初期化されています。それは中央のようなものです。私のmap_canvasの左上隅を中心にしています。それを中心に描画する方法についての考えは?
Kirk Ross

13

ブートストラップタブ内にGoogleマップがありましたが、正しく表示されませんでした。これは私の修正でした。

// Previously stored my map object(s) in googleMaps array

$('a[href="#profileTab"]').on('shown', function() {   // When tab is displayed...
    var map = googleMaps[0],
        center = map.getCenter();
    google.maps.event.trigger(map, 'resize');         // fixes map display
    map.setCenter(center);                            // centers map correctly
});

1
非表示のタブで非表示になっているマップでこれを機能させるには、「shown」を「shown.bs.tab」に置き換える必要がありました。ありがとう
ニコラ

私はSmartWizard 4を使用していますが、これが私にとってうまくいった唯一のソリューションであり、うまくいきました!マップDIVを含むDIVの名前に変更'a[href="#profileTab"]'しましstep-2た。
GeospatialPython.com 2017

7

divのサイズを変更するときにマップを更新する方法

呼び出すだけでは不十分google.maps.event.trigger(map, 'resize');です。マップの中心もリセットする必要があります。

var map;

var initialize= function (){
    ...
}

var resize = function () {
    if (typeof(map) == "undefined") {) {
        // initialize the map. You only need this if you may not have initialized your map when resize() is called.
        initialize();
    } else {
        // okay, we've got a map and we need to resize it
        var center = map.getCenter();
        google.maps.event.trigger(map, 'resize');
        map.setCenter(center);
    }
}

サイズ変更イベントをリッスンする方法

Angular(ng-showまたはui-bootstrap collapse)

$ watchはng-showが更新される前に起動できるので(divは非表示のままであるため)、ng-showにバインドされた値ではなく、要素の可視性に直接バインドします。

scope.$watch(function () { return element.is(':visible'); },
    function () {
        resize();
    }
);

jQuery .show()

組み込みのコールバックを使用する

$("#myMapDiv").show(speed, function() { resize(); });

ブートストラップ3モーダル

$('#myModal').on('shown.bs.modal', function() {
    resize();
})

ブートストラップ3のモーダルサイズ変更メソッドは私の問題を完全に修正しましたが、他のほとんどの提案はそうではありませんでした。ありがとう!
BrianLegg 16

6

iframeコードをコピーして貼り付けてGoogleマップを挿入しGoogle Maps APIを使用したくない場合、これは簡単な解決策です。非表示のマップを表示するときに、次のJavaScript行を実行するだけです。iframe HTMLコードを取得して同じ場所に挿入するだけなので、再度レンダリングされます。

document.getElementById("map-wrapper").innerHTML = document.getElementById("map-wrapper").innerHTML;

jQueryバージョン:

$('#map-wrapper').html( $('#map-wrapper').html() );

HTML:

....
<div id="map-wrapper"><iframe src="https://www.google.com/maps/..." /></div>
....

次の例は、Bootstrap 3タブで最初に非表示にされたマップに対して機能します。

<script>
$(document).ready( function() {

    /* Detects when the tab is selected */
    $('a[href="#tab-id"]').on('shown.bs.tab', function() {

        /* When the tab is shown the content of the wrapper
           is regenerated and reloaded */

        $('#map-wrapper').html( $('#map-wrapper').html() ); 

    });
});
</script>

2
Google Map JSを読み込まず、単にsrc urlでiframeを使用するすべての人に最適なソリューションhttps://www.google.com/maps/embed/v1/place?..
gsinha

6

ネイティブウィンドウのサイズ変更イベントをトリガーすることも可能です。

Googleマップは自動的に再読み込みされます:

window.dispatchEvent(new Event('resize'));

5

同じ問題がありましたgoogle.maps.event.trigger(map, 'resize')が、うまくいきませんでした。

私がやったことは、タイマーを表示して地図を更新した後に地図を更新することでしたdiv...

//CODE WORKING

var refreshIntervalId;

function showMap() {
    document.getElementById('divMap').style.display = '';
    refreshIntervalId = setInterval(function () { updateMapTimer() }, 300);
}

function updateMapTimer() {
    clearInterval(refreshIntervalId);
    var map = new google.maps.Map(....
    ....
}

それがより便利な方法かどうかはわかりませんが、うまくいきます!


setTimeoutを使用して1回待機します。
ジョーオースティン

4

jQueryを使用すると、次のようなことができます。これにより、すぐには表示されないタブにあるUmbraco CMSでGoogleマップを読み込むことができました。

function waitForVisibleMapElement() {
    setTimeout(function () {
        if ($('#map_canvas').is(":visible")) {
            // Initialize your Google Map here
        } else {
            waitForVisibleMapElement();
        };
    }, 100);
};

waitForVisibleMapElement();

これが私と私の問題に有効な唯一の解決策です。Materialize.CSSタブ内にGoogleマップがあり、マップは表示されていませんが、灰色の背景に左隅にマーカーとGoogleロゴのみが表示されていました。表示されたときにマップを初期化するようにタブコンテンツdivを設定しましたが、完全に機能します。
Gorgon_Union 2016

3

私のソリューションは非常にシンプルで効率的です:

HTML

<div class="map-wrap"> 
  <div id="map-canvas"></div>
</div>


CSS

.map-wrap{
  height:0;
  width:0;
  overflow:hidden;
}


jquery

$('.map-wrap').css({ height: 'auto', width: 'auto' }); //For showing your map
$('.map-wrap').css({ height: 0, width: 0 }); //For hiding your map


2

元の質問は、ページの非表示のdivで初期化されたマップに関するものだと思います。表示ステータスに関係なく、初期化後、ドキュメントの準備ができたら非表示のdivのマップのサイズを変更することで、同様の問題を解決しました。私の場合、2つのマップがあります。1つは表示され、もう1つは初期化時に非表示になり、表示されるたびにマップを初期化したくありません。古い投稿ですが、探している人の役に立つと思います。


2

私はこれが私のために働くことがわかりました:

隠れる:

$('.mapWrapper')
.css({
  visibility: 'hidden',
  height: 0
});

表示する:

    $('.mapWrapper').css({
      visibility: 'visible',
      height: 'auto'
    });

2

Bootstrap v3タブ内で使用する場合、以下が機能するはずです。

$('a[href="#tab-location"]').on('shown.bs.tab', function(e){
    var center = map.getCenter();
    google.maps.event.trigger(map, 'resize');
    map.setCenter(center);
});

どこtab-locationタブ含むマップのIDです。


2

John DoppelmannとHoffZが示したように、div表示関数またはonclickイベントに次のようにすべてのコードをまとめます。

setTimeout(function(){
var center = map.getCenter();
google.maps.event.trigger(map, 'resize');
map.setCenter(center);
});

それは私にとって完璧に機能しました


0

私の解決策は:

CSS:

.map {
   height: 400px;
   border: #ccc solid 1px;
}

jQuery:

$('.map').width(555); // width of map canvas

0

非表示のdivが表示された後にのみマップが読み込まれるのが好きではありませんでした。たとえば、カルーセルでは、それは実際には機能しません。

この私の解決策は、非表示要素にクラスを追加して非表示にし、代わりに絶対位置で非表示にしてから、マップをレンダリングし、マップのロード後にクラスを削除することです。

ブートストラップカルーセルでテスト済み。

HTML

<div class="item loading"><div id="map-canvas"></div></div>

CSS

.loading { display: block; position: absolute; }

JS

$(document).ready(function(){
    // render map //
    google.maps.event.addListenerOnce(map, 'idle', function(){
        $('.loading').removeClass('loading');
    });
}

0

マップを表示する場合は、このコード行を使用してください。

               $("#map_view").show("slow"); // use id of div which you want to show.
                    var script = document.createElement("script");
                    script.type = "text/javascript";
                    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
                    document.body.appendChild(script);

0
 $("#map_view").show("slow"); // use id of div which you want to show.
     var script = document.createElement("script");
     script.type = "text/javascript";
     script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
     document.body.appendChild(script);

0

最初の投稿。私のgoogleMap divは、タブがクリックされるまで、{display:none}のコンテナーdiv内にありました。OPと同じ問題がありました。これは私のために働きました:

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

このコードをコードの内側と末尾に貼り付けます。コンテナーのdivタブがクリックされ、非表示のdivが表示されます。重要なことは、initializeを呼び出す前にコンテナーdivを表示する必要があるということです。

ここや他のページで提案されているいくつかの解決策を試しましたが、うまくいきませんでした。これで問題が解決するかどうかお知らせください。ありがとう。


0

このコードをdivの前に追加するか、それをjsファイルに渡します。

<script>
    $(document).on("pageshow","#div_name",function(){
       initialize();
    });

   function initialize() {
   // create the map

      var myOptions = {
         zoom: 14,
         center: new google.maps.LatLng(0.0, 0.0),
         mapTypeId: google.maps.MapTypeId.ROADMAP
      }
      map = new google.maps.Map(document.getElementById("div_name"), myOptions);
   }


</script>

このイベントはdivが読み込まれた後にトリガーされるため、F5キーを押す必要なくマップコンテンツを更新します


0

地図を表示したら、住所をジオコーディングしてから地図の中心を設定します。google.maps.event.trigger(map, 'resize');私のために動作しませんでした。

私は使用しなければなりませんでした map.setZoom(14);

以下のコード:

document.getElementById('map').style.display = 'block';
var geocoder = new google.maps.Geocoder();
        geocoder.geocode({ 'address': input.value }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                var marker2 = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
                map.setZoom(14);
                marker2.addListener('dragend', function (event) {
                    $('#lat').val(event.latLng.lat());
                    $('#lng').val(event.latLng.lng());
                });

            }
        });

-1

function init_map() {
  var myOptions = {
    zoom: 16,
    center: new google.maps.LatLng(0.0, 0.0),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById('gmap_canvas'), myOptions);
  marker = new google.maps.Marker({
    map: map,
    position: new google.maps.LatLng(0.0, 0.0)
  });
  infowindow = new google.maps.InfoWindow({
    content: 'content'
  });
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map, marker);
  });
  infowindow.open(map, marker);
}
google.maps.event.addDomListener(window, 'load', init_map);

jQuery(window).resize(function() {
  init_map();
});
jQuery('.open-map').on('click', function() {
  init_map();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>

<button type="button" class="open-map"></button>
<div style='overflow:hidden;height:250px;width:100%;'>
  <div id='gmap_canvas' style='height:250px;width:100%;'></div>
</div>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.