JavaScript函数有时是Undefined

时间:2012-01-29 04:28:22

标签: javascript html google-chrome

我相信之前已经问过,但没有确定具体的答案。

在我的网站http://euphoricsoftware.com/上有一个花哨的倒计时脚本,可以自动带你到普通网站,而不是移动或低带宽。该脚本适用于每个浏览器<body onload="setTimeout(countDown(8),1000);">(其中8是要开始的数字),有时在Chrome中,倒计时不会移动,打开JS控制台会显示Uncaught ReferenceError: countDown is not defined

页面上还有一个按钮,可让您暂停和恢复倒计时。恢复也会调用countDown()函数,即使在onload上发生未定义的错误,如果你点击两次按钮,倒计时也会有效,所以它似乎与onload有关。

这是我一直在使用的代码(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/处看到该网站的运作情况 有谁知道为什么会这样?感谢

1 个答案:

答案 0 :(得分:1)

我不太确定为什么你会得到那个错误,因为你的函数是在<head>中定义的,你不会在身体的onload之前尝试使用它,但是你的代码确实有问题。这部分来自您的onload=""

setTimeout(countDown(8),1000);
onload出现并且代码运行时,

将立即调用countDown()函数 ,传递8的参数,然后采取任何措施该函数返回并将其传递给setTimeout(),以便在1秒内执行。在您的情况下,您的函数不会返回特定值,因此实际上您将undefined传递给setTimeout()

您要做的是将setTimeout()传递给函数引用或字符串。

您不能在传递该函数的参数的同时直接传递对countDown()的引用(至少,不能使用可在IE中工作的setTimeout()语法),所以你需要将它包装在这样的匿名函数中:

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

或者您可以使用类似于countDown()函数体内的字符串格式(使用单引号,因为onload属性当前使用双精度数字):

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

请注意,字符串格式通常不受欢迎,因为它较慢并影响范围。