【问题标题】:Retain setTimeout() After Page Refreshes or Moves To Another Page页面刷新或移动到另一个页面后保留 setTimeout()
【发布时间】:2013-07-19 02:54:14
【问题描述】:

我需要在 15 分钟后显示我的警报消息,但如果页面刷新或我更改页面,它就不起作用。我在同一个网页上这样做。当我按下一个按钮时,它应该调用showPopUp() 方法。我正在使用带有 Visual Studios 2005 版本的 asp.net。

function showPopUp(){
  setTimeout(function() {alert("Warning");}, 5000);
}
 
function delayer(){
  showPopUp();
}

【问题讨论】:

  • @Travis J 我不明白你们为什么宣布这条评论离题。我放了足够多的代码和 cmets 来解释情况。

标签: c# javascript asp.net ajax


【解决方案1】:
  1. 将初始时间存储在本地存储中
  2. 每当页面加载时,将本地存储中的值与当前时间进行比较,然后从上次中断的地方重新开始超时。

所以像这样(未经测试):

var waitTime = 900000; // 15 minutes
var executionTime;
var initialTime = localStorage.getItem("initialTime");
if (initialTime === null) {
    localStorage.setItem("initialTime", (new Date()).getTime());
    executionTime = waitTime;
}
else {
    executionTime = parseInt(initialTime, 10) + waitTime - (new Date()).getTime();
    if (executionTime < 0) executionTime = 0;
}

setTimeout(function() { 
    alert("Warning"); 
    // reset the timeout to start from waitTime on page reload
    localStorage.removeItem("initialTime");
}, executionTime);

编辑:

如果您不想使用 localStorage,可以将其存储在 asp.net 会话变量中,如下所示:

Session["InitialTime"] = (DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;

然后对上面的 javascript 代码执行类似的逻辑,并将结果作为 setTimeout 函数中的第二个参数输出(但请记住将秒转换为毫秒为 setTimeout)。

【讨论】:

  • +1。请注意,无法自动保存和恢复 setTimeout 调用使用的回调,因为它们依赖于刷新时完全丢失的 JavaScript 引擎的状态。必须明确设计功能在页面刷新后“可恢复” - 因此避免页面刷新(即使用 AJAX 调用来刷新页面)可能是更好的方法。
  • LocalStorage(或网络存储)得到很好的支持,但仅供参考,它不适用于某些较旧的浏览器。如果您采用这种方法,我建议您查看caniuse.com/namevalue-storage 以确保它可以满足您的需求。这是一个仅限客户端的解决方案。查看这篇文章,了解客户端/服务器解决方案stackoverflow.com/questions/4883676/… 的一般概念。它是用 PHP 编写的,但希望它可以提供帮助。
  • @PavelPatino 是的,使用服务器端代码是我的第二个想法。很高兴大多数浏览器都可以只使用 javascript。
  • @dhtso 我还需要存储按下按钮的时间吗?
  • 哦,废话,我正在将“SessionStorage”翻译为 .NET 中的标准 Session 类。
猜你喜欢
  • 2017-09-23
  • 2019-10-24
  • 2019-04-28
  • 2011-08-23
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多