2013-07-05 112 views
1

下面是我用来定期运行一个函数的函数。我使用该功能来改变身体的背景。但由于某种原因它不会被解雇。请帮助我使用此代码。setInterval没有被触发

setInterval(uiImageChanger(),1); 

    function uiImageChanger(){ 
     var currentTime = new Date().getHours(); 
     var images = ['image1.jpg','image2.jpg']; 

     if(currentTime > 00 && currentTime <= 12){ 
      $('body').css('background-image', "url(" + randomImagePicker(images ,'breakfast') + ")"); 
     }else if(currentTime > 12 && currentTime <= 16){ 
      $('body').css('background-image', "url(" + randomImagePicker(images ,'lunch') + ")"); 
     }else if(currentTime > 16 && currentTime <= 00){ 
      $('body').css('background-image', "url(" + randomImagePicker(images ,'dinner') + ")"); 
     } 
    } 

    function randomImagePicker(imgArray,time){ 
     if(time == 'breakfast'){ 
      return "../images/main_image/breakfast/" + imgArray[Math.floor(Math.random() * imgArray.length)]; 
     }else if(time == 'lunch'){ 
      return "../images/main_image/lunch/" + imgArray[Math.floor(Math.random() * imgArray.length)]; 
     }else if(time == 'dinner'){ 
      return "../images/main_image/dinner/" + imgArray[Math.floor(Math.random() * imgArray.length)]; 
     } 
    } 

谢谢。

+0

参见http://stackoverflow.com/questions/17481429/no-delay-with-settimeout/17481463#17481463 :) – PSL

+1

注意1中的第二个参数是1毫秒1秒你需要提及1000 – PSL

+1

是的,我想到了! :) 谢谢! –

回答

5

从setInterval函数参数中移除parens。现在,这将调用函数并将函数的返回值设置为setInterval的引用,这里是undefined,因为您不返回任何内容。所以基本上你没有任何设置间隔,除了第一次执行设置setInterval时没有任何事情发生。

变化

setInterval(uiImageChanger(),1); // This will invoke the function immediately. 

setInterval(uiImageChanger,1); // You want to set the reference of the function to setInterval. 
4

你有一个指针传递给函数,而不是执行的功能。

setInterval(uiImageChanger,1); 
1

定义要使用setInterval执行的函数有多种方法。 其中一种方法是使用函数参考,其中的示例由#mohkhan给出。 但是你可以做以下以及

setInterval(function(){ 
      // code comes here. 
    }, time_in_mills); 

而且我看到你所提到的功能执行为1的值。这意味着每隔1毫秒的功能将被执行,这是不是一个好的做法所有。以毫秒为单位给出一个实际的时间,以便您有足够的时间执行代码。

1

你已经得到了几个关于setInterval()问题的答案。我想指出代码中的其他一些问题。

首先,这个测试总会失败:

else if(currentTime > 16 && currentTime <= 00) 

毕竟,如果一个数> 16它不能同时< = 0

此外,你可能会得到一个警告约00是不推荐使用的八进制常量。当然,八进制零与十进制零相同,但要小心无意的八进制常量:避免使用前导零。

而且代码中有很多重复。您可以轻松删除所有这些重复操作,以使代码更易于维护。考虑这样的方法:

// Return a random integer >= 0 and < n 
function randomInt(n) { 
    return Math.floor(Math.random() * n); 
} 

// Return a random element from an array 
function randomElement(array) { 
    return array[ randomInt(array.length) ]; 
} 

function uiImageChanger(){ 
    var hour = new Date().getHours(); 
    var meal = 
     hour <= 12 ? 'breakfast' : 
     hour <= 16 ? 'lunch' : 
     'dinner'; 
    var images = [ 'image1.jpg', 'image2.jpg' ]; 
    $('body').css(
     'background-image', 
     'url(../images/main_image/' + meal + 
      '/' + randomElement(images) + ')' 
    ); 
}