【问题标题】:Why is setTimeout executing timeExpired with no delay?为什么 setTimeout 执行 timeExpired 没有延迟?
【发布时间】: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() 会覆盖满载屏幕的内容。我只在(用户调用的)弹出窗口中以有限的容量使用它。

【问题讨论】:

  • 工作正常jsbin.com/likilaxiwe/1/edit?html,js,console,output 我可以看到延迟
  • w3schools 的名声可疑,哈哈
  • 谢谢,我检查了 js bin 并且在我的系统上显示了 js bin 中的 submitName document.write,但是 timeExpired 永远不会执行。
  • 您可以尝试在 timeExpired() 中使用警报,或者其他一些机制,例如在页面上设置 div 或 span 中的文本?我想知道它是否由于某些范围界定原因而未能写入正确的位置,例如因为它是从不同的线程执行的。
  • 谢谢,我之前尝试过一个alert() timeExpired,但没有成功。但我会再看看。

标签: javascript settimeout


【解决方案1】:

如果没有尝试过,我想document.write() 会替换整个文档,包括包含您的 JavaScript 函数的脚本标记。结果,该函数无法再执行。

您能否尝试仅替换正文中包含在脚本标记旁边的元素的内容?例如:

<body> <div id="content"> <form ... <button ... </div> <script> ... </script> </body>

【讨论】:

  • 我刚刚在 setTimeout 中重新尝试了 alert(),结果相同。我会尝试用 innerHTML 或其他东西替换我的 document.write 语句,看看它是否有效。
猜你喜欢
  • 2016-11-15
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2020-07-22
  • 2018-06-24
  • 2020-07-02
相关资源
最近更新 更多