2013-07-05 115 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) + ')' 
    ); 
}