2011-08-19 166 views
0

我使用setTimeout(JavaScript函數)每10秒自動刷新頁面,一(1)分鐘後我想停止自動刷新。對於此我使用clearTimeout()javascript函數。 我知道這是不可能的,因爲每次頁面刷新所有javascript變量和函數時都會重新初始化。停止JavaScript自動刷新後修復時間爲1分鐘

我想這可能是從服務器端可能(使用會話變量) ,請幫助我們解決這個問題,在此先感謝.....

我的代碼下面

<html> 
<script type="text/javascript"> 
var t; 
var j; 
function load() 
{ 
t=setTimeout("refresh()", 10000); 
j=setTimeout("stop()", 60000); 

} 
function refresh(){ 
window.location.reload() 
load() 
} 

function stop(){ 
clearTimeout(t); 
} 
</script> 
</head> 
<body onload="load()"> 
</body> 
</html> 
給出測試

回答

0

而不是使用window.location.reload(),考慮使用AJAX動態加載所需的信息,而無需刷新頁面。正如其他人指出的那樣,您可以使用URL參數,但對於用戶而言,更新整個頁面並不困難。

這裏有一個關於AJAX的教程用PHP:http://www.tizag.com/ajaxTutorial/ajaxform.php

0

你可以pass an arbitrary HTML page parameters。這些不會在服務器上處理,而是在客戶端上處理。

然後,遞增給定的參數,或初始化,如果沒有給出。通過這種方式,您可以在頁面重新加載之間保持跟蹤。

1

您的變量tj無法在頁面重新加載時生效(它們在重新加載頁面時會獲得全新的值,因此您的stop()函數和其他邏輯無法工作)。如果您希望「下一次」頁面重新加載不再自動刷新,那麼您將不得不使用某種狀態進行通信,以確保在頁面重新加載後仍然有效。你簡單的選擇是設置一個cookie或者在你再次加載頁面時使用URL參數。

一種方法是設置一個cookie保持重載軌道:

function load() 
{ 
    reloadCnt = getCookie("cnt") || 0; 
    if (reloadCnt < 10) { 
     setTimeout(function() { 
      setCookie("cnt", reloadCnt + 1, 1); // cookie that expires in one day 
      window.location.reload(); 
     }, 10000); 
    } 
} 

的getCookie和setCookie方法是從this library功能雖然任何Cookie訪問庫可以使用。

另一種選擇是使用你每次增加一個查詢參數:

function load() 
{ 
    var reloadCnt = 0; 
    var re = /reloadCnt=(\d+)/; 
    var foundReloadParm = false; 
    var parms = window.location.search; 
    var matches = parms.match(re); 
    if (matches && matches.length > 1) { 
     foundReloadParm = true; 
     reloadCnt = parseInt(matches[1], 10); 
    } 
    if (reloadCnt < 10) { 
     setTimeout(function() { 
      var url; 
      if (foundReloadParm) { 
       url = window.location.href.replace(re, "reloadCnt=" + (reloadCnt + 1)); 
      } else { 
       if (window.location.href.indexOf("?") == -1) { 
        url = window.location.href + "?reloadCnt=1"; 
       } else { 
        url = window.location.href + "&reloadCnt=1"; 
       } 
      } 
      window.location.replace(url); 
     }, 10000); 
    } 
} 
0

既然你沒有指定任何服務器端語言,我會建議我想到的第一個解決方案:把整個頁面放在一個iframe中,並在它旁邊放上你的JavaScript代碼。您也可以用setTimeout替換第一個setInterval,它將繼續調用該功能,直到您致電clearInterval。最後,你應該用這個代替刷新()函數:

function refresh() 
{ 
var if = document.getElementById('iframeid'); 
if.src = if.src; 
} 

你的腳本應該是這樣的:

<script type="text/javascript"> 
var t; 
var j; 
function load() 
{ 
t=setInterval("refresh()", 10000); 
j=setTimeout("stop()", 60000); 
} 

function refresh() 
{ 
var if = document.getElementById('iframeid'); 
if.src = if.src; 
} 

function stop(){ 
clearInterval(t); 
} 
</script> 
1

坦率地說,哎呀!

首先,請不要將字符串傳入setTimeout,請注意,這太糟糕了。特別是當你甚至沒有傳遞任何參數。

做這樣的事情,而不是:

​​

這樣,你傳遞一個引用到實際功能,而不是調用由代理eval()。道格拉斯克羅克福德將轉入他的墳墓(如果他死了)。

接下來,所有javascript語句應以;終止,而不是隨機的行。

接下來,在t中的超時被觸發並調用window.location.reload()後,您的任何代碼都不會執行任何操作。當頁面重新加載時,基本上已經有了一個新的環境,並有一個乾淨的石板,過程將重新開始。

既然這樣,你整個的代碼可以簡寫爲這樣:

<html> 
<head> 
</head> 
<body onload="setTimeout(window.location.reload,10000)"> 
</body> 
</html> 

要解決它,你將需要瀏覽會話之間進行跟蹤。有千種方法可以做到這一點 - 網址參數,餅乾,iframe等等。但其中最簡單的可能是URL(或GET)參數,所以我們將重點關注。

頁面首次加載時,我們需要通過創建一個整數值開始跟蹤,隨着時間的推移我們可以增加整數值。然後,在每個連續的負載上,我們需要檢查當前值是否在範圍內,如果是,請遞增並將其傳遞給下一次迭代。

所以你可以做這樣的事情......

<html> 
    <head> 
    <script type="text/javascript"> 

     var refreshURL; // Declare this globally so we can access it in the function from refreshPage() 

     function refreshPage() { 
     window.location.href = refreshURL; 
     } 

     window.onload = function() { // This construct is equivalent to setting an 'onload=' for the body tag 

     // Declare some variables 
     var urlBase, urlParams, urlParts, trackerVar, urlBase, queryStr, i, queryParts, paramParts, paramKey, paramVal, j; 
     urlParams = {}; 

     // Parse the URL parameters into an object and get the base URL 
     urlParts = window.location.href.split('?'); 
     urlBase = urlParts[0]; 
     queryStr = ''; 
     for (i = 1; i < urlParts.length; i++) { 
      if (i > 1) { 
      queryStr = queryStr + '?'; 
      } 
      queryStr = queryStr + urlParts[i]; 
     } 
     queryParts = queryStr.split('&'); 
     for (i = 0; i < queryParts.length; i++) { 
      paramParts = queryParts[i].split('='); 
      paramKey = paramParts[0]; 
      paramVal = ''; 
      for (j = 1; j < paramParts.length; j++) { 
      if (j > 1) { 
       paramVal = paramVal + '='; 
      } 
      paramVal = paramVal + paramParts[j]; 
      } 
      urlParams[paramKey] = paramVal; 
     } 

     if (urlParams['__tracker'] == undefined) {  
      // this is the first load, define the tracker as '1' 
      urlParams['__tracker'] = 1; 
     } else { 
      // this is not the first load, increment the tracker 
      urlParams['__tracker'] = parseInt(urlParams['__tracker']) + 1; 
     } 

     // build the url for the refreshPage function 
     refreshURL = urlBase + '?'; 
     queryStr = ''; 
     for (i in urlParams) { 
      if (i != '' && urlParams.hasOwnProperty(i)) { 
      queryStr = queryStr + '&' + i + '=' + urlParams[i]; 
      } 
     } 
     refreshURL = refreshURL + queryStr.substr(1); 

     if (urlParams['__tracker'] < 6) { 
      // If the tracker is less than 6, reload the page in 10 seconds 
      setTimeout(refreshPage,2000); 
     } 

     }; 

    </script> 
    </head> 
    <body> 
    </body> 
</html> 

我知道我是有點晚了這樣的回答,但我認爲這是值得一寫......

+0

只是我身邊的一個側面問題。只要傳遞給'setTimeout'的函數不需要參數,我只需傳遞引用,但是可以避免在需要參數時傳遞字符串,如myFunction(xyz) –

+0

您可以在更高範圍比函數的範圍,可以從調用者和被調用函數訪問。 JS主要是面向對象的語言,雖然它常常被使用得更多,但如果你認爲面向對象的話,你會得到更多的東西。 – DaveRandom

+0

乾杯,謝謝你的提示,會嘗試這一個。 –