2012-04-16 64 views
1

我们在我们的网站上有一个表格,用户可以填写并提交。有时,他们需要更长的时间填写表格,而不是我们的20分钟会话超时。使用clearTimeout后,setTimeout不起作用

因此,我已经编写了功能来在超时前2分钟弹出一条消息来警告用户,并提供保存并继续(更新会话)的选项。如果留下警告,它会自动保存他们的工作并在2分钟后注销。

如果该消息被忽略,它自动保存工作并将它们记录下来。如果他们点击保存并继续保存,则会保存正常,并且该消息在再过20分钟后(在测试时间缩短的情况下)弹出备份,但是,后续时间如果再过2分钟,则不会将其注销它被忽略。

这是我写的JavaScript。任何人都能看到任何问题?

init();<body>标记中被称为onLoad

var logoutTimer = setTimeout('saveAndLogOut();', 1000 * 60 * 1.5); 

function init() { 
    setTimeout('expirationWarning();', 1000 * 60 * 1); 
    logoutTimer; 
} 

function expirationWarning() { 
    $('#session-expiry-warning').dialog({ 
     show: 'fade', 
     hide: 'fade', 
     title: 'Your session is about to expire...', 
     buttons: { 
      "Save and Continue": function() { 
       ajaxSave('saved'); 
       clearTimeout(logoutTimer); 
       init(); 
       $(this).dialog("close"); 
      } 
     }, 
     width: 550, 
     closeOnEscape: false, 
     open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); }    
    }); 
} 

function saveAndLogOut() { 
    ajaxSave('autosaved'); 
    setTimeout("parent.document.location.href = '../logout.asp';", 5000); 
} 

在此先感谢。

+1

['setTimeout'(https://developer.mozilla.org/en/DOM/window.setTimeout)接受一个函数,而不是代码。不建议使用代码**。你可能想改变它,例如'var logoutTimer = setTimeout(saveAndLogOut,1000 * 60 * 1.5);'。另见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/eval#Don%27t_use_eval! – Zeta 2012-04-16 10:29:17

+0

没有意识到我可以做到这一点。看起来很整洁。谢谢。 – 2012-04-16 10:42:00

回答

2

logoutTimer仅在您粘贴的第一行代码中设置一次。如果用户点击“保存并继续”,logoutTimer将被清除。在任何时候它都不会成为任何事情。

您是否打算在init()中设置计时器?目前在那里只有logoutTimer;,这并没有什么作用。如果您希望在此时重新设置计时器,则需要在init中包含整个setTimeout命令。

+0

谢谢。我非常黯淡。这很有道理。 – 2012-04-16 10:41:23

2

首先,不要在setTimeout函数中使用字符串。身高:以下内容:

setTimeout(saveAndLogOut, time) 

其次,作为@大卫说,你的setTimeout是不是当你在init()功能显示logoutTimer变量调用。它看起来像你想以下几点:

var logoutTimer = function() { setTimeout(saveAndLogOut, 1000 * 60 * 1.5) } 

// Then, in your init function: 
logoutTimer()