Javascript 控制计时器的最佳方法是什么?
我继承了这段代码,并且已经玩了很长时间。第一次倒计时的时候我已经开始工作了,但是在第一次刷新之后,我相信我仍然有第二次或者第三次计时器在运行。我确信我需要实现clearInterval()以保持20分钟的稳定计时器,但我不确定如何正确地执行此操作。任何帮助都将不胜感激Javascript 控制计时器的最佳方法是什么?,javascript,Javascript,我继承了这段代码,并且已经玩了很长时间。第一次倒计时的时候我已经开始工作了,但是在第一次刷新之后,我相信我仍然有第二次或者第三次计时器在运行。我确信我需要实现clearInterval()以保持20分钟的稳定计时器,但我不确定如何正确地执行此操作。任何帮助都将不胜感激 <script type="text/javascript"> var DoLogout = 1; var WarnMills; var TimeoutMills; var WarnDu
<script type="text/javascript">
var DoLogout = 1;
var WarnMills;
var TimeoutMills;
var WarnDurationMills;
var RedirectURL;
var _timeLeft;
function StartTimeout(TimeoutValue, WarnValue, WarnDuration, URLValue) {
TimeoutMills = TimeoutValue;
WarnMills = WarnValue;
WarnDurationMills = WarnDuration;
RedirectURL = URLValue;
setTimeout(UserTimeout, TimeoutMills);
setTimeout(WarnTimeout, WarnMills);
}
function UserTimeout() {
if (DoLogout == 1) {
top.location.href = RedirectURL;
}
else {
DoLogout = 1;
setTimeout(UserTimeout, TimeoutMills);
setTimeout(WarnTimeout, WarnMills);
}
}
function WarnTimeout() {
_timeLeft = (WarnDurationMills / 1000);
updateCountDown();
$find('mdlSessionTimeout').show();
}
function updateCountDown() {
var min = Math.floor(_timeLeft / 60);
var sec = _timeLeft % 60;
if (sec < 10)
sec = "0" + sec;
document.getElementById("CountDownHolder").innerHTML = min + ":" + sec;
if (_timeLeft > 0) {
_timeLeft--;
setTimeout(updateCountDown, 1000);
}
else {
window.location.replace("AdminLogin.aspx");
}
if (_timeLeft < (5 * 60)) {
$find('mdlSessionTimeout').show();
}
}
function PreserveSession() {
{
$.ajax({
type: "POST",
url: "SessionKeepAlive.asmx/Check",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
async: false,
cache: false,
success: checkAuthenticatedOk,
error: checkAuthenticatedError
});
}
}
function checkAuthenticatedOk() {
DoLogout = 0;
_timeLeft = (20 * 60);
TimeoutMills = (20 * 60 * 1000);
$find('mdlSessionTimeout').hide();
}
function checkAuthenticatedError() {
window.location.replace("AdminLogin.aspx");
}
var-DoLogout=1;
瓦恩米尔斯;
var定时器;
var-WarntionMills;
var重定向url;
var_timeLeft;
函数StartTimeout(TimeoutValue、WarnValue、WarnDuration、URLValue){
TimeoutMills=TimeoutValue;
WarnMills=WarnValue;
WarnDurationMills=警告持续时间;
重定向URL=URLValue;
setTimeout(UserTimeout,TimeoutMills);
setTimeout(WarnTimeout,WarnMills);
}
函数UserTimeout(){
if(DoLogout==1){
top.location.href=重定向URL;
}
否则{
DoLogout=1;
setTimeout(UserTimeout,TimeoutMills);
setTimeout(WarnTimeout,WarnMills);
}
}
函数WarnTimeout(){
_timeLeft=(WarnDurationMills/1000);
updateCountDown();
$find('mdlSessionTimeout').show();
}
函数updateCountDown(){
var min=数学楼层(_timeLeft/60);
var sec=_timeLeft%60;
如果(第10节)
秒=“0”+秒;
document.getElementById(“倒计时持有者”).innerHTML=min+“:”+sec;
如果(_timeLeft>0){
_时间限制--;
setTimeout(updateCountDown,1000);
}
否则{
window.location.replace(“AdminLogin.aspx”);
}
如果(_timeLeft<(5*60)){
$find('mdlSessionTimeout').show();
}
}
函数保存会话(){
{
$.ajax({
类型:“POST”,
url:“SessionKeepAlive.asmx/Check”,
数据:“{}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:false,
cache:false,
成功:checkAuthenticatedOk,
错误:checkAuthenticatedError
});
}
}
函数checkAuthenticatedOk(){
DoLogout=0;
_时间长度=(20*60);
TimeoutMills=(20*60*1000);
$find('mdlSessionTimeout').hide();
}
函数checkAuthenticatedError(){
window.location.replace(“AdminLogin.aspx”);
}
调用StartTimeout时,请确保已首先清除上一个计时器
var userTimeoutId, warnTimeoutId;
function StartTimeout(...){
...
clearTimeout(userTimeoutId);
clearTimeout(warnTimeoutId);
userTimeoutId = setTimeout(UserTimeout, TimeoutMills);
warnTimeoutId = setTimeout(WarnTimeout, WarnMills);
}
也可以在userTimeout函数下编写类似的代码。您可以将
计时器ID
推入一个数组,并在必要时检索它们,甚至可以通过在数组上循环来清除所有计时器。我尝试了您的答案,并将clearTimeout添加到userTimeout函数中,倒计时在一个刻度内从14分钟变为5分钟。还有其他想法吗?