作者dspswen (阿天)
看板Ajax
标题[问题] google map 轮播的问题
时间Mon Nov 10 09:58:35 2008
不好意思,又有一个问题,可能跟 Js 有关
自己参考网上许多范例做了一个轮播的程式
就是很一般地效果
在一开始照着阵列会有许多的点出现在 google map 上
这些点有设定不同的指标图、对话框内容文,然後会自动跑下一个轮播每一个阵列的点
我把地址那些放入资料库随机捞出来
问题是,一开始都正常
不过当我阵列摆超过 10 个点之後,有些点会出不来(有时後重读又出得来)
看原始码内容的阵列是完全正确,都有出现
也就是说捞资料库出来的所有资料都有放进程式码阵列里
但画面上的 google map 点却不见了,有时还会有一些点错乱掉
每次重读消失的点都不同,错乱的点都不同(因为我是随机捞资料库)
只有地址的部份会乱掉,譬如A点跑到B点,然後B点图不见,但A图跟A对话框内容是正确
我有设一个 i 去跑 addresses 阵列内所有资料(给google map的地址)
alert 出来确认没错,20 笔资料就是 20 (显示19)
但後来又设一个 total 是自动用 Js 跑 google map 自动轮播的数字
这个数字就会乱掉,照理说要跟 i 一样才是,不过有时 10 有时 20 有时 11 12 ...
由於 Js 基础不是很好,不知道是不是哪边概念错误,请高手指教
下面程式码会说明
<script type="text/javascript">
var map;
var marker = new Array(0);
var total = 0;
var cc = 0;
var addresses = ['','','','',''.... // (N个地址)
var images = (对应的指标图)
var siteDesc = (滑鼠移到指标上出现的字)
var message = (click点选指标出现对话框内的内容)
---------------------------这没什麽问题,只是点一下指标会出现对应对话框内容
function setHandler(i,point,mark){
GEvent.addListener(mark,"click", function() {
var myHtml = message[i];
map.openInfoWindowHtml(point, myHtml);
});
}
---------------------------
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.enableScrollWheelZoom();
var geocoder = new GClientGeocoder();
for(var i in addresses){
-------------------------------------------------
addr = addresses[i];
-------------------------------------------------这里i正确,数字正确
geocoder.getLatLng(addr, function(point){
map.setCenter(point, 16);
var icon = new GIcon();
icon.image = images[total];
icon.iconSize = new GSize(60,60);
icon.iconAnchor = new GPoint(24,16);
icon.infoWindowAnchor = new GPoint(24,16);
var mark = new GMarker(point,{icon:icon,title:siteDesc[total]});
map.addOverlay(mark);
marker.push(mark);
setHandler(total,point,mark);
total++;
});
--------------------------
上面每跑一次,就会多一个点照理说 total 是 global 属性,一开始设 0
i 最後是多少 total 应该也就会是多少 ?
可是最後传出去时,发现 total 每次重读数字都不一样
--------------------------
}
-----------------------启动轮播
setTimeout("move(0)",1000);
-----------------------
}
}
------------------------
function move(cc){
setTimeout("move("+((cc+1)%total)+")",6000);
^^^^^
//我是在这边去 alert(total); 发现 total 都不一样(i是都一样),
//所以这边就有一点问题
map.panTo(marker[cc].getLatLng());
//google map API 语法,地图会自动指向该点
var myHtml = message[cc];
map.openInfoWindowHtml(marker[cc].getLatLng(),myHtml);
}
------------------------
</script>
如有问题我再补充
谢谢
--
▍ ▍ ╯╰
╯╰
◢◣ ◢◣ 我最爱的 柏柏龙~ 柏柏龙~
◢██◣ ╮╭
▎▎╮╭
▎▎ 柏柏龙~ 柏柏龙~
⊙ ⊙ ◢ ◣ ⊙ ⊙ ◣ 人人心中都有柏柏龙~
≡ ▼ ≡ ▲▲
● ● ≡ ▼ ≡ ■ ■ ■ ■ 愤怒就永远不会消失~
皿 ◢⊙⊙◣
≡皿 ≡ 皿 炸是最美的拥有~
◢◤^ ^^◥◣ 皿 ◢◤^^^◥◣ ◥ ︶ ▍▍▍▍▍▍ ψdiabloq13
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.207.2.26
1F:推 pp0322:有测试网址吗XD 11/10 12:12
2F:推 wctang:在Timeout执行move时,getLatLng回传的个数不一定如你预期 11/10 12:39
3F:→ wctang:所以 total 才会每次执行都不同 11/10 12:40
4F:→ wctang:也就是,要考虑到geocoder.getLatLng是非同步的动作 11/10 12:44
5F:→ dspswen:那请问这个该怎麽解决 @@ 11/10 13:08
7F:→ dspswen:每次重读都会发现有些图不见 或乱跑 不过程式码应该对 11/10 13:11
8F:推 alpe:觉得 setHandler 可能有问题. 11/10 22:14