2012-08-31 45 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