且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-01-17 14:24:52

您必须创建一个封闭:(var i = 0; i< layerCount; i ++){
for(var) j = 0; 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);



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

看看是否有帮助;)


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);});
    }
}

The problem in the above code most likely is in the line starting with google.maps.event.addListener. Whichever marker I click, I get a infowindow opening up for the last item in the data field of layerdata[i].data[j]. Seems like I am calling by reference and not by value, so infowindow and marker for all listeners are the last items in the arrays.

But how can I solve this?

many thanks!

You have to create a 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);});
}

See if it helps ;)