我有一个页面,谷歌地图首先在一个隐藏的div内。单击链接后,然后显示div,但仅显示地图的左上方。
我尝试在单击后运行此代码:
map0.onResize();
要么:
google.maps.event.trigger(map0, 'resize')
有任何想法吗。这是显示带有隐藏地图的div后看到的图像。
我有一个页面,谷歌地图首先在一个隐藏的div内。单击链接后,然后显示div,但仅显示地图的左上方。
我尝试在单击后运行此代码:
map0.onResize();
要么:
google.maps.event.trigger(map0, 'resize')
有任何想法吗。这是显示带有隐藏地图的div后看到的图像。
Answers:
我自己进行了测试,这就是我的处理方法。非常简单,让我知道是否需要任何澄清
的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时调用google.maps.event.trigger(map, 'resize');
似乎可以为我解决问题。
google.maps.event.trigger($("#div_ID")[0], 'resize');
如果您没有可用的变量映射,则它应该是div
包含GMAP的中的第一个元素(除非您做了一些愚蠢的事情)。
我在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
});
'a[href="#profileTab"]'
为step-2
包含地图DIV的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();
})
如果您通过复制/粘贴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>
https://www.google.com/maps/embed/v1/place?..
我有同样的问题,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(....
....
}
我不知道这是否是更方便的方法,但是它有效!
使用jQuery,您可以执行以下操作。这有助于我将Umbraco CMS中的Google地图加载到无法立即显示的标签上。
function waitForVisibleMapElement() {
setTimeout(function () {
if ($('#map_canvas').is(":visible")) {
// Initialize your Google Map here
} else {
waitForVisibleMapElement();
};
}, 100);
};
waitForVisibleMapElement();
我的解决方案非常简单有效:
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
我不希望仅在隐藏的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');
});
}
要显示地图时,请使用此行代码。
$("#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);
$("#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);
在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
显示地图后,我正在对地址进行地理编码,然后设置地图中心。在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());
});
}
});
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>