2012-08-31 50 views
3

你好這是基於非常緊密的改變背景:的setInterval從功能

jquery loop through different backgrounds

該解決方案爲我做的工作,但我不希望背景的改變對文件準備 - 他們應該被觸發由一個函數。出於某種原因,這使得背景變化太快,他們閃爍3一次,所以它看起來像循環在某處運行:

function run() 
{ 
// Set multicolour backgrounds 
window.setInterval(multicolour(), 3000); 
} 

var colour = 0; 
var colours = Array('', 'pink', 'red', 'green', 'light'); 

function multicolour() 
{ 
    colour = (colour+1) % colours.length ; 
    $('body').attr('id', colours[colour]); 
    console.log(colour); 
} 

僅供參考控制檯日誌顯示顏色閃爍每3秒3次,而不是改變每3秒一次。幫幫我?

回答

2

使用遞歸setTimeout並使用一個通用計時器變量,該變量將被無意識代碼覆蓋覆蓋。

window._timers = { 
    changeBackground : null 
}; 

var colour = 0; 
var colours = Array('', 'pink', 'red', 'green', 'light'); 

function multicolour() 
{ 
    colour = (colour+1) % colours.length ; 
    $('body').attr('id', colours[colour]); 

    // Set multicolour backgrounds 
    clearTimeout(window._timers.changeBackground); 
    window._timers.changeBackground = setTimeout(multicolour, 3000); 
} 

演示:http://jsfiddle.net/FgkWx/

+0

完美。工作像一個魅力 –

+0

很高興幫助:) – AlienWebguy

0

你原來的問題的答案了(正確)遞歸調用你失蹤:遞歸使用的setTimeout

setTimeout(changeBackground, 2000); // called from changeBackground() 

這裏你舉的例子不具有multicolour()自稱

+0

對不起,我粘貼錯誤的URL - 它是http://stackoverflow.com/questions/5977837/jquery-loop-through-different-backgrounds –

2

幾個語法問題。你需要通過一個function referencewindow.setInterval

我也清理了你的數組聲明。我沒有jQuery,所以我沒有嘗試運行此代碼。

function run() 
{ 
    // Set multicolour backgrounds 
    window.setInterval(multicolour, 3000); 
} 

var colour = 0; 
var colours = ['', 'pink', 'red', 'green', 'light']; 

function multicolour() 
{ 
    colour = (colour+1) % colours.length ; 
    $('body').attr('id', colours[colour]); 
    console.log(colour); 
} 

嗯....嘗試這一個不污染全局空間: 它使用一些更高級的JavaScript方法,但這種方式「顏色」和「顏色」不漏到全球空間和污染的東西。

var changeBackground = (function() { 

    var colour = 0; 
    var colours = ['', 'pink', 'red', 'green', 'light']; 

    return function() { 
    colour = (colour+1) % colours.length ; 
    document.body.id = colours[colour]; 
    console.log(colour); 

    }; 

}()); 

window.setInterval(changeBackground, 3000); 
+0

謝謝,雖然問題依然存在,它通過顏色每3秒,而不是隻改變到下一個顏色 –

+0

我不得不看到你的代碼的其餘部分......我不知道在哪裏/如何調用'運行',例如。你有公共網頁還是小提琴? –

0

要調用的回調函數中的setInterval聲明:

window.setInterval(multicolour(), 3000); 

試試這個:

window.setInterval(multicolour, 3000); 
0

它會像這樣:

var colour = 0; 
var colours = Array('', 'pink', 'red', 'green', 'light'); 

function multicolour(){ 
    colour = (colour+1) % colours.length ; 
    $('body').attr('id', colours[colour]); 
    console.log(colour); 
} 

setInterval(multicolour, 3000); 

您需要通過函數引用ce到setInterval函數,而不是函數的返回值。

Working fiddle