[問題] google map 輪播的問題

看板Ajax作者 (阿天)時間17年前 (2008/11/10 09:58), 編輯推噓3(305)
留言8則, 4人參與, 最新討論串1/2 (看更多)
不好意思,又有一個問題,可能跟 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

11/10 12:12, , 1F
有測試網址嗎XD
11/10 12:12, 1F

11/10 12:39, , 2F
在Timeout執行move時,getLatLng回傳的個數不一定如你預期
11/10 12:39, 2F

11/10 12:40, , 3F
所以 total 才會每次執行都不同
11/10 12:40, 3F

11/10 12:44, , 4F
也就是,要考慮到geocoder.getLatLng是非同步的動作
11/10 12:44, 4F

11/10 13:08, , 5F
那請問這個該怎麼解決 @@
11/10 13:08, 5F

11/10 13:11, , 6F

11/10 13:11, , 7F
每次重讀都會發現有些圖不見 或亂跑 不過程式碼應該對
11/10 13:11, 7F

11/10 22:14, , 8F
覺得 setHandler 可能有問題.
11/10 22:14, 8F
文章代碼(AID): #195vLF2h (Ajax)
討論串 (同標題文章)
文章代碼(AID): #195vLF2h (Ajax)