Javascript定时器倒计时

Javascript定时器倒计时,javascript,html,css,Javascript,Html,Css,我在JS中有一个1:30分钟的计时器,属于测验。在测验中,如果用户选择了错误的答案,计时器将被扣除10秒。那部分正在发挥作用。但是,当计时器达到1:00时,它将重新启动到1:59秒,并且实际上从未低于1分钟 function startTimer() { var p_time = document.getElementById('time').innerHTML; var timeArray = p_time.split(/[:]+/); var min = timeArray[0]

我在JS中有一个1:30分钟的计时器,属于测验。在测验中,如果用户选择了错误的答案,计时器将被扣除10秒。那部分正在发挥作用。但是,当计时器达到1:00时,它将重新启动到1:59秒,并且实际上从未低于1分钟

function startTimer() {
  var p_time = document.getElementById('time').innerHTML;
  var timeArray = p_time.split(/[:]+/);
  var min = timeArray[0];
  var sec = checkSecond((timeArray[1] - 1));
  if (sec === 59) {
    min = min - 1
  }

  document.getElementById('time').innerHTML = min + ":" + sec;

  if (min <= 0 && sec == 0) {
    clearTimeout(timerRef)
    alert("Time is up!")
    return;
  }

  if(min === 1 && sec === 0) {
    min = 0;
  }
  setTimeout(startTimer, 1000);
}

function checkSecond(seconds) {
  if (seconds < 10 && seconds >= 0) {
    seconds = "0" + seconds
  };
  if (seconds < 0) {
    seconds = "59"
  };
  return seconds;
}

function wrongTimer () {
  var x_time = document.getElementById('time').innerHTML;
  var wrongArray = x_time.split(/[:]+/);
  var x_min = wrongArray[0];
  var x_sec = checkSecond((wrongArray[1]-1));
  if(x_sec === 59) {
    x_min = x_min - 1
  }
  x_sec -= 10;
  console.log(document.getElementById('time').innerHTML);
  console.log("sec " + x_sec);
  document.getElementById('time').innerHTML = x_min + ":" + x_sec;
}
稍后在代码未显示中调用错误计时器函数。如何使计时器在可能的扣除后继续倒计时

问题是sec==59,您正在检查sec是否为59号,但sec是否为59字符串

您可以将字符串解析为数字,也可以只检查sec是否为字符串59

我刚刚在下面的示例中完成了后一个工作片段:

功能启动器{ var p_time=document.getElementByIdtime.innerHTML; var timeArray=p_time.split/[:]+/; var min=时间数组[0]; var sec=checkSecondtimeArray[1]-1; 如果sec==59{/问题是sec==59,则检查sec是否为59号,但sec是否为59字符串

您可以将字符串解析为数字,也可以只检查sec是否为字符串59

我刚刚在下面的示例中完成了后一个工作片段:

功能启动器{ var p_time=document.getElementByIdtime.innerHTML; var timeArray=p_time.split/[:]+/; var min=时间数组[0]; var sec=checkSecondtimeArray[1]-1;
如果sec==59{/,那么重构代码可能会更好,这样内存中就有一个计数器,跟踪计时器在2分钟开始时应该有多少秒ie 120,然后在1分钟时降到60秒。 这种设置将更容易编码成用户体验友好的计时器MM:SS,因为您将始终以一种方式进行转换,对该代码的任何添加或扣减都将简单地进行到该计数器,然后在UI中向下流到您的转换

现在,你可以在HTML中找到剩余的时间,拿出时间段,拿出秒和分钟,然后进行所有的扣除。这需要比实际需要更多的计算。从1:00到0:59也是一件非常痛苦的事情


尽管如此,还是应该提醒您,如果您在客户端跟踪此计数器变量,它可能会被聪明的人操纵,给他们比预期更多的时间。您必须小心如何确保计时器的完整性,无论是在本解决方案中还是在其他解决方案中。

重构代码可能对您更有效因此,内存中有一个计数器,记录计时器在2分钟开始时应该有多少秒,然后在1分钟时下降到60秒。 这种设置将更容易编码成用户体验友好的计时器MM:SS,因为您将始终以一种方式进行转换,对该代码的任何添加或扣减都将简单地进行到该计数器,然后在UI中向下流到您的转换

现在,你可以在HTML中找到剩余的时间,拿出时间段,拿出秒和分钟,然后进行所有的扣除。这需要比实际需要更多的计算。从1:00到0:59也是一件非常痛苦的事情


尽管如此,还是应该提醒您,如果您在客户端跟踪此计数器变量,它可能会被聪明的人操纵,给他们比预期更多的时间。您必须小心如何确保计时器的完整性,无论是在本解决方案中还是在其他解决方案中。

您使用的是严格的比较运算符===仅当两个元素具有相同值且类型相同时才返回true的比较。问题是您的秒变量是字符串,因此与ints的比较将返回false,而与值无关

我应用了一些其他修复程序并删除了一些不必要的代码,请检查以下内容:

功能启动器{ var p_time=document.getElementById'time'.innerHTML; var timeArray=p_time.split:; var min=时间数组[0]; var sec=checkSecondtimeArray[1]-1; 如果秒=59{ 最小=最小-1 } 如果最小值<0{ clearTimeouttimerRef 时间到了! 回来 } document.getElementById'time'。innerHTML=min+:+sec; var timerRef=settimeoutparttimer,1000; } 功能检查秒数{ 如果秒数<10&&s>=0{ 秒=0+秒 }; 如果秒数小于0{ 秒=59 }; 返回秒数; } 功能错误计时器{ var x_time=document.getElementById'time'.innerHTML; var errorArray=x_time.split/[:]+/; var x_min=错误数组[0]; var x_sec=checkSecondErrorArray[1]-1; ifx_sec==59{ x_min=x_min-1 } x_sec-=10; console.logdocument.getElementById'time'.innerHTML; console.logsec+x_sec; document.getElementById'time'。innerHTML=x_min+:+x_sec; } startTimer;
1:10您正在使用严格的比较运算符===进行比较,只有当两个元素具有相同的值且类型相同时,才会返回true。问题是您的secon ds变量是一个字符串,因此与ints的比较将返回false,而与值无关

我应用了一些其他修复程序并删除了一些不必要的代码,请检查以下内容:

功能启动器{ var p_time=document.getElementById'time'.innerHTML; var timeArray=p_time.split:; var min=时间数组[0]; var sec=checkSecondtimeArray[1]-1; 如果秒=59{ 最小=最小-1 } 如果最小值<0{ clearTimeouttimerRef 时间到了! 回来 } document.getElementById'time'。innerHTML=min+:+sec; var timerRef=settimeoutparttimer,1000; } 功能检查秒数{ 如果秒数<10&&s>=0{ 秒=0+秒 }; 如果秒数小于0{ 秒=59 }; 返回秒数; } 功能错误计时器{ var x_time=document.getElementById'time'.innerHTML; var errorArray=x_time.split/[:]+/; var x_min=错误数组[0]; var x_sec=checkSecondErrorArray[1]-1; ifx_sec==59{ x_min=x_min-1 } x_sec-=10; console.logdocument.getElementById'time'.innerHTML; console.logsec+x_sec; document.getElementById'time'。innerHTML=x_min+:+x_sec; } startTimer;
1:10请提供html和完整的工作示例,以便我们重现问题。事实上,我们没有足够的资源来帮助您,而不必费尽心机地填写gapsIt,它看起来像是将状态存储在DOM中的HTML元素中。也许您应该将计时器的状态存储在Javascript内存中,例如,作为一个变量。这将更加有效,因为您不必每秒都解析DOM的当前时间。通过更改DOM元素的值,用户更难绕过计时器。请提供html和完整的工作示例,以便我们重现问题。事实上,我们没有足够的资源来帮助您,而不必费尽心机地填写gapsIt,它看起来像是将状态存储在DOM中的HTML元素中。也许您应该将计时器的状态存储在Javascript内存中,例如,作为一个变量。这将更加有效,因为您不必每秒都解析DOM的当前时间。这也会让你的用户更难通过更改DOM元素的值来绕过计时器。感谢你修复了其他错误,尽管我仍然认为这超出了范围:没问题,我同意:我想我会向你提及,因为这是一个简单的修复。现在,OP不必再发布另一个问题:感谢修复其他bug,尽管我仍然认为这超出了范围:没问题,我同意:我只是想向您提及它,因为它是一个简单的修复。现在OP不必再发布另一个问题:D