60

我正在尝试使用 Twitter Bootstrap 将 Google 地图插入到模式中。模态显示地图的形状,但只显示地图的一部分,其余部分是灰色的。调整屏幕大小时,地图始终正确显示,尽管居中位置错误。

我已经搜索并找到了一些建议,例如调用地图的调整大小事件,或者将地图图像的最大宽度设置为无,但到目前为止,这些建议都没有帮助。只要地图位于隐藏的元素中,似乎就无法确定它的正确大小。

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。我需要一些帮助,因为我未能正确触发调整大小事件或编辑 css 以使 Google 地图不受影响。

4

11 回答 11

110

谷歌地图在放置在动态元素内时确实会显示“灰色”区域(例如:调整大小、淡入淡出等的元素)。shown.bs.modal你是正确的触发“调整大小”功能,一旦动画完成( Bootstrap 3中的shown 事件或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)。

更新 2018-05-22

随着 Maps JavaScript API 3.32 版中的新渲染器版本的发布,调整大小事件不再是Map类的一部分。

该文件指出

调整地图大小时,地图中心固定

  • 全屏控制现在保留中心。

  • 不再需要手动触发调整大小事件。

来源:https ://developers.google.com/maps/documentation/javascript/new-renderer

google.maps.event.trigger(map, "resize");从版本 3.32 开始没有任何效果

于 2012-07-31T14:59:21.540 回答
43

对我来说,它是这样工作的(Boostrap 3):

$("#contact-modal").on("shown.bs.modal", function () {
    google.maps.event.trigger(map, "resize");
});
于 2013-09-27T10:19:56.560 回答
38

正确显示地图并居中

我想指出我根据原始答案所做的一些修改,以使其与 Bootstrap 3 一起使用(检查模态用法)。

// 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 对第一个答案的评论中提出的这个问题来处理地图的中心化。

于 2013-08-08T18:42:48.140 回答
8

使用 Bootstrap 3 时,您需要使用其文档中提供的内容,即使用 'shown.bs.modal' 而不是 'shown'

例子:

 $('#modal').on('shown.bs.modal', function () { 
     initialiseMap();
 });
于 2013-11-05T15:11:57.937 回答
5

以下代码适用于引导程序 3

$("#mapModal").on("shown.bs.modal", function () {initialize();});
于 2014-04-27T01:06:40.907 回答
5

确实,在 div 的内容是本地内容的情况下,接受的答案确实有效。不幸的是,我在显示作为远程数据一部分包含的地图时遇到了同样的问题。获取地图的句柄并调用调整大小没有正确地居中我的地图。这是我在远程数据情况下解决问题的方法。

将脚本标签作为远程数据的一部分包含在初始化地图的函数中

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

这样,地图在初始化之前就已经在对话框中调整了大小。希望这将帮助任何其他有类似情况的人。

于 2012-10-15T15:02:34.683 回答
5

接受的答案摆脱了灰色框,但没有将地图居中在正确的坐标上。我的解决方案是等到模态显示完成后再渲染地图。

$('#modal').on('shown', function () {
    initialize();
});
于 2013-04-19T17:53:12.910 回答
4
    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>

希望这会有所帮助

于 2015-05-26T00:29:12.503 回答
3

我已经修复了解决方案:

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

// modal bootstrap 上的event shown.bs.modal将在modal show 后触发,不要使用show.bs.modal,因为它会在modal show 之前调用。

于 2015-07-28T05:30:48.910 回答
1

尝试这个 !

<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, "");
                    })
于 2013-12-10T16:05:41.967 回答
1

我也面临同样的问题,但我通过等待地图的“空闲”状态(即完成时)然后调用调整大小来解决它:

 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);
于 2014-03-22T10:00:56.320 回答