需要等待 MarkerWithLabel 完成填充地图

need to wait for MarkerWithLabel to finish populating the map

我正在使用 MarkerWithLabel(顺便说一句,非常棒的小工具)在地图上标记几十个位置 - 在本例中为 ~300。

所以我遍历我的数据元素,并在循环的每次迭代中创建一个像这样的标签

int i = 1;
for(b in data){

var figureLabel = document.createElement("FIGURE");
var pictureLabel = document.createElement("img");
pictureLabel.src = "Assets/my_icon.png";

var caption = document.createElement("FIGCAPTION");
var text = document.createTextNode(i);

caption.appendChild(text);
figureLabel.appendChild(pictureLabel);
figureLabel.appendChild(caption);

markers[i] = new MarkerWithLabel({
       position : new google.maps.LatLng(data[b].latitude, data[b].longitude),
       map : map,
       labelContent : figureLabel,
       labelClass : "labels",
       labelAnchor : new google.maps.Point(33.5, 56)
    });
    i++;
}
console.log('Map is populated!');

虽然我在这里写一个问题,所以我们不要太兴奋,有问题。一旦所有这些人都加载到地图上,我需要将一个 click 事件绑定到这些标记中的每一个。假设它看起来像这样:

$('figure').click(function(){
    console.log($(this).find('figcaption').text());
});

它应该像允许 for:in 循环完成一样简单,但是在循环完成和标签放置之间存在非常明显的滞后。日志“Map is populated!”在标记出现之前几百毫秒发生,实际上,如果我在循环完成后立即绑定我的事件,它将无法找到要绑定的任何内容,并且我无法获得所需的功能.

所以我尝试的是像这样将一个侦听器附加到我的地图对象:

google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
    //Bind some click events    
});

这确实 有时有效,但完全不可靠。我也尝试过其他听众,如 boundschangedidle,但这些也不可靠。

所以我需要一些方法来识别我的控制流中标记及其各自的 DOM 元素实际附加到地图的点,而不仅仅是包含它们实例化的循环完成时。

您应该尝试使用 google.maps.event.addListener() 将侦听器直接附加到标记对象。 See here 有关向标记添加和删除侦听器的直接示例(以及更多)。

为了不单独依赖链接,那里的相关示例包括添加和(一种方法)删除侦听器是

var listener1 = google.maps.event.addListener(marker, 'click', aFunction);
google.maps.event.removeListener(listener1);

当然,您已经在示例代码中使用了这个函数,只是没有应用于标记本身。

MarkerWithLabel 文档还包含 lots of examples,包括处理您可能错过的事件的文档。