C# 如何在浏览器会话关闭后恢复客户端计时器?

C# 如何在浏览器会话关闭后恢复客户端计时器?,c#,javascript,asp.net,asp.net-mvc,web-applications,C#,Javascript,Asp.net,Asp.net Mvc,Web Applications,假设我有一个定时器,用户点击一个按钮就可以激活它,考虑到两个会话之间的时间间隔,我如何在用户关闭浏览器之前保存数据(当前定时器状态和数据),并在用户访问同一页面后恢复定时器 我的开发基于ASP.NET MVC4,我主要使用ajax调用来服务用户交互 我正在考虑是否有一种方法可以通过服务器端代码控制这种交互和需求,但对此我持怀疑态度 您的想法是什么?通过使用cookies,可以在客户端完成全部操作 以下是流程: 在click事件处理程序中,创建一个计时器 为浏览器关闭事件添加事件处理程序(查看此处

假设我有一个定时器,用户点击一个按钮就可以激活它,考虑到两个会话之间的时间间隔,我如何在用户关闭浏览器之前保存数据(当前定时器状态和数据),并在用户访问同一页面后恢复定时器

我的开发基于ASP.NET MVC4,我主要使用ajax调用来服务用户交互

我正在考虑是否有一种方法可以通过服务器端代码控制这种交互和需求,但对此我持怀疑态度


您的想法是什么?

通过使用cookies,可以在客户端完成全部操作

以下是流程:

  • 在click事件处理程序中,创建一个计时器
  • 为浏览器关闭事件添加事件处理程序(查看此处)
  • 在浏览器关闭事件处理程序中获取计时器的剩余时间(在这里可以找到说明)
  • 用这些信息写一个cookie
  • 在页面加载时检查是否有剩余时间信息的cookie,并使用setTimeout重新创建剩余时间的计时器
  • 我会尽快用更多的代码示例更新这篇文章

    更新

    var timeLeft= $.cookies('timeLeft') || ORIGINAL_VALUE;
    var timer = setTimeout(myFunc, timeLeft);
    $(window).unload(function(){
      var timeLeftToSave = getTimeLeft(timer);
      $.cookies('timeLeft', timeLeftToSave, { path: '/' });
    })
    
    //Use code from the second link here
    function getTimeLeft(timer){
    
    }
    
    
    
    function myFunc(){/*YOUR CODE HERE*/}
    

    您可以尝试在
    unload
    事件中使用当前值创建一个cookie,然后在再次启动计时器时检查它

    $(window).unload(function() {
        // Set a cookie with current timer value
    });
    

    查找有关在Javascript中设置cookies的信息。

    我建议编写一些客户端
    Javascript
    来检测
    onunload
    onbeforeuload
    事件,并将计时器值存储在用户浏览器的本地存储中

    对于处理本地存储,我建议使用一个优秀的库:LawnchairJS。 从有关方面:

    默认情况下,Lawnchair将使用DOM存储持久化,但如果其他 适配器可用,并且不支持DOM存储 当前正在执行JavaScript运行时。Lawnchair将尝试每种方法 连续适配器,直到找到一个有效的适配器


    谢谢,就我所见,答案很完美,但假设用户禁用了cookie,或者我们知道一些恶意javascript/应用程序代码禁用了cookie,您认为还有其他方法来完成这项工作吗?这有点问题,但应该有一些方法,一旦得到解决方案,我会让您知道。我认为您的解决方案很好,但并非适用于所有场景,我觉得这会使事情变得复杂,除了javascript功能本身,我还需要使用第三方库。如果你认为我对此不感兴趣,请澄清。这取决于你计划存储的数据量。如果只有几个字节,那么使用cookies就完全可以了。如果您计划更加依赖客户端处理,并且客户端机器上存储的数据超过几个字节,则通常建议避免将大量数据存储在cookie中,因为这些数据将随每个请求一起发送到服务器,这可能会导致显着的开销。如果在“数据”下在你的问题中,你的意思是存储日期/时间,那么它就足够小,可以存储在cookies中。