我相信之前已经问过,但没有确定具体的答案。
在我的网站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=" ";
document.getElementById("unit").innerHTML=" second ";
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 :(得分: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)"
请注意,字符串格式通常不受欢迎,因为它较慢并影响范围。