我的项目使用JSON提要来获取有关指定纬度和经度边界内地震的信息,本质上是一个盒子。我获取此信息,并将所有结果转换为Google地图上的标记。我还需要每个标记还显示一些其他信息,因此我尝试使用内置的InfoWindow对象,以便在单击标记时打开带有该标记相关信息的工具提示。但是,我发现无论单击什么标记,相同的信息窗口始终位于该组的相同标记之上,并且我相信它始终是循环中创建的最后一个信息窗口。这是代码。
$.getJSON(url, function(json) { for(var i = 0; i < json.earthquakes.length; i++) { var pos = new google.maps.LatLng(json.earthquakes[i].lat, json.earthquakes[i].lng); var info = json.earthquakes[i].lat + ", " + json.earthquakes[i].lng; var marker = new google.maps.Marker({ map: map, position: pos, title: json.earthquakes[i].eqid }) var tooltip = new google.maps.InfoWindow({ content: info }) google.maps.event.addListener(marker, 'click', function() { tooltip.open(map, marker); }); markers.push(marker); tooltips.push(tooltip); } });
markers是地图上所有标记对象的数组,工具提示是用于存储信息窗口对象的另一个数组。他们是全球性的。
这是google-maps标记中的一个非常常见的问题,很容易犯:)。
发生的事情是您的click事件被异步调用,并且它正在getJSON回调(列表中的最后一个)中的marker变量中获取当前值。
您需要将addListener调用包装在一个函数中,以便围绕单击回调中使用的标记变量创建一个闭包:
function listenMarker (marker) { // so marker is associated with the closure created for the listenMarker function call google.maps.event.addListener(marker, 'click', function() { tooltip.open(map, marker); }); }
然后从主getJSON回调(当前正在调用addListener)中调用listenMarker。