Javascript关闭无法使用谷歌地图V3

时间:2010-08-29 15:08:14

标签: javascript google-maps

有人请告诉我这段代码我做错了吗?

我目前正在使用简单的JSON文件,使用Google maps V3 API为信息窗口提供数据。我知道闭包的概念,但似乎无法理解为什么信息窗口仍然显示最后一次点击结果。

这是我的JSON文件:

{ "markers": [
{
"lat": 51.5001524,
"lng": -0.1262362,
"firstName": "nameOne"
},
{
"lat": 55.8656274,
"lng": -4.2572227,
"firstName": "nameTwo"
},
{
"lat": 43.834526782236814,
"lng": -37.265625,
"firstName": "nameThree"
}
] }

这是我的JS:

(function(){

function initialize() {
    var latlng = new google.maps.LatLng(51.5001524, -0.1262362)

    var myOptions = {
      zoom: 3,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.TERRAIN
    }

    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

    function parseJson(){
        $.ajax({
            url: 'assets/js/markers.json',
            dataType: 'json',
            success: function(data) {
                processMarkers(data)
            }, 
            error: function (data) {
                console.log('fail')
            }
        })
    }

      function processMarkers(data){

        var totalMarkers = data.markers.length;
        for(i=0;i<totalMarkers;i++){
            var latitude = data.markers[i].lat;
            var longditude = data.markers[i].lng;
            var putMarker = new google.maps.LatLng(latitude, longditude);
            var thisMarker = new google.maps.Marker({
                  position: putMarker,
                  map: map
                });

            var firstName = data.markers[i].firstName;
            var infoWindow = new google.maps.InfoWindow({
                position: putMarker,
                content: firstName
            });

            new google.maps.event.addListener(
                thisMarker, 
                'click', 
                buildHandler(map, thisMarker));
        }

        function buildHandler(map, marker){
            return function(){
                infoWindow.open(map, marker);
            };
        }

    }

    parseJson();

  }

$(document).ready(function(){
    initialize();
});
})();

非常感谢任何帮助。

干杯

1 个答案:

答案 0 :(得分:1)

infoWindow是processMarkers范围中的一些变量。对于每个标记反复遍历相同的infoWindow,在最后一次迭代后将其孤立(并将其设置为最终标记)。孤儿无法死亡,因为它是在点击处理程序的关闭中捕获的。我不知道google api是否足以预测.open()应该发生什么。但是infoWindow在那一点看起来并不好......

编辑:事实上,在我看来,每个infoWindow,但最后一个成为垃圾收集器的受害者。或者它被引用到某个地方?我无法解决这个问题。

编辑:记住,JS没有{}范围(例如C)。它只有功能范围!!换句话说,只需将infoWndow传递给buildHandler()。