2015-11-04 89 views
-1

我正在製作一個測試頁,其中包含執行不同腳本的按鈕。我想每秒改變背景顏色5秒,總共5種顏色。我已閱讀並觀看了setIntervalsetTimeout上的視頻,我只是不明白。Javascript延遲

我想要什麼:

x 
wait 1sec 
y 
wait 1sec 
z 
wait 1 sec 
etc... 

我想要做的這一切功能於一體,但我放棄了,由於看似需要在setTimeout(function, 500)

引用一個功能,所以我創建了一個每個顏色變化的新功能如你所見,然後創建一個可以調用每個背景變化的disco()

有點困惑說實話,代碼應該澄清我試過的。只要說它不起作用,這是我放棄的地方。

我將非常感謝解釋如何做到這一點。謝謝!

function disco() { 
    setTimeout(aquaman, 500); 
    setTimeout(pinkman, 500); 
    setTimeout(blueman, 500); 
    setTimeout(redman, 500); 
    setTimeout(brownman, 500); 
} 

function aquaman() { 
    document.body.style.backgroundColor = "aqua"; 
} 

function brownman() { 
    document.body.style.backgroundColor = "brown"; 
} 

function redman() { 
    document.body.style.backgroundColor = "red"; 
} 

function pinkman() { 
    document.body.style.backgroundColor = "pink"; 
} 

function blueman() { 
    document.body.style.backgroundColor = "blue"; 
} 
+1

你怎麼知道數組? – Kriggs

+2

'setTimeout'不會暫停腳本。它安排代碼稍後運行。這意味着你所有的'setTimeout'回調計劃同時運行。 – 2015-11-04 17:59:18

+0

數組..我知道bascially它們是什麼 - 一個數據集,我真的不明白它是如何適用於此,但我可以看到在下面的答案中的示例中有一個數組集合..我會看看它,但它我需要時間來分解它。你說他們都被設置爲同時執行的事實確實有道理,謝謝..我再次使用500,1000,1500,2000和2500,而不是每次500,再次嘗試上面的確切代碼,它完美的工作!進步,非常感謝。 – m1a1t

回答

1

下面的代碼將背景顏色更改爲數組中的下一個,所有你需要做的是設置的時間間隔就可以給你想要的顏色改變的時候,跌落如果評論你對此是如何工作的疑惑:

function changeColor(){ 
 
     var colors = ['aqua','brown','red','pink','blue'], 
 
      currColor = ((colors.indexOf(document.body.style.backgroundColor) + 1) % 5); 
 
     
 
     if(currColor === -1) currColor = 0; 
 

 
     document.body.style.backgroundColor = colors[ currColor ]; 
 
    } 
 

 
    setInterval(changeColor, 1000)

+0

@abforce擁有更清潔的解決方案。 – Kriggs

0

setTimeout()是一個異步API。你用它來調用瀏覽器執行你在n毫秒後傳遞的函數。所有setTimeout()調用都將超時設置爲500,這意味着所有這些函數都將在大致相同的時間執行。

此:

function disco() 
{ 
setTimeout(aquaman, 500); 
setTimeout(pinkman, 1000); 
setTimeout(blueman, 1500); 
setTimeout(redman, 2000); 
setTimeout(brownman, 2500); 
} 

將實現所期望的結果,但考慮到寫此功能是作爲重構的一部分,更多的方案:

function aquaman() { 
    document.body.style.backgroundColor = "aqua"; 
} 

function brownman() { 
    document.body.style.backgroundColor = "brown"; 
} 

function redman() { 
    document.body.style.backgroundColor = "red"; 
} 

function pinkman() { 
    document.body.style.backgroundColor = "pink"; 
} 

function blueman() { 
    document.body.style.backgroundColor = "blue"; 
} 

function disco() { 
    var timeout = 500; 
    var funcs = [aquaman, brownman, redman, pinkman, blueman]; 
    funcs.forEach(function(func) { 
     setTimeout(func, timeout); 
     timeout += 500; 
    }); 
} 

這個例子減少一些重複,但不是全部。我們仍然可以將這些不必要的重複函數定義分解出來:

function disco() { 
    var timeout = 500; 
    var colors = ['aqua', 'brown', 'red', 'pink', 'blue']; 
    colors.forEach(function(color) { 
     setTimeout(function() { 
     document.body.style.backgroundColor = color; 
     }, timeout); 
     timeout += 500; 
    }); 
} 

這是對您的問題提供完美服務的解決方案。

+1

爲什麼'
'? – Kriggs

+0

@Kriggs完全不需要
標籤。 OP在原始樣本中包含它們。 –

+0

對不起,這是我的第一篇文章,我只是想更好地展示它,不應該有任何
的,我的壞。 – m1a1t

0

var colors = ['red','pink','blue']; 
 
    var currentColor = 0; 
 
    function changeColor() { 
 
     setTimeout(function() { 
 
     if(currentColor === colors.length) { 
 
      currentColor = 0; 
 
     } 
 
     document.body.style.backgroundColor = colors[currentColor]; 
 
     changeColor(currentColor++); 
 
     }, 500); 
 
    } 
 
    changeColor();

中的setTimeout recursivly執行changeColor,因爲你要延遲執行每500ms的

+0

沒有任何解釋的代碼並不是真的有幫助 –

+0

對不起,我只是覺得代碼很簡單,可以自己解釋 – Sean

1

var bg = { 
 
     colors: ['red','blue', 'green'], 
 
     next: 0, 
 
     getNextColor: function(){ 
 
      return this.colors[this.next++ % this.colors.length]; 
 
     } 
 
    }; 
 

 
    setInterval(function() { 
 
      document.body.style.backgroundColor = bg.getNextColor(); 
 
     }, 1000);

-1

非常基本的:

<script> 

(function disco() { 
    setTimeout(function aquaman() {document.body.style.backgroundColor = "aqua";}, 0); 
    setTimeout(function pinkman() {document.body.style.backgroundColor = "pink";}, 1000); 
    setTimeout(function blueman() {document.body.style.backgroundColor = "blue";}, 2000); 
    setTimeout(function redman() {document.body.style.backgroundColor = "red";}, 3000); 
    setTimeout(function brownman() { document.body.style.backgroundColor = "brown";}, 4000); 
})(); 
</script> 

演示:http://jsbin.com/qumagozosi/edit?html,js,output

+0

是的,我可以看到你的例子使我能夠設置時間間隔而無需單獨定義函數首先讓迪斯科變成一個獨立的函數,謝謝。setTimeout中的藍色「函數」(函數讓我感到困惑,現在我明白了這個意思,在這種情況下,它並沒有引用函數,它創建函數,看看例子,弄糊塗爲什麼這個詞功能在那裏,但我現在看到了。 – m1a1t

+0

我注意到你用(並且有)()開始了這個函數;最後,我沒有你理解這些是爲了什麼,但沒有它,它確實有效,而且正是我想要實現的。 – m1a1t

+0

但爲了使其具有可重複性,我想我將不得不使用上面更精煉/高級的方法之一,例如增加超時。由於時間延遲是固定的,所以重複它們不會起作用 - 就像我最初的程序不起作用一樣,因爲我同時發生了每個事件。我想上面的一些例子是可重複的,非常感謝所有的信息。 – m1a1t