2012-04-19 149 views
0

我有一個重定向到文件的倒計時腳本。它有一個循環,並且變量在運行一次時會被取消。循環後的Javascript未定義變量

如何讓url變量保持其值?

 <a id="" onClick="doTimer('http://www.domain.com/downloadfile.php?photo=foo.jpg')" href="#"><button id="download">Download this photo</button></a> 

     var timer_is_on=0; 
     var countdownfrom=5 
     var currentsecond=document.getElementById('countdown').innerHTML=countdownfrom+1 

     function countredirect(url) 
     { 
      if (currentsecond!=1) 
      { 
       currentsecond-=1 
       document.getElementById('countdown').innerHTML = currentsecond; 
      } 
      else 
      { 
       window.location=url 
       return 
      } 
      setTimeout("countredirect()",1000) 
     } 
     function doTimer(url) 
     { 
      if(!timer_is_on) 
      { 
       document.getElementById('download').innerHTML="Your download starts in <span id=\"countdown\"></span>seconds"; 
       timer_is_on=1; 
       countredirect(url) 
      } 
     } 
+0

哪個變量得到未定義? – JJJ 2012-04-19 11:09:30

+3

**永不**將字符串傳遞給'setInterval()'或'setTimeout()'。這樣做與使用'eval()'一樣糟糕,並且只要使用變量,就會導致不可讀和可能不安全的代碼,因爲您需要將它們插入到字符串中,而不是傳遞實際變量。正確的解決方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同樣適用。如果你只想調用一個沒有任何參數的函數,你也可以直接傳遞函數名:'setInterval(someFunction,msecs);'(注意函數名後面有** no **'()') – ThiefMaster 2012-04-19 11:09:49

+0

我首先在dotimer函數中使用的url變量。 – 9edge 2012-04-19 11:10:28

回答

5
setTimeout("countredirect()",1000) 

您沒有傳遞任何參數傳送給countredirect功能。

將字符串傳遞到setTimeoutsetInterval通常是一個壞主意(給你各種範圍問題)。傳遞函數:

setTimeout(function() { 
    countredirect(url); 
}, 1000); 

在新的瀏覽器(或墊片),你也可以使用.bind()[MDN]bind回報新功能):

setTimeout(countredirect.bind(null, url), 1000); 
0

的另一種方法來重新安排你的函數:

setTimeout(countredirect.bind(null, url), 1000);