【问题标题】:Countdown timer not working within setTimeout(function() { ... }倒数计时器在 setTimeout(function() { ... } 内不起作用
【发布时间】:2021-07-24 20:56:16
【问题描述】:

函数 totsessie2stopt();在这里可以正常运行:https://jsfiddle.net/szua2fed/

    // Begin countdown
function totsessie2stopt() {
  (function() {
    var start = new Date;
    start.setHours(23, 30, 0); // 11pm

    function pad(num) {
      return ("0" + parseInt(num)).substr(-2);
    }

    function tick() {
      var now = new Date;
      if (now > start) { // too late, go to tomorrow
        start.setDate(start.getDate() + 1);
      }
      var remain = ((start - now) / 1000);
      var hh = pad((remain / 60 / 60) % 60);
      var mm = pad((remain / 60) % 60);
      var ss = pad(remain % 60);
      document.getElementById('time').innerHTML = " Still " + hh + " hours and " + mm + " minutes and " + ss + " seconds to go!";
      setTimeout(tick, 1000);
    }

    document.addEventListener('DOMContentLoaded', tick);
  })();
}
totsessie2stopt();
// End countdown

这只是一个倒计时。

问题是当我把这个函数放在 setTimeout(function() { ... } 这里时,它不会运行:https://jsfiddle.net/cx59L387/ 这个函数应该在第 2 行的给定时间运行。

setTimeout(function() {
document.getElementById("test1").innerHTML = "This message will display at a given time on line 2!";



// Begin countdown
function totsessie2stopt() {
  (function() {
    var start = new Date;
    start.setHours(23, 30, 0); // 11pm

    function pad(num) {
      return ("0" + parseInt(num)).substr(-2);
    }

    function tick() {
      var now = new Date;
      if (now > start) { // too late, go to tomorrow
        start.setDate(start.getDate() + 1);
      }
      var remain = ((start - now) / 1000);
      var hh = pad((remain / 60 / 60) % 60);
      var mm = pad((remain / 60) % 60);
      var ss = pad(remain % 60);
      document.getElementById('time').innerHTML = " Still " + hh + " hours and " + mm + " minutes and " + ss + " seconds to go!";
      setTimeout(tick, 1000);
    }

    document.addEventListener('DOMContentLoaded', tick);
  })();
}
totsessie2stopt();
// End countdown

}, totsessie1);

在 setTimeout(function() { ... } 内部,其他函数工作正常。我已经苦苦挣扎了几天,想知道如何在其中运行倒数计时器。有人可以帮忙吗?

非常感谢!

网格

【问题讨论】:

  • totsessie1 变量的值很大,所以超时会在很长一段时间后执行
  • @AlexandroPalacios setTimeout(function() { ... } 中的其他函数运行正常,没有延迟,我不知道你到底是什么意思
  • 他们说的是你有setTimeout(function, totsessie1),其中totsessie1 是一个变量。在提供的未定义变量的代码中,hens settimeout 不会触发。
  • @vanown 我相信它会触发,因为第 7 行会运行,也许我们彼此误解了?你有什么建议我将如何运行第 37 行吗?

标签: javascript scope settimeout


【解决方案1】:

除了totsessie1 变量的值非常高的问题之外,您的超时函数不能在另一个超时函数中运行的另一个原因是这部分代码:

document.addEventListener('DOMContentLoaded', tick);

您在加载 DOM 时调用 tick 函数,但您忘记了由于它在超时函数内,当您附加 EventListener 时 DOM 已经加载,因此永远不会调用该函数。相反,只需正常调用该函数:

tick();

【讨论】:

  • @AlexanderPalacios 这似乎解决了它,使用 tick();而不是 document.addEventListener('DOMContentLoaded', tick);,totsessie1 在jsfiddle.net/szua2fed 上的价值也很高?
  • 在这个脚本中:jsfiddle.net/cx59L387 - 第一个setTimeout 函数有一个非常高的超时值,所以它会在很长一段时间后执行。那是因为您用作超时的totsessie1 在您这样做时具有非常高的价值:var totsessie1 = new Date(sessie1.getFullYear(), sessie1.getMonth(), sessie1.getDate(), 22, 35, 0, 0) - sessie1;
【解决方案2】:

这里有很多复杂性,可能来自改编代码。看起来您只想在给定时间后开始倒计时,在下面的示例中,它将在 3000 毫秒后执行此操作,您可以更改它。

例如,我已经删除了加载的内容,正如我在超时运行时所猜测的那样,这不会是一个问题,setTimeout 延迟已被移动到调用 totsessie2stopt() 的更整洁的函数中,并且关闭被移除为没有必填。

// Begin countdown
function totsessie2stopt() {
 
    var start = new Date;
    start.setHours(23, 30, 0); // 11pm

    function pad(num) {
      return ("0" + parseInt(num)).substr(-2);
    }

    function tick() {
      var now = new Date;
      if (now > start) { // too late, go to tomorrow
        start.setDate(start.getDate() + 1);
      }
      var remain = ((start - now) / 1000);
      var hh = pad((remain / 60 / 60) % 60);
      var mm = pad((remain / 60) % 60);
      var ss = pad(remain % 60);
      document.getElementById('time').innerHTML = " Still " + hh + " hours and " + mm + " minutes and " + ss + " seconds to go!";
      setTimeout(tick, 1000);
    }

    tick();

}

// call totsession2stopt after 3000 ms
setTimeout(function() {
  document.getElementById("test1").innerHTML = "This message will display at a given time on line 2!";
  totsessie2stopt();
}, 3000);

【讨论】:

  • 目标是两个函数都可以设置到一个特定的时间。一旦给出了消息,它应该在那一刻设置倒计时消息,直到也已经给出的时间。我相信现在没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多