通过onClick事件显示不同的地图-谷歌地图V3



尝试根据单击事件显示4个不同的映射。虽然我确实发生了这种特殊的交互,但地图本身没有正确居中,也无法在中央实际加载地图。

我目前做到这一点的方式有点像黑客,因为我在JS方面不是最棒的,在谷歌地图集成方面也很新,所以如果代码很糟糕,请原谅。请随时提供更好、更优雅的解决方案。

到目前为止,我已经做到了:-创建并初始化了四个不同的映射。-用关联地图绘制关联标记(餐饮地图获取餐厅位置等)。-当点击相关导航元素时,地图应显示(点击用餐,用餐地图显示)

这是有效的,但地图显示不正确。现场演示。

HTML:

<section class="recommend-map">
<div class="col-one">
<h1>Recommends Map</h1>
<ul>
<li><a href="#" class="map-canvas">Map 1</a></li>
<li><a href="#" class="map-canvas-2">Map 2</a></li>
<li><a href="#" class="map-canvas-3">Map 3</a></li>
<li><a href="#" class="map-canvas-4">Map 4</a></li>
</ul>
</div>
<div class="col-two">
<div class="content1" id="map-canvas" style="width: 550px; height: 300px;" data-location="javitz">
</div>
<div class="content2" id="map-canvas-2" style="width: 550px; height: 300px;" data-location="javitz">
</div>  
<div class="content3" id="map-canvas-3" style="width: 550px; height: 300px;" data-location="pier92">
</div>
<div class="content4" id="map-canvas-4" style="width: 550px; height: 300px;" data-location="pier94">
</div>
</div>
</section>

JS:

function initialize() {
// removed actual array data for brevity, it was a lot. 
var dining = [
["Yankee Stadium",  40.829584,-73.927571],
["South Street Seaport", 40.70514,-74.008734],
["Musical", 40.762341,-73.978329],
["Frick collection!", 40.771385,-73.967171]
];
var drinks = [
["Central Park ", 40.78678,-73.966312],
["Broadway Shows",  40.765461,-73.984337],
["Broadway musicals", 40.762471,-73.970947],
["Musical", 40.736169,-74.001621]
];
var roofOutdoor = [
["The Ballet",  40.73495,-73.998671],
["Central Park",  40.78678,-73.966312],
["Broadway shows",  40.756685,-73.987813],
["Galapagos artspaace",   40.703871,-73.990924]
];
var leisure = [
["Chelsea Girl",  40.725169,-74.003005],
["What Goes Around Comes Around", 40.722925,-74.00323],
["The Library", 40.752166,-73.981708]
];
var mapCenter = new google.maps.LatLng(40.75688,-73.984264);
var map = new google.maps.Map(document.getElementById('map-canvas'), {
zoom: 12,
center: mapCenter,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var map2 = new google.maps.Map(document.getElementById('map-canvas-2'), {
zoom: 13,
center: mapCenter,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var map3 = new google.maps.Map(document.getElementById('map-canvas-3'), {
zoom: 13,
center: mapCenter,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var map4 = new google.maps.Map(document.getElementById('map-canvas-4'), {
zoom: 13,
center: mapCenter,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infowindow = new google.maps.InfoWindow();
var marker, marker2, marker3, marker4, i;

// Map1 Markers
for (i = 0; i < dining.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(dining[i][4], dining[i][5]),
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent("<h1>" + dining[i][0] + "</h1><p>" + dining[i][1] + "</p><p>" + dining[i][2] + "</p><p>" + dining[i][3] + "</p>");
infowindow.open(map, marker);
}
})(marker, i));
}
// Map2 Markers
for (i = 0; i < drinks.length; i++) {
marker2 = new google.maps.Marker({
position: new google.maps.LatLng(drinks[i][1], drinks[i][2]),
map: map2
});
google.maps.event.addListener(marker2, 'click', (function(marker2, i) {
return function() {
infowindow.setContent(drinks[i][0]);
infowindow.open(map2, marker2);
}
})(marker2, i));
}
// Map3 Markers
for (i = 0; i < roofOutdoor.length; i++) {
marker3 = new google.maps.Marker({
position: new google.maps.LatLng(roofOutdoor[i][1], roofOutdoor[i][2]),
map: map3
});
google.maps.event.addListener(marker3, 'click', (function(marker3, i) {
return function() {
infowindow.setContent(roofOutdoor[i][0]);
infowindow.open(map3, marker3);
}
})(marker3, i));
}
// Map4 Markers
for (i = 0; i < leisure.length; i++) {
marker4 = new google.maps.Marker({
position: new google.maps.LatLng(leisure[i][1], leisure[i][2]),
map: map4
});
google.maps.event.addListener(marker4, 'click', (function(marker4, i) {
return function() {
infowindow.setContent(leisure[i][0]);
infowindow.open(map4, marker4);
}
})(marker4, i));
}
}
google.maps.event.addDomListener(window, 'load', initialize);
});

我以前做过。

我使用jquery作为我的客户端JS。

HTML首先,我会尝试同时渲染所有地图。对简单地使它们都可见,这样它们就可以相互推动。

CSS第二,您有"position:absolute;"try"position:inline block;">

JS最后,

在JS代码顶部最初要隐藏的3个映射上调用"$("SELECTOR NAME").hide();"。

然后"$("SELECTOR NAME").thoggle();"打开或关闭其他选项。

原因:我相信现在发生的事情是,您已经生成了3个最初隐藏的映射,这样当客户端加载页面时,DOM实际上就没有生成的内容。生成的DOM对象需要委派操作。第一个映射运行良好,因为它是用DOM生成的

今晚我可以给你一个实际的代码示例,对不起,我在atm工作。

您可以简单地拥有1个谷歌地图,并在其上取消设置和设置标记。使用marker.setMap(null)从地图中取消设置标记。您必须在数组中跟踪这些标记。

类似这样的东西:

var markers = []; // To keep all markers
// array can be your array of 'dining', 'drinks', 'roofOutdoor' or 'leisure' which you could set by clicking on your a tag.
function setMarkers (array) {
$.each(markers, function (index, marker) {
// unset marker (they will be removed from the map)
marker.setMap(null);
});
if (array !== undefined) {
var bounds = new google.maps.LatLngBounds();
$.each(array, function (index, value) {
var pos = new google.maps.LatLng(value[1], value[1]);
bounds.extend(pos);
var marker = new google.maps.Marker({
position: pos,
map: map
});
markers.push(marker);
});
map.fitBounds(bounds);
}
}

我添加bounds只是为了转到标记,所以您可以确保它们已添加到地图中。

HTML:

<a href="javascript:;" onclick="setMarker(dining);">Show dining markers</a>

希望这能有所帮助。

如果您想以相同的方式实现它,这里有一个解决方案。

这是第二张地图的按钮

<button id="map2">map2</button>

一些内联js隐藏地图2 3 4并留下1渲染的

$('#2,#3,#4').hide();

这将显示id为"2"的div和隐藏父元素中其他所有内容之间的内容

$("#map2").click(function() {
$('#2').show().siblings().hide();
});

这是你的地图容器

<div class="map" id="2"> your map here </div> 

所以,如果你想保持事情的大部分方式,这是最简单的。尽管效率很低,如果你超过限制,它可能会导致谷歌停止解决你的API请求。(他们确实限制了每天提供的请求数量)

putvade的解决方案要优雅得多。你肯定应该使用他的解决方案:P

所以我找到了一个解决方案,这要归功于@MatUtter。

老实说,这是一个非常糟糕的破解。通常他们对我不太满意。但目前我需要一些"有效"的东西,因为我正在进行全站点重构(对公司来说是这样)。

基本上,我已经意识到(多亏了@MatUtter),当运行$("SELECTOR").hide()时;它正在从DOM中移除一个元素。按照预期,但谷歌地图很难重新绘制地图,因为它最初在那里,然后被删除,然后重新绘制。至少这是我的理解。

所以现在,我选择每个map元素,用"visibility:hidden"隐藏它们,因为这将允许每个map在DOM中保持它们的位置,但将它们从视图中删除。单击每个关联的链接后,它会显示相应的地图。

这肯定是一个黑客攻击,但现在可以了。谢谢大家的帮助!

该网站的最新版本在这里,如果你有任何其他反馈或重构,最好告诉我。我总是对修改持开放态度,今年是JS的一年,所以我很高兴学习:)

最新更新