Javascript变量没有传播通过

时间:2010-07-22 12:09:28

标签: javascript openlayers

我正在使用带有Waze的OpenLayers(地图图层),并且存在一些不传播的变量问题。 我有这个代码:

    var lonlat = new Array(), infodiv = new Array();

    for (var i = 0; i < stations.length; i++)
    {
        if (i == 0)
            icon_temp = icon;
        else
            icon_temp = icon.clone();

        lonlat[i] = new OpenLayers.LonLat(stations[i].lon,stations[i].lat);
        infodiv[i] = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>";

        marker = new OpenLayers.Marker(lonlat[i],icon_temp);
        marker.setOpacity(0.8);

        marker.events.register('mousedown', marker, function(evt) {
            popup = new OpenLayers.Popup.FramedCloud(null,
                               lonlat[i],
                               null,
                               infodiv[i],
                               anchor=null,true,null);

            map.addPopup(popup);

            OpenLayers.Event.stop(evt); 

        });

        markers.addMarker(marker);
    }

代码应遍历'stations'数组并将标记添加到地图中。它运作得很好!

问题在于'lonlat'和'infodiv'数组。 'OpenLayers.Popup.FramedCloud'看不到它们 - 它返回null(使用FireBug检查)。如果我丢失数组并且每次只分配lonlat = ...和infodiv = ...就像这样:

    for (var i = 0; i < stations.length; i++)
    {
        if (i == 0)
            icon_temp = icon;
        else
            icon_temp = icon.clone();

        lonlat = new OpenLayers.LonLat(stations[i].lon,stations[i].lat);
        infodiv = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>";

        marker = new OpenLayers.Marker(lonlat,icon_temp);
        marker.setOpacity(0.8);

        marker.events.register('mousedown', marker, function(evt) {
            popup = new OpenLayers.Popup.FramedCloud(null,
                               lonlat,
                               null,
                               infodiv,
                               anchor=null,true,null);

            map.addPopup(popup);

            OpenLayers.Event.stop(evt); 

        });

        markers.addMarker(marker);
    }

它正在传播到FrameCloud函数并正在显示 - 但问题是它只显示最后的lonlat和infodiv(它就像它不包含它们的副本但保存实际对象 - 所以每次迭代“lonlat”和“infodiv”正在被最新信息所取代。

如何克服这个问题?

1 个答案:

答案 0 :(得分:3)

这是由于变量i的关闭。

引入另一个范围,例如

(function(i){
marker.events.register('mousedown', marker, function(evt) { 
                    popup = new OpenLayers.Popup.FramedCloud(null, 
                                       lonlat[i], 
                                       null, 
                                       infodiv[i], 
                                       anchor=null,true,null); 

                    map.addPopup(popup); 

                    OpenLayers.Event.stop(evt);  

                });
})(i);