我正在使用Google Maps API v3创建一个交互式地图,其中包含地图上的标记以及单击标记时打开的信息窗口。过程是您创建一个标记,创建一个信息窗口,并通过单击绑定两个(该事件也将关闭任何其他打开的信息窗口)。
这很好用。
我希望标记连续下降,所以我添加了一个延迟,根据每个标记的计数增加。
在我这样做后,我注意到点击事件无法找到创建的标记。我认为这是因为标记尚未创建,因为它们仍处于延迟状态。
我的解决方案是在绑定函数中添加一个等于最后一个标记的延迟+一点额外时间的延迟。
我的问题是,这是否是控制这种情况的最佳方式?
伪代码概述:
function mapInit(){
google create map code;
//Begin First PHP loop, pulls all information in
setTimeout(function(){ //PHP loop iteration 1
create marker1;
create window1;
}, 1 * 150);
setTimeout(function(){ //PHP loop iteration 2
create marker2;
create window2;
}, 2 * 150);
setTimeout(function(){ //PHP loop iteration 3
create marker3;
create window3;
}, 3 * 150);
//end first PHP loop
function createListeners(){
//begin second PHP loop over markers
google.maps.event.addListener(marker1, 'click', function() { //iteration 1
//internal loop over windows and if for each window
open window1; //if is true, open instead of close
close window2;
close window3;
}
google.maps.event.addListener(marker2, 'click', function() { //iteration 2
//internal loop over windows and if for each window
open window2;
close window1;
close window3;
}
google.maps.event.addListener(marker3, 'click', function() { //iteration 3
//internal loop over windows and if for each window
open window3;
close window1;
close window2;
}
}
setTimeout(function() {
createListeners();
}, 3 * 150 + 100);}
}
on window.load call mapInit();
更多详情:
javascript是在PHP中动态创建的。我正在从外部源中提取标记和窗口信息,并且当我循环写入标记和窗口信息时,在该循环结束时,所有监听器都被创建。
当脚本实际在页面加载时运行时,它会在每个标记/窗口创建之间超时。一旦制作标记,它就会被加载到地图上。如果我将标记/窗口addListener放在相同的超时中,它将不会看到创建后要创建的标记/窗口,因此addListener将不会完成。
答案 0 :(得分:1)
这些在PHP中动态生成并不重要,因为最终JavaScript不会注意到。由于您已在marker-x
的末尾创建了window-x
和setTimeout
,因此向其添加事件监听器应该是可行的:
setTimeout(function(){
create marker1;
create window1;
google.maps.event.addListener(marker1, 'click', function() {
open window1;
close window2;
close window3;
};
}, 1 * 150);
如果你不知道会有多少项,你可以用PHP跟踪它,然后将这些信息传递给JavaScript(例如echo "var numOfItems = " . $numItems . ";";
)