我有一些谷歌地图/ Javascript问题。我想我知道问题是什么,但只是不知道如何绕过它。
我的问题的一个例子是here。无论你点击什么标记,第二个出现。我显然将错误的信息传递给我的事件监听器,但我似乎无法正确获取代码。这是代码的缩减部分:
首先,这是我代码的一部分:
if (GBrowserIsCompatible() && mapResults != null) {
// Read in the JSON
var mapDetailsArray = loadJSON();
// Create a map
var map = new google.maps.Map2(document.getElementById(elementId));
map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(),
mapDetailsArray[0].getLongitude()), 13);
map.addControl(new google.maps.SmallMapControl());
// Add the points and center
var mgr = new google.maps.MarkerManager(map);
var bounds = new google.maps.LatLngBounds();
for ( var i = 0; i < mapDetailsArray.length; i++) {
var mapDetails = mapDetailsArray[i];
var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails
.getLongitude());
bounds.extend(point);
// Create our marker
var marker = new google.maps.Marker(point);
// What action do we use to show the hover
var infoAction = "mouseover";
marker.value = mapDetails;
google.maps.Event.addListener(marker, infoAction, function() {
alert(marker.value);
map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
});
mgr.addMarker(marker, 1);
}
mgr.refresh();
}
“marker.value”总是最终设置为mapDetails的最后一个值。如果有的话,我希望它一旦循环结束就“未定义”,那么这个价值不应该消失吗?我已经尝试了各种不同的值(例如marker.value = i + 1;)但它仍然会以两个点的相同值出现。
有没有人知道如何将正确的值传递给事件监听器?
答案 0 :(得分:6)
改变这个:
google.maps.Event.addListener(marker, infoAction, function() {
alert(marker.value);
map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
});
到此:
google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() {
alert(marker.value);
map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
}})(marker, point, map));
这将创建你想要的闭包。
为清晰起见拆分:
var f = function(marker, point, map)
{
return function()
{
alert(marker.value);
map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
}
}
google.maps.Event.addListener(marker, infoAction, f(marker, point, map));
答案 1 :(得分:3)
上述答案不是很直观 - 正如格雷格所说。
当您向对象添加事件时,该对象将向下传递,以便您可以通过闭包中的“this”访问它。如果您将“marker.value”替换为“this.value”,则问题将得到解决。如果你需要传递更多的东西,你将它绑定到对象并传递下去:
marker.a = 1
marker.b = 2
marker.c = 3
在闭包内,this.a将为1,依此类推......