2014-07-08 32 views
0

我正在編寫一個鎖定屏幕,它從Windows 8獲取「靈感」。當用戶單擊圖像時,它向上滑動以顯示密碼輸入字段等。我希望鎖定屏幕「過渡」或「動畫」,而不僅僅是改變顯示屬性。Javascript「Maximum Call Size Stack Exceeded」

我已經爲調用一個名爲SlideLockscreenUp的函數的click設置了一個事件處理程序。這是當我運行這個,我遇到了「最大調用大小堆棧超過」錯誤。最初,我的代碼是:

function slideLockscreenUp(){ 

    t = setTimeout(function(){ 
     ls.style.top = '-1%'; 
    }, 100); 

    slideLockscreenUp(); 
} 

當我第一次我以爲這是因爲我還沒有設置遞歸停止任何條件的錯誤,因此它會繼續永遠迫使瀏覽器的干擾。

原來這就是我想出了下一個:

  function slideLockscreenUp(){ 

      do{ 
       t = setTimeout(function(){ 
        ls.style.top = '-1%'; 
       }, 10); 

       slideLockscreenUp(); 
      } while(ls.style.top < "-100%"); 

     } 

正如你可以看到我的測試顯示屬性停止功能時的位置:頂部是-100%。然而,我仍然得到這個錯誤,現在我對此有些困惑。任何幫助將是偉大的!

+1

Javascript是單線程的。只要while循環運行,'setTimeout'函數將永遠不會運行。 – Barmar

+0

嗯。有沒有其他的循環可以用來解決這個問題?謝謝 – Joshua

+0

最好的解決方案是利用CSS轉換,而不是試圖在Javascript中做到這一點。 – Barmar

回答

2

您需要遞歸調用slideLockscreenUp才能在setTimeout回調函數中,否則在調用第一個setTimeout回調函數之前它將被多次調用。

我建議您使用setIntervalclearInterval而不是多次調用setTimeout

function slideLockscreenUp(){ 

    t = setInterval(function(){ 
     ls.style.top = '-1%'; 

     if (/* exit condition */) { 
      clearInterval(t); 
     } 
    }, 100); 

}