谷歌地图不显示标记的描述


Google maps not displaying description of markers

我想在单击标记时显示标题/描述。标记正在显示,但单击时未显示说明。我在控制台日志中看到错误消息是"未捕获的类型错误:无法读取第 40 行上未定义的属性'0'",我不知道我的代码出了什么问题,谁能帮我?

   var locations = [
      ['Asia','Asia'],
      ['America','America'],
      ['India','India']
    ];
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 1,
      center: new google.maps.LatLng(0,0),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var infowindow = new google.maps.InfoWindow();
    var marker, i;
    for (i = 0; i < locations.length; i++) { 
    	var url = 'http://maps.googleapis.com/maps/api/geocode/json?address='+locations[i][1]+'&sensor=false';
        $.getJSON(url, function (data) {
            var p = data.results[0].geometry.location;
            var latlng = new google.maps.LatLng(p.lat, p.lng);
            marker = new google.maps.Marker({
                position: latlng,
                map: map
            }); 
         google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
          }
          })(marker, i));
       });
    }
#map{
   height:400px;
   width:500px; 
}
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> </script>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.2.1.min.js"></script>
<div id="map"></div>
<

要理解为什么它不起作用,我们需要了解闭包是如何工作的。

闭包可以访问自己的作用域(在其大括号之间定义的变量),可以访问外部函数的变量,以及访问全局变量。

需要注意的重要一点是,即使在外部函数返回并存储对实际变量的引用之后,闭包也可以访问外部函数的变量。

现在在你的代码中,JavaScript 中的 for 循环没有作用域,变量只声明一次。

现在重要的是,在所有同步代码完成之前,异步代码无法运行。因此,当getJSON回调运行时,因为它们对同一变量i有一个闭包,所以它们都使用当前值i,因为回调在循环完全完成创建回调后运行。

现在为了解决这个问题,我们可以放置一个新函数来运行它自己的范围,以便在循环内的回调中,每个不同的值都有一个新的闭包。

这是更新的代码。修改了getJSON部分并添加了所需的闭包。

   var locations = [
      ['Asia','Asia'],
      ['America','America'],
      ['India','India']
    ];
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 1,
      center: new google.maps.LatLng(0,0),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var infowindow = new google.maps.InfoWindow();
    var marker, i;
    for (i = 0; i < locations.length; i++) { 
    	var url = 'http://maps.googleapis.com/maps/api/geocode/json?address='+locations[i][1]+'&sensor=false';
        $.getJSON(url, (function (i) {
             return function(data) {
                var p = data.results[0].geometry.location;
                var latlng = new google.maps.LatLng(p.lat, p.lng);
                marker = new google.maps.Marker({
                    position: latlng,
                    map: map
                });
                 
                 
            google.maps.event.addListener(marker, 'click', (function (marker, i) {
                return function () {
                    console.log(i);
                    console.log(locations)
                    infowindow.setContent(locations[i][0]);
                    infowindow.open(map, marker);
                }
            })(marker, i));
            };
         })(i));
    }
#map{
   height:400px;
   width:500px; 
}
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> </script>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.2.1.min.js"></script>
<div id="map"></div>
<