【发布时间】:2015-06-26 05:50:07
【问题描述】:
我正在学习 javascript,但遇到了一个让我完全难过的问题。当我调用 setTimeout 时,函数参数立即运行,没有延迟。
整体程序(段)目的:用户输入他们想要设置计时器的分钟数。输入的值被传递给 submitName(),它设置定时器并在定时器关闭时调用 timeExpired()。
相关 HTML:
<form id="frm1">
Name: <input type="number" id="fname" name="fname"
step="1" min="1" max="1500" value="1"><br>
</form>
<p>How many minutes do you want to set the alarm for?</p>
<button id="submit" onclick="submitName();">Submit</button>
相关的Javascript:
<script>
function timeExpired()
{
document.write("Timer off!");
}
function submitName() {
var x = document.getElementById("fname").value;
var num = x*60000;
document.write("<p id='time'>Timer set for: " + x + " minutes.</p>"
+ "<link rel='stylesheet' href='colours.css'/>");
setTimeout(function(){timeExpired();},num);
}
</script>
我尝试过的:
√ 比较 MDN、W3schools 上的示例,以及其他有关堆栈溢出的问题,以尝试找到解决方案。
√ 封装匿名函数(如上)。有和没有匿名函数添加/删除括号()和分号()的许多变体;函数调用的 timeExpired。
√ 使用内置的 firefox 调试器进行调试(未发现错误)。
√ 检查用户提交的值是否正确分配给x,多个分配给num。
注意事项:
-我知道 W3schools 的可疑声誉,并保持警惕。
-我知道 document.write() 会覆盖满载屏幕的内容。我只在(用户调用的)弹出窗口中以有限的容量使用它。
【问题讨论】:
-
w3schools 的名声可疑,哈哈
-
谢谢,我检查了 js bin 并且在我的系统上显示了 js bin 中的 submitName document.write,但是 timeExpired 永远不会执行。
-
您可以尝试在 timeExpired() 中使用警报,或者其他一些机制,例如在页面上设置 div 或 span 中的文本?我想知道它是否由于某些范围界定原因而未能写入正确的位置,例如因为它是从不同的线程执行的。
-
谢谢,我之前尝试过一个alert() timeExpired,但没有成功。但我会再看看。
标签: javascript settimeout