2012-04-16 131 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()