【问题标题】:Google Maps API - Trouble with Arrays and InfoWindowsGoogle Maps API - 数组和 InfoWindows 的问题
【发布时间】:2023-04-04 11:47:01
【问题描述】:

对不起,如果这是微不足道的,但我是 JS 的新手,并且已经解决了这个问题几个小时无济于事。

function initialize() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
    zoom: 12,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
}

var markersArray = [];
var infowindowArray = [];

function addMarker(location) {
    marker = new google.maps.Marker({
    position: location,
    map: map
    });
    markersArray.push(marker);
}

function addInfowindow(string) {
    infowindow = new google.maps.InfoWindow({content: string});
    infowindowArray.push(infowindow);
}

function findvenues(latitudelongitude) {
$.get("venuefinder.php", { latlong:latitudelongitude.Ka+","+latitudelongitude.La }, function(data){
    var myObject = eval('(' + data + ')');
    for(x in myObject.response.venues){
        var latlonglocation = new google.maps.LatLng(myObject.response.venues[x].location.lat,myObject.response.venues[x].location.lng);
        addMarker(latlonglocation);
        addInfowindow(myObject.response.venues[x].name);
        google.maps.event.addListener(markersArray[x], 'click', function() {infowindowArray[x].open(map,markersArray[x]);});
        console.log(markersArray[x],infowindowArray[x]);
    }
});

调用 findvenues 时,应该添加 infowindow 点击事件。当我单击图标时,总是会打开与 infowindows 数组中最后一个元素相同的 infowindow。

但是,如果我手动输入以下代码,它可以工作:

google.maps.event.addListener(markersArray[0], 'click', function() {infowindowArray[0].open(map,markersArray[0]);});
google.maps.event.addListener(markersArray[1], 'click', function() {infowindowArray[1].open(map,markersArray[1]);});

我需要它是动态的...我做错了什么?如果问题不清楚,请告诉我,我会尽力澄清。

【问题讨论】:

    标签: javascript jquery google-maps-api-3


    【解决方案1】:

    在循环中将调用更改为“addListener”:

          google.maps.event.addListener(markersArray[x], 'click', function() {infowindowArray[x].open(map,markersArray[x]);});
    

    到这里:

          google.maps.event.addListener(markersArray[x], 'click', (function(x) {
            return function() {
              infowindowArray[x].open(map,markersArray[x]);
            }
          })(x));
    

    通过引入类似的另一个函数,您可以创建一个全新的作用域。这会“冻结”您传入的“x”的值,以便返回的函数(换句话说,将传递给 Google API 的实际处理函数)可以访问它自己的“x”,与在该循环中建立的所有其他处理程序。

    如果您不这样做,那么所有处理程序共享完全相同的小“x”,这显然是行不通的。

    edit — 还有其他方法可以做到这一点。你可以把这个额外的函数写成一个完全独立的东西:

    function makeMapListener(window, map, markers) {
      return function() { window.open(map, markers); };
    }
    

    那么循环中的语句如下所示:

    google.maps.event.addListener(markersArray[x], 'click', makeMapListener(inforwindowArray[x], map, markersArray[x]));
    

    其中重要的部分是在构造处理函数之前复制在循环期间更改的变量。

    【讨论】:

    • 谢谢。因此,如果我理解正确,我必须将“x”传递给 addListener 的第三个参数中的函数?为什么不是简单的 function(x) {infowindowArray[x]...?
    • 通过添加另一个这样的层,您创建了一个新的 范围 - 这意味着您从循环,以便回调函数有自己的工作。我会用另一种可能性来扩展答案。
    • 我对此表示赞赏,因为我手头也有同样的问题,甚至没有考虑关于名称范围...感谢您让我感觉比现在更笨,但是 + 是一个很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多