2013-06-04 76 views
0

我覺得我非常接近它的工作,但仍然無法弄清楚我的代碼有什麼問題。我需要無休止地運行一個函數,通過一系列13或15個不同的圖像隨意交換圖像src,具體取決於它們的大小。這個函數正在工作,但只有一次,它沒有像我計劃的那樣無休止地運行,也沒有得到「太多的遞歸」瀏覽器錯誤。這裏的代碼:無盡的循環不工作

function SwitchImageLoop(image, imageSize){ 
    if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1}; 
    if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1}; 
    image = document.getElementById(image); 
    var randomTimer = Math.floor(Math.random() * 3000) + 1000; 
    FadeImages(image, imageSize, randomNumber); 
    var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer); 
} 

function FadeImages(image, imageSize, randomNumber){ 
    $(image).fadeOut(300, function(){ 
     $(image).attr('src', '/halcyonic/images/collage_' + imageSize + '_' + randomNumber + '.jpg').bind('onreadystatechange load', function(){ 
      if(image.complete) $(image).fadeIn(300); 
     }); 
    }); 
} 
+1

控制檯沒有錯誤?什麼是第一次調用'SwitchImageLoop'? –

+0

除下面的答案外,請儘量減少代碼的工作來隔離問題。試着讓無限循環運行,說輸出數字或簡單的東西。然後慢慢添加功能,直到出現故障。 – Cramer

+0

@ Karl-AndréGagnon,不,完全沒有錯誤。在控制檯上一切看起來都很完美如果我稍微調整一下(刪除第一個函數最後一行的函數()),我會得到遞歸錯誤。 –

回答

3

問題是,當你調用SwitchImageLoop setTimeout函數裏面。您的SwitchImageLoop接受第一個參數作爲字符串(id),但下一次在setTimeout中調用您的函數時,您將傳遞一個文檔對象作爲第一個參數。

function SwitchImageLoop(image, imageSize){ 
    if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1}; 
    if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1}; 
在下次調用的document.getElementById(documentObject)

會給你錯誤

image = document.getElementById(image); 
    var randomTimer = Math.floor(Math.random() * 3000) + 1000; 
    FadeImages(image, imageSize, randomNumber); 
    var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer); 
} 

重寫你的函數

function SwitchImageLoop(image, imageSize){ 
     if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1}; 
     if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1}; 
     var randomTimer = Math.floor(Math.random() * 3000) + 1000; 
     FadeImages(image, imageSize, randomNumber); 
     var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer); 
    } 

    function FadeImages(image, imageSize, randomNumber){ 
     image=document.getElementById(image);  
     $(image).fadeOut(300, function(){ 
      $(image).attr('src', '/halcyonic/images/collage_' + imageSize + '_' + randomNumber + '.jpg').bind('onreadystatechange load', function(){ 
       if(image.complete) $(image).fadeIn(300); 
      }); 
     }); 
    } 
+0

優秀的解說和編程課@Sudhanshu Yadav。非常感謝你。 –

+0

歡迎迭戈:) –

0

想想你的錯誤,「太多遞歸」。

你的函數正在調用它自己。每次它自己調用時,它都會使用更多的內存。遞歸深度是有上限的,這樣你就不會造成計算機崩潰。您可能希望使用while循環而不是遞歸來實現無限循環。

http://www.w3schools.com/js/js_loop_while.asp

1

我可以看到當imageSwitchImageLoop會如何工作的第一次是一個字符串。然而,第二次,你正在向它傳遞一個DOM元素。我不知道document.getElementById然後返回。我建議你刪除線

image = document.getElementById(image); 

和使用$("#" + image)而不是$(圖片)在適當的地方。