如何在隐藏的div中处理google map(更新图片)


127

我有一个页面,谷歌地图首先在一个隐藏的div内。单击链接后,然后显示div,但仅显示地图的左上方。

我尝试在单击后运行此代码:

    map0.onResize();

要么:

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

有任何想法吗。这是显示带有隐藏地图的div后看到的图像。替代文字


对此,已经有很多疑问,包括从隐藏区域显示Google地图
Matt Ball 2010年

@Matt Ball-更新后,我尝试在此处添加调整大小事件,但仍然无法正常工作
leora 2010年

@Matt Ball-我确实做到了这一点。创建谷歌地图对象后,我将其存储在全局变量中,以便以后可以再次引用它,并且现在调用resize似乎可以工作。我试图不必每次显示地图对象时都重新创建它,因为我允许人们来回切换。
leora

@ooo使用下面的代码非常简单。您只需添加一个if条件即可检查地图对象是否已初始化。这是一个现成的代码,用于解决您的最初问题,即正确加载地图。
Philar

@ philar-yup。。谢谢这里。。因此,赞成:)。无论哪种方式,我都需要在全局级别存储变量以避免重新初始化
leora 2010年

Answers:


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>

Java脚本

<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时实例化地图吗?有什么方法可以使地图对象仅实例化一次(在页面加载时)吗?
lucas

1
如果您正在调用show()以便留出时间调整大小,我也可以建议setTimeout延迟来调用第二个函数。
Eric.18

126

我遇到了同样的问题,并发现在显示div时调用google.maps.event.trigger(map, 'resize');似乎可以为我解决问题。


64
为了在调整大小后立即保持地图的原始中心,请考虑以这种方式扩展resize语句:var center = map.getCenter(); google.maps.event.trigger(map,'resize'); map.setCenter(center);
John Doppelmann

10
不知道为什么,但是我需要将解决方案包装在小的setTimeout中以使其起作用:setTimeout(function(){google.maps.event.trigger(map,'resize')},100);
HoffZ 2014年

@JohnDoppelmann感谢您的提示!为什么不保持中心,以及如何迫使中心退回,这并不直观。
2014年

触发“调整大小”事件后,再次设置地图中心和缩放级别。有关更多信息,请参见:code.google.com/p/gmaps-api-issues/issues/detail?
id=1448

@HoffZ这可能是由于您在显示效果之前触发了调整大小的代码,超时将其延迟到执行显示之前,然后调整大小可以使其正常工作。您可能可以通过更改代码的执行顺序来实现相同的效果,以确保在触发事件时,在调整地图大小之前执行div显示。
Bardo 2015年

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

如果您没有可用的变量映射,则它应该是div包含GMAP的中的第一个元素(除非您做了一些愚蠢的事情)。


您确定可以在div而不是google.map.Map对象上触发元素吗?
Salman 2014年

@SalmanA-刚刚检查了一下,它对我有用(尽管地图似乎有一个新的中心)。从以前的研究中,我不知道这是可能的,或者对CSN如此称赞
Hal

CS N ...这对我有用,但是,中心位置留在了错误的位置。我的地图像OP的屏幕快照一样进行初始化,并且就像在中心一样:在map_canvas的左上角居中。关于如何使其居中绘制的想法?
柯克·罗斯

13

我在Bootstrap选项卡中有一个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”,以使其对于隐藏在非活动选项卡中的地图起作用。谢谢
Nicola

我正在使用SmartWizard 4,这是唯一对我有用的解决方案,效果很好!我更改'a[href="#profileTab"]'step-2包含地图DIV的DIV的名称。
GeospatialPython.com

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);
    }
}

如何收听调整大小事件

角度(ng-show或ui-bootstrap折叠)

直接绑定到元素的可见性,而不是绑定到ng-show的值,因为$ watch可以在更新ng-show之前触发(因此div仍然不可见)。

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

jQuery .show()

使用内置的回调

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

Bootstrap 3模态

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

您的bootstrap 3模态调整大小方法完美地解决了我的问题,而其他大多数建议却没有解决。谢谢!
BrianLegg '16

6

如果您通过复制/粘贴iframe代码插入了Google Map,并且不想使用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而仅将iframe与src url结合使用的人而言,最佳解决方案https://www.google.com/maps/embed/v1/place?..
gsinha 2015年

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等待一次。
乔·奥斯汀

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地图,该地图没有显示地图,但仅显示了灰色背景,并且在左角仅显示了Marker和Google徽标。我将选项卡内容div设置为在可见时初始化地图,并且效果很好。示例
Gorgon_Union '16

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张,隐藏了地图,我不想每次显示地图时都对其进行初始化。这是一则旧文章,但我希望它对正在寻找的人有所帮助。


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可见后才能加载地图。例如,在轮播中,这实际上是行不通的。

我的解决方案是将类添加到隐藏元素中,以取消隐藏它,并使用绝对位置将其隐藏,然后渲染地图,并在地图加载后删除该类。

在Bootstrap Carousel中测试。

的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。重要的是您的容器div必须在调用initialize之前可见。

我尝试了此处和其他页面提出的许多解决方案,但这些解决方案对我不起作用。让我知道这是否适合您。谢谢。


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.