2012-01-29 118 views
0

我相信這個問題之前已經被問過,但沒有確定具體的答案。

在我的網站http://euphoricsoftware.com/有一個奇特的倒計時腳本,可以自動將您帶到正常站點,而不是移動或低帶寬。該腳本適用於所有瀏覽器<body onload="setTimeout(countDown(8),1000);">(其中8是起始數字),除非有時在Chrome中倒數不會移動,並且打開JS控制檯顯示Uncaught ReferenceError: countDown is not defined

此外,頁面上還有一個按鈕,可讓您暫停和恢復倒計時。繼續調用countDown()函數,即使發生未定義的錯誤時,如果單擊按鈕兩次倒計時將工作,所以它似乎與onload有關。JavaScript函數有時未定義

這是我一直在使用(SO的代碼格式已經釀了間隔位)代碼:

<html> 
<head> 
    <!-- ... --> 
    <script type="text/javascript"> 
    var stopRedirect = false; 
    var back = 0; 

    function redirect() 
    { 
     if (!stopRedirect) {window.location = "home.html";} 
    } 
    function countDown(num) 
    { 
     if (!stopRedirect) 
     { 
      back = num-1; 
      if (num < 10) 
      { 
       document.getElementById("top").innerHTML=num+1; 
      } 
      document.getElementById("middle").innerHTML=num; 
      if (num > 1) 
      { 
       document.getElementById("bottom").innerHTML=num-1; 
       var t = setTimeout("countDown("+(num-1)+")",1000); 
      } 
      else 
      { 
       document.getElementById("bottom").innerHTML="&nbsp;"; 
       document.getElementById("unit").innerHTML=" second&nbsp;"; 
       var r = setTimeout("redirect()",1000); 
      } 
     } 
    } 

    function stop() 
    { 
     if (!stopRedirect) 
     { 
      stopRedirect = true; 
      document.getElementById("stop").style.display="none"; 
      document.getElementById("start").style.display="block"; 
     } 
    } 
    function start() 
    { 
     if (stopRedirect) 
     { 
      stopRedirect = false; 
      document.getElementById("stop").style.display="block"; 
      document.getElementById("start").style.display="none"; 
      var c = setTimeout("countDown("+(back)+")",1000); 
     } 
    } 
</script> 
</head> 
<body onLoad="setTimeout(countDown(8),1000);"> 
    <!-- ... --> 

,你可以在http://euphoricsoftware.com/
看到活動的網站有誰知道這是爲什麼發生了什麼?由於

+0

我看不出爲什麼這不起作用。我在Chrome中刷新了你的頁面大約一百次,從來沒有遇到任何問題或者看到錯誤。 – mrtsherman 2012-01-29 04:38:06

+0

在Chrome 18.0.1017.2 dev-m和18.0.1021.0 canary中似乎不起作用 – ProfSmiles 2012-01-29 04:49:17

+0

在Canary中適合我。 – mrtsherman 2012-01-29 05:11:34

回答

1

我不太知道爲什麼你得到這個錯誤,因爲你的函數是在<head>定義的,您不要嘗試使用它,直到身體的onload,但你的代碼確實有問題。這部分從onload=""

setTimeout(countDown(8),1000); 

會,當發生onload和運行代碼,調用countDown()功能立即,路過的8參數,然後再採取任何該函數返回,並將它傳遞給setTimeout()將在1秒內執行。在你的情況下,你的函數沒有返回一個特定的值,所以實際上你傳遞undefinedsetTimeout()

你想要做的是通過setTimeout()函數引用或字符串。

您不能直接傳遞參數給countDown(),同時傳遞該函數的一個參數(至少不是在IE中可以使用的setTimeout()的語法),所以您需要將其引入匿名函數是這樣的:

onload="setTimeout(function() { countDown(8); }, 1000);" 

或者您可以使用類似於您countDown()函數體內的字符串格式(使用單引號,因爲onload屬性目前使用的雙打):

onload="setTimeout('countDown(8);', 1000)" 

請注意,字符串格式通常會被忽視,因爲它比較慢並影響範圍。

+0

該字符串完美工作,但匿名函數仍然遇到未捕獲ReferenceError:countDown沒有定義 – ProfSmiles 2012-01-29 04:50:50

+0

對不起,就像我在我說的第一句我無法解釋那個錯誤。它不會發生在我身上,但我的Chrome版本是16.something。順便說一句,我不確定你甚至需要'onload'中的'setTimeout',你可以說'onload =「countDown(9);」'。 – nnnnnn 2012-01-29 05:12:16