closuresGoogle Maps API v3中的所有infowindows

我忙于一个脚本,将使我的网站上的谷歌地图canvas,与多个标记。 我希望当你点击一个标记,一个infowindow打开。 我已经这样做了,代码是在这个时候:

var latlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); function addMarker(map, address, title) { geocoder = new google.maps.Geocoder(); geocoder.geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ position: results[0].geometry.location, map: map, title:title }); google.maps.event.addListener(marker, 'click', function() { var infowindow = new google.maps.InfoWindow(); infowindow.setContent('<strong>'+title + '</strong><br />' + address); infowindow.open(map, marker); }); } else { alert("Geocode was not successful for the following reason: " + status); } }); } addMarker(map, 'Address', 'Title'); addMarker(map, 'Address', 'Title'); 

这工作100%。 但是现在我想要当一个infowindow被打开,而你想打开第二个,第一个自动closures。 但我还没有find办法做到这一点。 infowindow.close(); 将无济于事。 有人有这样的问题的例子或解决scheme?

infowindow是局部variables,窗口​​在closures时不可用()

 var latlng = new google.maps.LatLng(-34.397, 150.644); var infowindow = null; ... google.maps.event.addListener(marker, 'click', function() { if (infowindow) { infowindow.close(); } infowindow = new google.maps.InfoWindow(); ... }); ... 

声明全局variables:

 var mapOptions; var map; var infowindow; var marker; var contentString; var image; 

intialize使用地图的addEvent方法:

 google.maps.event.addListener(map, 'click', function() { if (infowindow) { infowindow.close(); } }); 

对于dynamic创buildinfowindows循环,声明一个全局variables

var openwindow;

然后在addListener函数调用(在循环中):

 google.maps.event.addListener(marker<?php echo $id; ?>, 'click', function() { if(openwindow){ eval(openwindow).close(); } openwindow="myInfoWindow<?php echo $id; ?>"; myInfoWindow<?php echo $id; ?>.open(map, marker<?php echo $id; ?>); }); 

我有一个dynamic循环,根据有多less人被input到CMS中创buildinfowindows和标记,所以我不想在每个事件点击时创build一个新的InfoWindow() ,如果发生请求, 。 相反,我试图知道每个实例的特定infowindowvariables会超出设置的位置数量,然后在打开正确的位置之前提示地图closures所有这些variables。

我的位置数组被称为位置,所以我在实际地图初始化之前设置的PHP来获取我的infowindowvariables名称是:

 for($k = 0; $k < count($locations); $k++) { $infowindows[] = 'infowindow' . $k; } 

然后在初始化地图等之后,在脚本中,我有一个PHP foreach循环使用计数器创builddynamic信息窗口:

 //...javascript map initilization <?php $i=0; foreach($locations as $location) { ..//get latitudes, longitude, image, etc... echo 'var mapMarker' . $i . ' = new google.maps.Marker({ position: myLatLng' . $i . ', map: map, icon: image });'; echo 'var contentString' . $i . ' = "<h1>' . $title[$i] . '</h1><h2>' . $address[$i] . '</h2>' . $content[$i] . '";'; echo 'infowindow' . $i . ' = new google.maps.InfoWindow({ '; echo ' content: contentString' . $i . ' });'; echo 'google.maps.event.addListener(mapMarker' . $i . ', "click", function() { '; foreach($infowindows as $window) { echo $window . '.close();'; } echo 'infowindow' . $i . '.open(map,mapMarker'. $i . '); });'; $i++; } ?> ...//continue with Maps script... 

所以,重点是,在我调用完整的地图脚本之前,我创build了一个数组,其中包含InfoWindow()创build时将输出的名称,如infowindow0, infowindow1, infowindow2, etc...

然后,在每个标记click事件之后, foreach循环会通过,并在完成下一步打开之前closures所有这些事件。 原来是这样的:

 google.maps.event.addListener(mapMarker0, "click", function() { infowindow0.close(); infowindow1.close(); infowindow2.close(); infowindow0.open(map,mapMarker0); } 

只是一种不同的做事方式,我想…但我希望它可以帮助别人。

我有类似以下的东西

 function initMap() { //...create new map here var infowindow; $('.business').each(function(el){ //...get lat/lng var position = new google.maps.LatLng(lat, lng); var content = "contents go here"; var title = "titleText"; var openWindowFn; var closure = function(content, position){. openWindowFn = function() { if (infowindow) { infowindow.close(); } infowindow = new google.maps.InfoWindow({ position:position, content:content }); infowindow.open(map, marker); } }(content, position); var marker = new google.maps.Marker({ position:position, map:map, title:title. }); google.maps.event.addListener(marker, 'click', openWindowFn); } } 

在我的理解中,使用这样的闭包允许在函数声明时捕获variables及其值,而不是依赖于全局variables。 所以当稍后调用openWindowFn时,例如在第一个标记上, contentpositionvariables具有它们在each()函数的第一次迭代期间所做的值。

我不确定openWindowFn是如何在其范围内进行的。 我也不确定自己做的事情是否正确,但即使在一个页面上有多个地图(每个地图都会获得一个开放的信息),它也能正常工作。

如果有人有任何见解,请评论。

我鼓励您在使用Google地图时尝试使用goMap jQuery插件。 对于这种情况,您可以在创build标记时将hideByClick设置为true:

 $(function() { $("#map").goMap({ markers: [{ latitude: 56.948813, longitude: 24.704004, html: { content: 'Click to marker', popup:true } },{ latitude: 54.948813, longitude: 21.704004, html: 'Hello!' }], hideByClick: true }); }); 

这只是一个例子,它具有很多function,如分组标记和操作信息窗口。

你应该点击你的地图 – $('#map-selector').click();

当处理标记簇时,这个为我工作。

 var infowindow = null; google.maps.event.addListener(marker, "click", function () { if (infowindow) { infowindow.close(); } var markerMap = this.getMap(); infowindow = this.info; this.info.open(markerMap, this); });