Ну, ветка мертва, но, поскольку я потерял несколько часов на подобную проблему, мне хочется поделиться своим решением.
У меня есть jqueryui accordeon с googlemap на каждой панели.
Проблема заключается в том, что у них нет размера для скрытых панелей, и GoogleMap использует этот размер для отображения карт.
Таким образом, я сохраняю все «map» и «marker» (терминология gmaps) в индексированном массиве (var maps), и когда пользователь меняет панель соответствия, я «обновляю» соответствующую gmap.
Уловка в том, что изменение размера события недостаточно, вы должны принудительно изменить масштаб для перерисовки, и даже в этом случае из-за размера, который он имел на закрытой панели, ваш маркер для этой карты полностью за пределами экрана, поэтому вы перенастраивали его на основе маркера позиция.
$(document).ready(function(){
if($('div.map_canvas').length>0) initializeMap(); //init map
if($('#accordion').length>0) $("#accordion .items").accordion(); //init accordeon
$("#accordion .items").bind("accordionchange", function(event, Element) {
current=maps[Element.options.active];
google.maps.event.trigger(current.map, 'resize'); //resize
current.map.setZoom( current.map.getZoom() ); //force redrawn
current.map.setCenter(current.marker.getPosition()); //recenter on marker
})
});
var maps=Array();
function initializeMap() {
var geocoder;
$('div.map_canvas').each(function(index,Element) {
var address = $(Element).text();
var myOptions = {
zoom: 15,
navigationControl: true,
navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL },
mapTypeControl: true,
mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
scaleControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
geocoder = new google.maps.Geocoder();
geocoder.geocode({'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
myOptions.center = results[0].geometry.location;
map = new google.maps.Map(Element, myOptions);
marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
});
maps.push({marker:marker,map:map}); //save those
} else {
alert('The address could not be found for the following reason: ' + status);
}
});
})
}