Javascript:通过数组循环来创建监听器,通过引用和值调用问题?

时间:2012-01-25 16:41:07

标签: javascript google-maps

for (var i=0; i<layerCount; i++){
    for (var j=0; j<layerData[i].data.length; j++){
        var text = layerData[i].data[j].text;
        var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
        var marker = new google.maps.Marker({map: map, position: latlng});
        var infowindow = new google.maps.InfoWindow({content: text});
        google.maps.event.addListener(marker, 'click', function() {infowindow.open(map,marker);});
    }
}

上述代码中的问题很可能出现在以google.maps.event.addListener开头的行中。无论我点击哪个标记,我都会在layerdata[i].data[j]的数据字段中打开最后一个项目的信息窗口。好像我通过引用调用而不是通过值调用,因此所有侦听器的infowindowmarker都是数组中的最后一项。

但我该如何解决这个问题?

非常感谢!

2 个答案:

答案 0 :(得分:3)

您必须创建closure

for (var i=0; i<layerCount; i++){
    for (var j=0; j<layerData[i].data.length; j++){
        var text = layerData[i].data[j].text;
        var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
        var marker = new google.maps.Marker({map: map, position: latlng});
        var infowindow = new google.maps.InfoWindow({content: text});

        bindOpenWindow(infowindow, map, marker);
    }
}

function bindOpenWindow(infowindow, map, marker)
{
    google.maps.event.addListener(marker, 'click', function() {infowindow.open(map, marker);});
}

看看它是否有帮助;)

答案 1 :(得分:1)

JavaScript没有块范围的概念,只有函数和全局范围。您可以使用闭包来解决它:

for (var i = 0; i < layerCount; i++){
    for (var j = 0; j < layerData[i].data.length; j++){
        var text = layerData[i].data[j].text;
        var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
        var marker = new google.maps.Marker({map: map, position: latlng});
        var infowindow = new google.maps.InfoWindow({content: text});
        google.maps.event.addListener(marker, 'click', (function(infowindow, marker) {
            return function() {infowindow.open(map, marker);};
        })(infowindow, marker));
    }
}