2011-08-19 167 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

干杯,谢谢你的提示,会尝试这一个。 –