需要等待 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
});
这确实 有时有效,但完全不可靠。我也尝试过其他听众,如 boundschanged
和 idle
,但这些也不可靠。
所以我需要一些方法来识别我的控制流中标记及其各自的 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,包括处理您可能错过的事件的文档。
我正在使用 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
});
这确实 有时有效,但完全不可靠。我也尝试过其他听众,如 boundschanged
和 idle
,但这些也不可靠。
所以我需要一些方法来识别我的控制流中标记及其各自的 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,包括处理您可能错过的事件的文档。