google 地图信息窗口显示相同的内容

google maps infowindow displays the same content

所以google地图信息窗口总是显示最后一个地图项目的内容。基于一些研究,我偶然发现了 this。但是它仍然对我不起作用这是我的代码。

 function bindInfoWindow(marker, map, infowindow, html) {
    marker.addListener('click', function () {
    infowindow.setContent(html);
    infowindow.open(map, this);
  });
 }

for (var x = 0; x < filtered_pins.length; x++) {
var links = filtered_pins[x].description + '<a href="' + filtered_pins[x].slug + '">read more..</a>';

links_arr.push(links);


    $.getJSON('http://maps.googleapis.com/maps/api/geocode/json?address=' + filtered_pins[x].city + '&sensor=false', null, function (data) {
        //console.log('4th'+ links);
        var p = data.results[0].geometry.location
        var latlng = new google.maps.LatLng(p.lat, p.lng);
        var marker = new google.maps.Marker({
            position: latlng,
            map: map,
        });
        var infowindow = new google.maps.InfoWindow();

        //marker.addListener('click', function () {
            //infoWindow.setContent(links);
        //    infowindow.open(map, this);
        //});

        bindInfoWindow(marker, map, infowindow, links);
        my_markers.push(marker);
    });
}

我在 Whosebug 上浏览了相当多的相关项目,但它们似乎不属于 service.They 所有似乎都已经可以访问 latlang,因此它们的结构不同。我必须先使用 .getJson 方法检索地址 latlang,然后创建标记。

for 循环的每次迭代都会调用 $.getJSON(),但是每次迭代仅共享一个 links 变量。在任何 $.getJSON() 调用调用您的回调函数之前,for 循环运行完成。所以他们都使用分配给 links.

的最后一个值

这确实与您链接到的问题中的问题完全相同;在该问题的代码中,问题变量是 club。该问题的解决方案不起作用的原因是您的代码具有异步的 $.getJSON() 调用,就像 click 处理程序是异步的一样。

要解决这个问题,您只需将整个循环体移动到一个函数中即可。该函数内的局部变量对于循环的每次迭代都是唯一的。

在这里使用 filtered_pins[x] 似乎没问题,但如果它在 $.getJSON() 回调中使用,这也可能是一个问题,并且它使代码更简单,只在一个点上,其中 addMarker() 被调用。

此时您不需要 bindInfoWindow() 成为一个单独的函数,所以我将其内联。

我还做了一些其他的小改动以缩短行的长度。

for (var i = 0; i < filtered_pins.length; i++) {
    addMarker( filtered_pins[i] );
}

function addMarker( pin ) {
    var links = pin.description +
        '<a href="' + pin.slug + '">read more..</a>';
    links_arr.push(links);

    var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' +
        pin.city + '&sensor=false';
    $.getJSON( url, null, function (data) {
        var p = data.results[0].geometry.location
        var latlng = new google.maps.LatLng(p.lat, p.lng);
        var marker = new google.maps.Marker({
            position: latlng,
            map: map,
        });
        var infowindow = new google.maps.InfoWindow();

        marker.addListener('click', function () {
            infowindow.setContent(links);
            infowindow.open(map, this);
        });

        my_markers.push(marker);
    });
}

我不确定 links_arrmy_markers 数组的用途,因此也可能存在一些问题,具体取决于。

在现代浏览器中,您还可以通过对循环内的变量使用 let 而不是 var 来解决此问题。那么你就不需要 addMarkers() 函数了。但我认为这个单独的函数使代码更简洁,并且它仍然兼容旧浏览器。