2012-01-29 111 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