2017-05-07 22 views
0

我有一个包含idlatitudelongitude的对象(卡片)数组。然后我建立一系列标记以附加到GoogleMap地图上:在Javascript中以循环方式附加侦听器

for(var c = 0; c < cards.length; c++) 
{ 
    var id = cards[c]["id"]; 
    var lat = cards[c]["lat"]; 
    var lon = cards[c]["lon"]; 

    var marker = new google.maps.Marker({ position: new google.maps.LatLng(lat, lon)}); 
    marker.setMap(map); 
    marker.addListener('click', function(){ 
     myListenerCallback(id); 
    }); 
} 

在每个标记上,我想在click事件上附加回调。这可以通过使用标记的.addListener方法很容易地完成。问题是,我想发起一个回调,其中包括卡的ID(作为输入参数):myListenerCallback(id)。看起来像所有的回调是使用数组的最后一个ID触发。我怎样才能通过相应的ID来触发回调?

回答

1

这是因为当事件处理程序被触发时,循环已经完成它的执行,并且id用数组的最后一个值更新。

就可以围绕该事件处理函数的关闭和通过id

for (var c = 0; c < cards.length; c++) { 
    //rest of the code 
    (function(id) { 
    marker.addListener('click', function() { 
     myListenerCallback(id); 
    }); 
    }(id)) 
} 
+0

好,谢谢。使用闭包的内存含义是什么?如果我一遍又一遍地重复运行循环呢?该集合是否在不断增长或者新功能被覆盖(同一套课程) –

1
cards.forEach(function(card){ 
    var id = card["id"]; 
    var lat = card["lat"]; 
    var lon = card["lon"]; 

var marker = new google.maps.Marker({ position: new google.maps.LatLng(lat, lon)}); 
marker.setMap(map); 
marker.addListener('click', function(){ 
    myListenerCallback(id); 
}); 
}); 

看到重复的职位描述...

相关问题