我是JavaScript的新手。我正在用倒数计时器制作考试申请表。我已经使用了带有cookie的JavaScript计时器,但问题是当计算机关闭时因为计算机被冻结冻结而丢失了cookie。
我的问题是如何使用数据库制作倒数计时器?如何在浏览器关闭时暂停计时器,然后在重新打开浏览器时恢复计时器?
答案 0 :(得分:1)
在不知道您的任何细节(数据库类型,界面等)的情况下,我所能提出的是一些通用性:
答案 1 :(得分:0)
我要做的是在setInterval中使用ajax,比如说每10秒一次,然后将值存储为数据库中的最大时间(以秒为单位)。
每次ajax调用(jQuery.post())时,你都有一个服务器端脚本,可以通过间隔中设置的超时减少数据库中的时间,所以快速举例。
从360秒(10分钟)开始,然后当你的javascript间隔每隔10秒调用ajax时,无论何时运行服务器端代码,你都会将数据库中的值减少10秒。
我做的事情与跟踪输入数据的时间差异相似。
这种方式只要页面打开,javascript代码运行就会继续倒计时,你可以返回剩余的时间,当它小于0时会提示某种消息。如果他们离开一段时间或计算机“冻结”,它会在页面再次加载后立即从它停止的位置开始。
我看到的唯一真正的问题是你会得到所谓的竞争条件,除非你有办法识别每个用户并给他们每个人自己的计时器。为了扩展这个想象,我有2个用户用户A和用户B,如果只是用户A访问页面一切都很好。但是,如果A和B同时使用该页面,则对于每个调用它们各自的ajax请求,它们都将每次减少10秒,总共20秒。
为此你可以使用某种非常基本的用户登录设置。因此,当他们返回时,他们会输入他们的用户名,这样就可以为他们分配正确的计时器。
答案 2 :(得分:0)
一般来说制作这样一个计时器的最佳方法是不存储多少秒,而只是计时器启动时。然后,您可以使用简单的数学来确定剩余的时间。
在你的javascript所在的PHP页面上你应该有一些PHP代码,在页面加载时为用户创建某种形式的条目。这可以是文本文件,MySQL条目,也可以是PHP会话中的某些内容,如果PHP会话生存期足够用于您的用例。在该条目中,您可以使用PHP的time()
存储从首次启动计时器时开始的服务器的系统时间。如果已经存在一个条目当然应该保留,那么用户可以刷新页面而不会意外重置计时器。此页面还应该为您的javascript提供一个包含剩余时间的变量。
然后你有第二个PHP脚本,你可以使用你的javascript(使用HTTP请求)调用,返回计时器$timer_max - (time() - $stored_time)
上剩余的时间你可以让你的javascript每隔几秒钟检查一次计时器,并简单地在客户端上插入两者之间的时间,这样看起来计时器正在向您的用户主动倒计时。
基于启动时间的方法的优点是它更准确,而每10秒左右倒计时的方法可能会随着时间的推移而变得不准确,因为javascript的超时功能对其时间并不严格。对于像PHP这样不运行常量更新循环的东西,它也非常有用,而只是在从Web服务器请求时运行脚本。
编辑(我错过了关于暂停计时器的部分,我的不好。): 对于暂停计时器,这种方法可能不是那么完美,但是可以简单地引入另一个PHP脚本来暂停计时器,存储计时器在条目中暂停的时间和启动时的服务器时间,然后是用户返回$stored_time
可以设置为time() - ($pause_time - $stored_time)
,其中$paused_time
是计时器暂停时的位置。
让服务器检测浏览器何时关闭可以通过让用户在关闭页面之前暂停计时器,使其自动发送HTTP请求来完成(尽管如果浏览器被taskmanager杀死,这将无效)例如,或者通过简单地让服务器记住上次使用我们的第二个脚本检查计时器的时间,并且当用户回来时它应该检查上一个计时器HTTP请求之前的时间,以及它是否超过说您的HTTP请求间隔时间的两倍,那么“上次定时器访问”时间可以被认为是暂停时间。