【问题标题】:Countdown function not working correctly in timeout block倒计时功能在超时块中无法正常工作
【发布时间】:2021-10-01 17:08:30
【问题描述】:

我无法让第二个倒计时功能在第一个 Snippet 中正常工作。我启动了 cdtd();第二次。两者都 cdtd();函数不会发生冲突,并且位于匿名函数内部。当我启动 cdtd();我第一次得到一个工作倒计时计时器,直到 16:00:00。当我第二次启动它时,我将在 17:00:00 之前获得工作倒计时。这是这个问题的实际用例。

为了制作一个示例流程,我制作了第二个 sn-p。两者都 cdtd();确实相互碰撞,但第二个 cdtd();函数调用将返回一个工作倒计时计时器。现在我仍然不知道为什么它在第一个 sn-p 中不起作用。没有我使用的 timeOut 函数。

我不确定出了什么问题。谁有线索?

这是脚本。 https://jsfiddle.net/3fq2j6a1/

我尝试在 eachother 下运行倒计时脚本,但我不需要 :) function cdtd() { .. }

这是一个sn-p:

// First session

var sessie1 = new Date();
var totsessie1 = new Date(sessie1.getFullYear(), sessie1.getMonth(), sessie1.getDate(), 14, 16, 0, 0) - sessie1;
if (totsessie1 < 0) {
  totsessie1 += 86400000; // it's after 10am, try 10am tomorrow.
}
setTimeout(function() {
  document.getElementById("test1").innerHTML = "Message.";


  // First countdown

  function cdtd() {
    var now = new Date();
    var dolazak = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16, 0, 0);
    var timeDiff = dolazak.getTime() - now.getTime();
    if (timeDiff <= 0) {
      clearInterval(timer);
      document.getElementById(id).innerHTML = '';
    }
    //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
    var seconds = Math.floor(timeDiff / 1000);
    var minutes = Math.floor(seconds / 60);
    var hours = Math.floor(minutes / 60);
    var days = Math.floor(hours / 24);
    hours %= 24;
    minutes %= 60;
    seconds %= 60;

    document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " minutes and " + seconds + " seconds to go!";

    timer = setTimeout(cdtd, 1000);
  }

  cdtd();
  // End first countdown

}, totsessie1);

// Second session
var sessie2 = new Date();
var totsessie2 = new Date(sessie2.getFullYear(), sessie2.getMonth(), sessie2.getDate(), 14, 17, 0, 0) - sessie1;
if (totsessie2 < 0) {
  totsessie2 += 86400000; // it's after 10am, try 10am tomorrow.
}
setTimeout(function() {
  document.getElementById("test1").innerHTML = "Message.";


  // Second countdown

  function cdtd() {
    var now = new Date();
    var dolazak = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 17, 0, 0);
    var timeDiff = dolazak.getTime() - now.getTime();
    if (timeDiff <= 0) {
      clearInterval(timer);
      document.getElementById(id).innerHTML = '';
    }
    //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
    var seconds = Math.floor(timeDiff / 1000);
    var minutes = Math.floor(seconds / 60);
    var hours = Math.floor(minutes / 60);
    var days = Math.floor(hours / 24);
    hours %= 24;
    minutes %= 60;
    seconds %= 60;

    document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " minutes and " + seconds + " seconds to go!";

    timer = setTimeout(cdtd, 1000);
  }

  cdtd();
  // End second countdown

}, totsessie2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<p id="test1">This is a paragraph.</p>
<span id="time"></span>

这里是我在eachother下使用倒计时脚本时的sn-p代码。

function cdtd() {
  var now = new Date();
  var dolazak = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 15, 0, 0);
  var timeDiff = dolazak.getTime() - now.getTime();
  if (timeDiff <= 0) {
    clearInterval(timer);
    document.getElementById(id).innerHTML = '';
  }
  //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
  var seconds = Math.floor(timeDiff / 1000);
  var minutes = Math.floor(seconds / 60);
  var hours = Math.floor(minutes / 60);
  var days = Math.floor(hours / 24);
  hours %= 24;
  minutes %= 60;
  seconds %= 60;

  document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " min and " + seconds + " seconds to go! (countdown to line 49)";

  timer = setTimeout(cdtd, 1000);
}

cdtd();

function cdtd() {
  var now = new Date();
  var dolazak = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16, 0, 0);
  var timeDiff = dolazak.getTime() - now.getTime();
  if (timeDiff <= 0) {
    clearInterval(timer);
    document.getElementById(id).innerHTML = '';
  }
  //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
  var seconds = Math.floor(timeDiff / 1000);
  var minutes = Math.floor(seconds / 60);
  var hours = Math.floor(minutes / 60);
  var days = Math.floor(hours / 24);
  hours %= 24;
  minutes %= 60;
  seconds %= 60;

  document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " min and " + seconds + " seconds to go! (countdown to line 49)";

  timer = setTimeout(cdtd, 1000);
}

cdtd();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<p id="test1">This is a paragraph.</p>
<span id="time"></span>

https://jsfiddle.net/edfcLzhw/

但我需要在会话块中使用它们。这样做时,第二个倒数计时器会剩下不同的时间。 totsessie1(); totsessie2();

倒计时脚本来自:Javascript countdown defined with hours

【问题讨论】:

  • 您的代码应该出现在in问题中,而不是链接后面。当你这样做时,请只提供重现问题所需的最少代码。所以去掉任何不需要说明问题的东西。
  • 由于问题的性质,很难仅通过某些代码。这是因为第二个倒数计时器仅在发布所有代码时才起作用。此外,会话 setTimeout 函数仅在我提供代码的所有部分时才有效。我尝试在使用 ctrl-k 并粘贴时在此处插入完整代码,但它确实有点混乱。
  • 阅读指南。确保代码出现在两行之间,每行都有三个反引号。由于它是 JavaScript,您还可以使用工具栏在您的问题中创建一个可运行的 sn-p。抱歉,您的问题必须包含所有相关信息,而不是链接。
  • 我现在使用的是 sn-ps trincot。感谢您的解释。希望通过更多地按照指导方针工作,这种方式会变得更加清晰。唯一的缺点是 sn-ps 示例中给出的时间不能以这种方式更改,只要它是静态代码。在 jsfiddle 中它是可变的。
  • 您的代码定义了两个同名的函数,这意味着只会定义第二个函数。您至少应该为您的函数使用不同的名称。您能否描述(在您的问题中)预期的行为到底是什么?当我们不知道您想要实现什么时,我们无法知道“正确运行”对您意味着什么。

标签: javascript timer settimeout setinterval countdown


【解决方案1】:

我现在解决了这个问题。我没有在 2 点上正确地编写代码。 第一件事。我使用的函数 totsessie1() 也是第二个 totsessie1() 函数。我将第二个更改为 totsessie2()。我也没有使用 clearInterval(timer);在运行第二个 cdtd();.

这是最终目标的工作 sn-p:

// First session

var sessie1 = new Date();
var totsessie1 = new Date(sessie1.getFullYear(), sessie1.getMonth(), sessie1.getDate(), 15, 25, 0, 0) - sessie1;
if (totsessie1 < 0) {
  totsessie1 += 86400000; // it's after 10am, try 10am tomorrow.
}
setTimeout(function() {
  document.getElementById("test1").innerHTML = "Message.";


// First countdown

function cdtd() {
    var now = new Date();
    var dolazak = new Date(now.getFullYear(),now.getMonth(),now.getDate(),16,0,0);
    var timeDiff = dolazak.getTime() - now.getTime();
    if (timeDiff <= 0) {
        clearInterval(timer);
                document.getElementById(id).innerHTML = '';
    }
    //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
    var seconds = Math.floor(timeDiff / 1000);
    var minutes = Math.floor(seconds / 60);
    var hours = Math.floor(minutes / 60);
    var days = Math.floor(hours / 24);
    hours %= 24;
    minutes %= 60;
    seconds %= 60;

    document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " minutes and " + seconds + " seconds to go!";

    timer = setTimeout(cdtd, 1000);
}

cdtd();
// End first countdown

}, totsessie1);

// Second session
var sessie2 = new Date();
var totsessie2 = new Date(sessie2.getFullYear(), sessie2.getMonth(), sessie2.getDate(), 15, 26, 0, 0) - sessie2;
if (totsessie2 < 0) {
  totsessie2 += 86400000; // it's after 10am, try 10am tomorrow.
}
setTimeout(function() {
  document.getElementById("test1").innerHTML = "Message.";


// Second countdown

clearInterval(timer);
function cdtd() {
    var now = new Date();
    var dolazak = new Date(now.getFullYear(),now.getMonth(),now.getDate(),17,0,0);
    var timeDiff = dolazak.getTime() - now.getTime();
    if (timeDiff <= 0) {
        clearInterval(timer);
                document.getElementById(id).innerHTML = '';
    }
    //if(minutes < 2){document.getElementById(id).style.color="#ff0000";};
    var seconds = Math.floor(timeDiff / 1000);
    var minutes = Math.floor(seconds / 60);
    var hours = Math.floor(minutes / 60);
    var days = Math.floor(hours / 24);
    hours %= 24;
    minutes %= 60;
    seconds %= 60;

    document.getElementById('time').innerHTML = " Still " + hours + " hours, " + minutes + " minutes and " + seconds + " seconds to go!";

    timer = setTimeout(cdtd, 1000);
}

cdtd();
// End second countdown

}, totsessie2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<body>

<p id="test1">This is a paragraph.</p>
<span id="time"></span>

</body>
</html>

JSFiddle:https://jsfiddle.net/nwvk8h12/

【讨论】:

  • 你的totsessie* 不是函数,它们是包含数字的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多