【问题标题】:how to create a javascript countdown which on refreshing continues counting如何创建一个javascript倒计时,刷新时继续计数
【发布时间】:2012-01-17 17:49:42
【问题描述】:

我尝试使用 javascript 和 jquery,但不知道该怎么做。我不会让计时器重新开始计数。当他倒计时 3,2 并且刷新他不再开始时,这与拍卖相同,它应该从上次结束的地方继续倒计时。在其他产品上,它必须再次从 3 开始计数。有什么想法吗?

编辑:因为有些用户误解了我要搜索的内容。

我的问题是,当有人刷新页面以继续倒计时时,我不知道如何节省时间。如果有人在 21 秒刷新网站并且他或她有 30 秒的时间做出选择。刷新站点后,计数器将在 21 秒后计数,并且在 30 秒内不再重新开始。 没有 ajax。

尽可能硬编码。 如果不可能,则使用 cookie 变体。

【问题讨论】:

  • document.cookie,或localStorage,或硬编码Date值。
  • 硬编码的Date 值仅在您倒计时到特定日期(例如新年)时才有效。如果您有基于用户的相对时间,您需要使用cookie 或本地存储。这并不意味着您必须在 JS 中设置 cookie,您最好使用服务器脚本为用户存储会话值,但会话也依赖于 cookie。
  • 好吧,我是这么想的,但我没有让 javascript 死掉,直到我不知道它只能硬编码做什么。谢谢

标签: javascript jquery-plugins timeout countdown


【解决方案1】:
     var interval = 90000; //90 secounds

      function reset() {
        localStorage.endTime = +new Date() + interval;
      }

      if (!localStorage.endTime) {
        reset();
      }
      function millisToMinutesAndSeconds(millis) {
        var minutes = Math.floor(millis / 60000);
        var seconds = ((millis % 60000) / 1000).toFixed(0);
        return minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
       }
      setInterval(function () {
        var remaining = localStorage.endTime - new Date();
        if (remaining >= 0) {
          document.getElementById("tooltip").innerText =
            millisToMinutesAndSeconds(remaining);
        } else {
          reset();
        }
      }, 100);

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案2】:

它并不完美,但我设计了这个脚本来进行 30 分钟倒计时,然后在最后几秒钟内更改一些文本。唯一的问题是,当它到达 1:00 时,它从 30:60 开始,我还没有想出如何解决这个问题。这可能无法完美地满足您的需求,但它可能会让您走上正确的道路。

<script>
//add leading zeros
setInterval(function() {
function addZero(i) {
    if (i < 10) {
        i = "0" + i;
    }
    return i;
}
var x = document.getElementById("timer");
var d = new Date();
var s = (d.getSeconds());
var m = (d.getMinutes());
var a = addZero(30 - m);
var b = addZero(60 - m);
var c = (60 - s);
var z = "<span style='color:red;font-size:50px;'>" + "Break" + "</span>";
var v = "<span style='color:black;font-size:24px;'>" + "Break" + "</span>";
//Decide how much should be subtracted from the time
if (m > 30) {
    y = b;
}
else if (m < 30) {
    y = a;
}
//elements for changing text
if (y < 2 && c < 15) {
    q = z;
}
else {
    q = v;
}

var t = y + (":" + addZero(c) + " Till Station " + (q));
x.innerHTML = t;
}, 250);
</script>


<div align="center" id="timer" style='color:black;font-size:24px;' ></div>

【讨论】:

  • 我想补充一点,因为这个脚本是基于系统时钟的,刷新页面不会改变时间。该脚本基本上获取当前时间,然后开始从中减去。因此,即使您刷新页面,剩余时间也将保持不变。最后,您可能必须将日期存储在 cookie 中,然后根据 cookie 信息进行计算。
【解决方案3】:

您可以在页面加载时为您的窗口设置一个名称。在设置名称之前,请检查此窗口是否已经有名称。

如果它没有名称,则为窗口设置一个名称并从 0 开始计数,并在每次递增时将计数值保存在 cookie 中。

如果它确实有一个名称(这意味着页面被重新加载),从 cookie 中读取计数值并进行增量并保存到 cookie。

编辑:示例,在体负载时调用 initCount() 函数。使用decrementAndSave函数将count的值递减并保存到cookie中。

var count = 3;// 3 -> 2 -> 1

function getCookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

function setCookie(c_name, value, exdays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
    document.cookie = c_name + "=" + c_value;
}

function initCount() {
    if (window.name) {
        count = getCookie("count_" + window.name);// to keep separate count cookies for each window    
    } else {
        window.name = "w_" + (new Date().getTime());
        count = 3;
        setCookie("count_" + window.name, count, null);
    }
}

function decrementAndSave() {
    count--;
    // separate cookie for each window or tab
    setCookie("count_" + window.name, count, null);
}

【讨论】:

  • 这似乎很容易 omg ^^ 我会尝试但@zzzzBov 要求使用Date 进行硬编码,我整晚都在尝试这样做。这是否可能以及如何。非常感谢!
  • @webfacer 我在帖子中添加了一些示例代码。我认为您可以根据需要对其进行修改和使用。您可能需要添加 setTimeout 函数来每秒调用 decrementAndSave 函数,或者添加一个条件来说明计数变为零时发生的情况等。抱歉,实际上我不知道 zzzzBov 的“带日期的硬代码”是什么意思。
  • 谢谢,我今天会试试,如果它工作正常,请告诉你^^
【解决方案4】:

如果您有倒计时,那么您必须定义某种结束时间。因此,与其进行倒计时并每秒减 1,不如尝试以下方法:

var endTime = new Date(2011,11,13,0,0,0); // Midnight of December 13th 2011
var timer = setInterval(function() {
    var now = new Date();
    var timeleft = Math.max(0,Math.floor((endTime.getTime()-now.getTime())/1000));

    var d, h, m, s;
    s = timeleft % 60;
    timeleft = Math.floor(timeleft/60);
    m = timeleft % 60;
    timeleft = Math.floor(timeleft/60);
    h = timeleft % 24;
    timeleft = Math.floor(timeleft/24);
    d = timeleft;

    document.getElementById('counter').innerHTML = "Time left: "+d+" days, "+h+" hours, "+m+" minutes, "+s+" seconds.";

    if( timeleft == 0) clearInterval(timer);
},1000);

【讨论】:

  • 抱歉,这不是我要搜索的内容。我知道我有一个结束时间。我的问题是,如果有人刷新页面以继续倒计时,我不知道如何保存。如果有人在 21 秒刷新站点并且他或她有 30 秒的时间做出选择。刷新后,计数器将在 21 秒后计数,并在 30 秒后再次开始。
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多