web-dev-qa-db-ja.com

Twitterで作成したモーダルでGoogleマップを表示するBootstrap

Twitter Bootstrapを使用して、Googleマップをモーダルに挿入しようとしています。モーダルは、存在するマップの形状とともに表示されますが、マップの一部のみが表示され、残りは灰色です。画面のサイズを変更すると、マップは常に正しく表示されますが、間違った場所に中央揃えされます。

私は検索して、マップのサイズ変更イベントの呼び出し、マップ画像の最大幅をnoneに設定するなどの提案を見つけましたが、これまでのところこれらの提案はいずれも役に立ちませんでした。隠されている要素内にある限り、マップは正しいサイズを把握できていないようです。

JS

function initialize() {
  var mapOptions = {
    center: new google.maps.LatLng(51.219987, 4.396237),
    zoom: 12,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map(document.getElementById("mapCanvas"),
    mapOptions);
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(51.219987, 4.396237)
  });
  marker.setMap(map);
}

HTML

<div class="modal hide fade" id="myModal">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal">×</button>
    <h3></h3>
  </div>
  <div class="modal-body">
    <div id="mapCanvas" style="width: 500px; height: 400px"></div>
  </div>
  <div class="modal-footer">
    <a href="#" class="btn" data-dismiss="modal">Close</a>
  </div>
</div>

Twitter Bootstrap v2.0.4。を使用しています。Googleマップがそのままになるように、サイズ変更イベントを正しくトリガーしたり、CSSを編集したりできないため、助けが必要です。

59
Eels

実際、Googleマップは、動的要素(たとえば、サイズ変更、フェードなど)内に配置されると「グレー」領域を表示します。アニメーションが完了したら呼び出される必要がある「サイズ変更」関数をトリガーするのは正しいことです(Bootstrap 3またはshownの_shown.bs.modal_イベント- イベント in Bootstrap 2):

_$("#myModal").on("shown.bs.modal", function () {
    google.maps.event.trigger(map, "resize");
});
_

Bootstrap 2では、次のようにします。

_$('#myModal').on('shown', function () {
    google.maps.event.trigger(map, "resize");
});
_

(ここで、mapはマップの変数名です(詳細については Googleマップのドキュメント を参照してください)。_#myModal_は要素のIDです)。

UPDATE 2018-05-22

Maps JavaScript APIバージョン3.32の新しいレンダラーリリースでは、resizeイベントはMapクラスの一部ではなくなりました。

ドキュメントの状態

マップのサイズが変更されると、マップの中心が固定されます

  • フルスクリーンコントロールが中心を保持するようになりました。

  • サイズ変更イベントを手動でトリガーする必要がなくなりました。

ソース: https://developers.google.com/maps/documentation/javascript/new-renderer

google.maps.event.trigger(map, "resize");は、バージョン3.32以降では効果がありません

108
MarcoK

私にとっては、このように動作します(ブートストラップ3):

$("#contact-modal").on("shown.bs.modal", function () {
    google.maps.event.trigger(map, "resize");
});
43
henrikstroem

マップを正しく表示し、centered

元の回答に基づいて、Bootstrap 3( modals usage について確認してください)で動作するように、私が行ったいくつかの変更を指摘したかったです。

// Resize map to show on a Bootstrap's modal
$('#map-modal').on('shown.bs.modal', function() {
  var currentCenter = map.getCenter();  // Get current center before resizing
  google.maps.event.trigger(map, "resize");
  map.setCenter(currentCenter); // Re-set previous center
});

この場合、Jan-Henkの最初の回答に対するコメントで提案された この質問 に基づいて、マップの再センタリングも行います。

38
Roberto S.

Bootstrap 3を使用する場合、ドキュメント内で提供されているものを使用する必要があります。

例:

 $('#modal').on('shown.bs.modal', function () { 
     initialiseMap();
 });
8
user2956820

受け入れられた答えは灰色のボックスを取り除きましたが、私にとって正しい座標で地図を中央に配置しません。私の解決策は、モーダルの表示が完了するまで、マップのレンダリングを待つことでした。

$('#modal').on('shown', function () {
    initialize();
});
5
andrewtweber

実際、divの内容がローカルである場合、受け入れられた答えは機能します。残念ながら、リモートデータの一部として含まれているマップを表示するのと同じ問題がありました。マップのハンドルを取得してresizeを呼び出すと、マップが正しく中央に配置されませんでした。リモートデータの状況でこの問題を修正した方法を次に示します。

マップを初期化する機能を備えたリモートデータの一部としてスクリプトタグを含める

<script type="text/javascript">
    function renderMap() {
        var point = new google.maps.LatLng(51.219987, 4.396237);
        var map = new google.maps.Map(document.getElementById('map'), {
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            zoom: 13,
            center: point
        });
        var marker = new google.maps.Marker({ position: point, map: map, icon: 'http://www.google.com/intl/en_us/mapfiles/ms/icons/red-dot.png' });
    }
</script>

メインページのダイアログの表示されたイベントで関数を呼び出す

<script type="text/javascript">

    $(document).ready(function () {
        $('#dlgReportInfo').on('shown', function () {
            renderMap();
        });
    })
</script>

この方法では、マップは初期化する前にダイアログで既にサイズ変更されています。うまくいけば、これが同様の状況にある他の人を助けるでしょう。

5
Jason Butera

次のコードは、bootstrap 3

$("#mapModal").on("shown.bs.modal", function () {initialize();});
5
Jakki
    this works for me 
    **<!-- Modal -->**
    <div class="modal fade" id="myModal" role="dialog">
        <div class="modal-dialog">

            <!-- Modal content-->
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <h4 class="modal-title">Google Maps</h4>
                </div>
                <div class="modal-body">

                    <div id="map_canvas" style="width:auto; height: 500px;"></div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>


**Button**
 <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">View Map</button>

**javascript**
<script type="text/javascript">
    function initializeMap() {
        var mapOptions = {
            center: new google.maps.LatLng(51.219987, 4.396237),
            zoom: 12,
            mapTypeId: google.maps.MapTypeId.HYBRID
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"),
          mapOptions);
        var marker = new google.maps.Marker({
            position: new google.maps.LatLng(51.219987, 4.396237)
        });
        marker.setMap(map);
    }

    //show map on modal
    $('#myModal').on('shown.bs.modal', function () {
        initializeMap();
    });

</script>

これが役立つことを願って

4
Jerrilyn

私は解決策を修正しました:

$('#myId').on('shown.bs.modal', function () { 
    initializeMap() // with initializeMap function get map.
});

//イベントshown.bs.modal on modal bootstrap=はモーダルショーの後に表示されます。show.bs.modalは使用されません。モーダルショーの前に呼び出します。

3
Dinh Vu Duc

これを試して !

<div class="modal fade" id="map_modal" tabindex="-1" role="dialog" aria-    labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
        </div>
        <div class="modal-body"><div id="map_canvas" style="width:530px; height:300px"></div></div>

    </div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
var map = marker = new Array();
geocoder = NULL;


                    function addPoint(location, id, mapId) {
                        if (!marker[id]) {
                            marker[id] = new google.maps.Marker({
                                position: location,
                                map: map[mapId],
                                draggable: true
                            });
                        }

                    }


                    function placeMarker(location, editStr, id) {
                        if (!marker[id]) {
                            marker[id] = new google.maps.Marker({
                                position: location,
                                map: map[id],
                                draggable: false
                            });
                        }
                        marker[id].setPosition(location);
                        map[id].setCenter(location);
                        $("#longitud").val(location.lat());
                        $("#latitud").val(location.lng());


                    }


                    function  initializeMap(id, div_id, lat, lng, editStr) {
                        if (!geocoder)
                            geocoder = new google.maps.Geocoder();

                        if (!map[id]) {
                            var coordinates = new google.maps.LatLng(lat, lng);
                            var myOptions = {zoom: 8, center: coordinates, mapTypeId: google.maps.MapTypeId.ROADMAP}
                            map[id] = new google.maps.Map(document.getElementById(div_id), myOptions);
                            google.maps.event.addListener(map[id], 'click', function(event) {
                                placeMarker(event.latLng, editStr, id);
                            });

                            placeMarker(coordinates, editStr, id);

                        }
                    }


                    $('#map_modal').on('shown.bs.modal', function(e) {
                        initializeMap("#newMaps", "map_canvas", 10.444598, -66.9287, "");
                    })
1
Carlos Avalos

私も同じ問題に直面していますが、マップの「アイドル」状態を待って(つまり、終了したとき)、サイズ変更を呼び出して解決します:

 google.maps.event.addListenerOnce(map, 'idle', function () {
                 var currentCenter = map.getCenter();
                 google.maps.event.trigger(map, 'resize');
                 map.setCenter(currentCenter);

                 map.setZoom(15);
             });

              map = new google.maps.Map(document.getElementById('map-canvas2'),mapOptions);
1
Sunil Devre