2010-02-05 167 views
13

我們有一個遺留應用程序(經典ASP和ASP.net的混合體),它有幾個Ajax內容豐富的頁面。期望的是,該網站的用戶在頁面上執行一組任務,可以跨越相當長的時間,例如15-30分鐘。使用javascript重置元標記以防止刷新頁面

其中一項要求是登錄到站點的用戶在15分鐘不活動後自動註銷。目前正在通過使用元標記將用戶重定向到註銷頁面15分鐘後,在頁面中處於非活動狀態。

<meta name='Refresh' http-equiv="Refresh" content="900;URL=/someurl/logout.asp">

我們遇到的問題是,瀏覽器犯規認爲已經在頁面上的任何活動,儘管有與服務器的許多AJAX交互。因此,在瀏覽器認爲處於非活動狀態的15分鐘後,即使用戶正在做某事,用戶也會自動註銷。

這個message board post的啓發,我們試圖通過使用javascript(JQuery的),像這樣

下面來解決煩惱將是一個事件處理程序等的節約爲簡單起見這裏的頁面點擊等在頁面加載修改刷新時間到5秒

$(document).ready(function() { 
    var selector = 'meta[name=Refresh]'; 
    var content = $(selector).attr("content"); //"900;URL=/someurl/logout.asp" 
    $(selector).attr("content", "5;URL=/someurl/logout.asp"); 
}); 

意圖正在(重新)設置元標記內容的頁面刷新計時器將被重置。不幸的是,這似乎並沒有工作(在IE中)。

由於這是一個傳統的應用程序,所以一些決定即使用元標籤等都會被烘焙。問題是,有沒有辦法讓元標籤刷新和平共存於Ajax應用程序?我做錯了什麼,有沒有辦法解決這個問題?

+1

元刷新與活動無關 - 如果將其設置爲15分鐘,則無論活動如何,都將刷新15分鐘。 – Matt 2010-02-05 20:29:24

+0

看到可能的重複:http:// stackoverflow。com/questions/262305/how-can-i-update-meta-refresh-from-javascript-when-as-asyncronous-calls – Matt 2010-02-05 20:34:54

+0

@Matt,by activity我的意思是這個頁面沒有被重新加載。當我們談論一個經典的asp應用時,我認爲它的含義是在每個帖子上重新加載頁面。 – 2010-02-05 21:54:04

回答

7

假設你正在使用jQuery這樣的事情可能會奏效。我沒有測試過它,也不知道瀏覽器是否會讀取文檔頭中的noscript元素中的meta標籤。

這個替換您的meta標籤:

<script type="text/javascript"> 
    window.onload = function(){ 
     var timer = null, 
      time=1000*60*15, // 15 minutes 
      checker = function(){ 
       if(timer){clearTimeout(timer);} // cancels the countdown. 
       timer=setTimeout(function() { 
        document.location="/someurl/logout.asp"; 
       },time); // reinitiates the countdown. 
      }; 
     checker(); // initiates the countdown. 
     // requires jQuery... (you could roll your own jQueryless version pretty easily though) 
     if(window.jQuery){ 
      // bind the checker function to user events. 
      jQuery(document).bind("mousemove keypress click", checker); 
     } 
    }; 
</script> 
<noscript> 
    <meta name="Refresh" http-equiv="Refresh" content="900;URL=/someurl/logout.asp"> 
</noscript> 

肯定有這樣做的更好的方法。就像服務2頁...一個用戶與JavaScript和一個沒有。

或者只是禁用沒有JavaScript的人的應用程序。 :O)

編輯 根據這個頁面:http://www.google.com/support/forum/p/Webmasters/thread?tid=25c023fea4ea60a4&hl=en元刷新應該無腳本元素在裏面工作。

+0

偉大的代碼,但你錯過了一個「{」在函數()看到下面 – 2017-06-13 01:27:11

0

我不認爲有一種方法可以停止元刷新。您可以更改元標記,但瀏覽器已經決定在15分鐘內刷新;沒有API可以阻止它。

如果你不能停止刷新或使用JavaScript做重定向,也許可以遏制損害:

$(window).unload(function() { 
    // Insert code here 
    // to save the user's work. 
    alert('Sorry, you have to log out now.') 
});