2013-05-08 36 views
1

我試圖在谷歌地圖中實現一些「強制動畫」,通過顯示標記被逐個添加。setTimeout每次添加標記時

爲此,我使用了下面的代碼。

function Marker(i) { 
    if(i > locations.length) return;     
    var populationOptions = { 
     strokeColor: '#FF0000', 
     strokeOpacity: 0.8, 
     strokeWeight: 2, 
     fillColor: '#FF0000', 
     fillOpacity: 0.35, 
     map: map, 
     center: citymap[locations[i][1]].center, 
     radius: citymap[locations[i][1]].population 
    }; 
    cityCircle = new google.maps.Circle(populationOptions); 

    var t = setTimeout("Marker("+(i+1)+")",2000); 
} 
Marker(0); 

我已經採取本實施例中從:Here,但螢火蟲說,功能標記不是上的setTimeout的線所限定();

任何想法?

更新的代碼:

function Marker(city) { 
    alert(city); 
    var populationOptions = { 
     strokeColor: '#FF0000', 
     strokeOpacity: 0.8, 
     strokeWeight: 2, 
     fillColor: '#FF0000', 
     fillOpacity: 0.35, 
     map: map, 
     center: citymap[city].center, 
     radius: citymap[city].population 
    }; 
    cityCircle = new google.maps.Circle(populationOptions); 
} 

for (city in citymap) { 
    var t = setTimeout(function(){Marker(city);},2000); 
} 

我認爲每一次標記叫,它會具有2秒的延遲,但事實並非如此。它等待2秒鐘,然後一次運行。此外,「城市」不更新,在城市地圖中添加相同標記x倍城市數量。

for循環不等待超時完成?

+0

PR ovide js小提琴 – 2013-05-08 09:31:53

+0

你的超時在Marker()內,所以這個bug – 2013-05-08 09:34:18

+0

我更新了代碼!代碼是通過一個例子來進行的,並且它被認爲適用於OP。 – M1nga 2013-05-08 09:47:01

回答

1

使用類似這樣

var count = 0; 
function Marker() { 
    city = Object.keys(citymap)[count]; 
    alert(city); 
    var populationOptions = { 
     strokeColor: '#FF0000', 
     strokeOpacity: 0.8, 
     strokeWeight: 2, 
     fillColor: '#FF0000', 
     fillOpacity: 0.35, 
     map: map, 
     center: citymap[city].center, 
     radius: citymap[city].population 
    }; 
    cityCircle = new google.maps.Circle(populationOptions); 
    count++; 
} 
var i =1; 
for (var city in citymap) { 
    var t = setTimeout(function(){Marker();},i*2000); 
    i++; 
} 

而且你已經cityMap中聲明爲var citymap = {} ...修改它var citymap = [];在線路38

+0

代碼說明?爲什麼要乘以我*時間? – M1nga 2013-05-08 10:29:04

+0

因爲setTimeout讓你的函數在指定的毫秒後只能工作一次.. 2000意味着你的函數將在2秒後被執行n次..所以你應該去i * 2000這使得你的函數在aftr 2,4,6秒 – 2013-05-08 10:32:46

+0

@ user2342275只有當您說出它是一個對象還是對象數組或者發佈了您的城市地圖值時,我才能傳遞城市值 – 2013-05-08 10:34:14

2

如果你想有一個新的城市加入每2秒,而不是重複調用您的標記功能可按它做處理--cityMap中的所有項目,你可以做以下的(也擺脫了全球反變量)

function Marker(count) { 
    city = Object.keys(citymap)[count]; 
    console.log(city); 
    var populationOptions = { 
     strokeColor: '#FF0000', 
     strokeOpacity: 0.8, 
     strokeWeight: 2, 
     fillColor: '#FF0000', 
     fillOpacity: 0.35, 
     map: map, 
     center: citymap[city].center, 
     radius: citymap[city].population 
    }; 
    cityCircle = new google.maps.Circle(populationOptions); 
    count++; 
    if(count<citymap.length){ 
     setTimeout(function(){Marker(count);},2000); 
    } 
} 
Marker(0); 
即使
+0

我試過你的方式,但它不像思想一樣工作。 – M1nga 2013-05-08 09:46:21

+0

更新我的答案,以便它可以像你想要的那樣工作。並且不需要聲明2個額外的全局變量以使其工作 – HMR 2013-05-08 12:10:03

相關問題