关于js函数中带条件定时刷新的问题

时间:2022-03-10 21:54:15
最近在做一个程序运行记录定时查询的功能,类似于现在12306自动刷票的功能,但是一直出不来效果,请指教,现将方法贴出来。

js中方法:

   function refreshJsp(){
        var logId = $("#logId").val();  //自身id
var status = $("#logStatus").val();//状态
var startDate = $("#logStartdate").val();
var endDate = $("#logEnddate").val();
window.location.href="listLogDataCycle.action?etlId="+
etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate;  
setTimeout("refreshJsp()",5000); 
               }  


在jsp页面就遍历获得的list集合。我看网上setTime()的用法就是如此,但不知道为什么,就是出不来效果,只是在点击查询的时候查询了一次,定时没起效果,后将方法改成常量测试,setTimeout()的效果就出来了,测试代码如下:

   var i=0;
 function refreshJsp(){
        var logId = $("#logId").val();  //自身id
var status = $("#logStatus").val();//状态
var startDate = $("#logStartdate").val();
var endDate = $("#logEnddate").val();

                i++
                alert(i);
//window.location.href="listLogDataCycle.action?etlId="+
//etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate;  
setTimeout("refreshJsp()",5000); 
               }  

证明用法正确,但是一发请求就不行了,又怀疑是请求方式不对,就把请求方式换成了ajax请求,window.location.href="listLogDataCycle.action?”xxx请求换成了$.post("listLogDataCycle.action",{
  "logId ":logId ,
   xxxx
});
这次一次请求也不发了,求指点原因!

21 个解决方案

#1


在线等............................................ 关于js函数中带条件定时刷新的问题

#2



<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>

#3


引用 1 楼 lijibo503 的回复:
在线等............................................ 关于js函数中带条件定时刷新的问题

您这是等5秒调一次请求方法,也只是执行了一次。

#4


引用 2 楼 MengYouXuanLv 的回复:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>


您这是等5秒调一次请求方法,也只是执行了一次。

#5


用setInterval()试试

#6



<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
$(refreshJsp);
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body >
</body>

</html>
你这样写执行一次就跳转了 ,改成ajax吧

#7


引用 4 楼 lijibo503 的回复:
Quote: 引用 2 楼 MengYouXuanLv 的回复:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>


您这是等5秒调一次请求方法,也只是执行了一次。

画面都刷新了 还用什么ajax

#8


    window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
这句话直接就把页面刷新了。ajax干嘛? 5秒刷新一次。查询一次有啥问题呢

#9


setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

#10


就LZ的页面逻辑而言,setTimeout/setInterval是一样的,没区别

因为页面加载后,设定5秒后刷新一次页面,页面都跳转了,计时重新开始,是延迟几秒执行还是每隔几秒重复执行都没有区别了...

#11


引用 8 楼 cears 的回复:
    window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
这句话直接就把页面刷新了。ajax干嘛? 5秒刷新一次。查询一次有啥问题呢

我想实现的是循环查询

#12


引用 10 楼 danica7773 的回复:
就LZ的页面逻辑而言,setTimeout/setInterval是一样的,没区别

因为页面加载后,设定5秒后刷新一次页面,页面都跳转了,计时重新开始,是延迟几秒执行还是每隔几秒重复执行都没有区别了...

是的,对我来说这两个效果是一样的,我估计是页面一跳转(虽然是跳到本页面),setTimeout()就触发不了了,除非setTimeout()函数定义为页面一加载就执行,但是这不是我要的效果,我想的是点击查询的时候再触发循环查询,这就产生了矛盾。

#13


引用 9 楼 sad_life 的回复:
setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?

#14


那只能想点别的办法了,比如说用cookie记录或url后面带个什么参数来表示页面进入自动循环

以url为例,一开始的页面是a.html,当你按下自动循环按钮的时候,页面跳转到a.html?auto=1

页面内事先有一个方法
window.onload = function () {
    var auto = url内auto的值 || 0;
    if(auto == 1) {
        setTimeout(refreshJsp, 5000);
    }  
}

页面内按钮的方法就是
function autoRefresh() {
    var auto = url内auto的值 || 0;
    if(auto == 1) {//开启了循环,则关闭
        loaction.href = a.html;
    }else{//没有开启,则打开
        loaction.href = a.html?auto=1;
    }     
}

#15


引用 13 楼 lijibo503 的回复:
Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面

#16


如果你要使用setInterval就需要使用ajax dom技术来操作页面。setTimeout也可以。循环ajax最好使用callback回调函数避免异步时间上的bug。
如果你还是要刷新页面的话 那么你就只有使用存cookie了。没必要使用session那些加重服务器负载的技术。存cookie让你自己可以知道当前是什么操作然后对应的循环

#17


引用 15 楼 crying_boy 的回复:
Quote: 引用 13 楼 lijibo503 的回复:

Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面

我是要监控调度的运行状态,所以要不断地更新查询,ajax局部刷新当然是最好的选择,开始考虑用ajaxtable做,但是客户要求当一个调度运行失败后,要在该条记录的运行状态后动态的生成一个"重启"的标志,这样一来,ajaxtable做这个重启标志就麻烦了,还有没有什么好的方法。 关于js函数中带条件定时刷新的问题

#18


要循环执行的话你可以把你的js函数在body 的onload时间里面调用。每次页面刷新的时候都会调用

#19


引用 17 楼 lijibo503 的回复:
我是要监控调度的运行状态,所以要不断地更新查询,ajax局部刷新当然是最好的选择,开始考虑用ajaxtable做,但是客户要求当一个调度运行失败后,要在该条记录的运行状态后动态的生成一个"重启"的标志,这样一来,ajaxtable做这个重启标志就麻烦了,还有没有什么好的方法。 关于js函数中带条件定时刷新的问题


呃,不知道你的原始需求到底是什么意思.也不知道这个什么调度失败你如何判断,重启能干嘛?就觉得是个古怪的需求

#20


ajaxtable应该是拼接dom而来的吧、你获取到数据之后判断重新拼接dom就行了啊。真心搞晕了。

#21


引用 15 楼 crying_boy 的回复:
Quote: 引用 13 楼 lijibo503 的回复:

Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面


大神,这个问题您能解答么?
http://bbs.csdn.net/topics/390700456

#1


在线等............................................ 关于js函数中带条件定时刷新的问题

#2



<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>

#3


引用 1 楼 lijibo503 的回复:
在线等............................................ 关于js函数中带条件定时刷新的问题

您这是等5秒调一次请求方法,也只是执行了一次。

#4


引用 2 楼 MengYouXuanLv 的回复:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>


您这是等5秒调一次请求方法,也只是执行了一次。

#5


用setInterval()试试

#6



<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
$(refreshJsp);
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body >
</body>

</html>
你这样写执行一次就跳转了 ,改成ajax吧

#7


引用 4 楼 lijibo503 的回复:
Quote: 引用 2 楼 MengYouXuanLv 的回复:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script>
function load(){
setTimeout("refreshJsp()",5000); 
}
function refreshJsp(){
            var logId = $("#logId").val();  //自身id
        var status = $("#logStatus").val();//状态
        var startDate = $("#logStartdate").val();
        var endDate = $("#logEnddate").val();
        window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
}
</script>
</head>
<body onload="load();">
</body>

</html>


您这是等5秒调一次请求方法,也只是执行了一次。

画面都刷新了 还用什么ajax

#8


    window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
这句话直接就把页面刷新了。ajax干嘛? 5秒刷新一次。查询一次有啥问题呢

#9


setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

#10


就LZ的页面逻辑而言,setTimeout/setInterval是一样的,没区别

因为页面加载后,设定5秒后刷新一次页面,页面都跳转了,计时重新开始,是延迟几秒执行还是每隔几秒重复执行都没有区别了...

#11


引用 8 楼 cears 的回复:
    window.location.href="listLogDataCycle.action?etlId="+
        etlId+"&status="+status+"&startDate="+startDate+"&endDate="+endDate; 
这句话直接就把页面刷新了。ajax干嘛? 5秒刷新一次。查询一次有啥问题呢

我想实现的是循环查询

#12


引用 10 楼 danica7773 的回复:
就LZ的页面逻辑而言,setTimeout/setInterval是一样的,没区别

因为页面加载后,设定5秒后刷新一次页面,页面都跳转了,计时重新开始,是延迟几秒执行还是每隔几秒重复执行都没有区别了...

是的,对我来说这两个效果是一样的,我估计是页面一跳转(虽然是跳到本页面),setTimeout()就触发不了了,除非setTimeout()函数定义为页面一加载就执行,但是这不是我要的效果,我想的是点击查询的时候再触发循环查询,这就产生了矛盾。

#13


引用 9 楼 sad_life 的回复:
setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?

#14


那只能想点别的办法了,比如说用cookie记录或url后面带个什么参数来表示页面进入自动循环

以url为例,一开始的页面是a.html,当你按下自动循环按钮的时候,页面跳转到a.html?auto=1

页面内事先有一个方法
window.onload = function () {
    var auto = url内auto的值 || 0;
    if(auto == 1) {
        setTimeout(refreshJsp, 5000);
    }  
}

页面内按钮的方法就是
function autoRefresh() {
    var auto = url内auto的值 || 0;
    if(auto == 1) {//开启了循环,则关闭
        loaction.href = a.html;
    }else{//没有开启,则打开
        loaction.href = a.html?auto=1;
    }     
}

#15


引用 13 楼 lijibo503 的回复:
Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面

#16


如果你要使用setInterval就需要使用ajax dom技术来操作页面。setTimeout也可以。循环ajax最好使用callback回调函数避免异步时间上的bug。
如果你还是要刷新页面的话 那么你就只有使用存cookie了。没必要使用session那些加重服务器负载的技术。存cookie让你自己可以知道当前是什么操作然后对应的循环

#17


引用 15 楼 crying_boy 的回复:
Quote: 引用 13 楼 lijibo503 的回复:

Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面

我是要监控调度的运行状态,所以要不断地更新查询,ajax局部刷新当然是最好的选择,开始考虑用ajaxtable做,但是客户要求当一个调度运行失败后,要在该条记录的运行状态后动态的生成一个"重启"的标志,这样一来,ajaxtable做这个重启标志就麻烦了,还有没有什么好的方法。 关于js函数中带条件定时刷新的问题

#18


要循环执行的话你可以把你的js函数在body 的onload时间里面调用。每次页面刷新的时候都会调用

#19


引用 17 楼 lijibo503 的回复:
我是要监控调度的运行状态,所以要不断地更新查询,ajax局部刷新当然是最好的选择,开始考虑用ajaxtable做,但是客户要求当一个调度运行失败后,要在该条记录的运行状态后动态的生成一个"重启"的标志,这样一来,ajaxtable做这个重启标志就麻烦了,还有没有什么好的方法。 关于js函数中带条件定时刷新的问题


呃,不知道你的原始需求到底是什么意思.也不知道这个什么调度失败你如何判断,重启能干嘛?就觉得是个古怪的需求

#20


ajaxtable应该是拼接dom而来的吧、你获取到数据之后判断重新拼接dom就行了啊。真心搞晕了。

#21


引用 15 楼 crying_boy 的回复:
Quote: 引用 13 楼 lijibo503 的回复:

Quote: 引用 9 楼 sad_life 的回复:

setTimeout 为延迟几秒执行;setInterval 为每隔几秒重复执行.你说你用错方法没有

setTimeout("函数名",时间);跟setInterval()没啥区别吧?


前者为被动执行,后者为主动执行.所以,显然是有区别的

你的流程应该目前是这样的:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行-->页面刷新;然后就停止了,因为你并没有在页面加载的时候默认执行那个函数

所以,如果你就是想这样做的话,那么更改为:
用户点击查询-->显示结果-->调用函数去更新结果集-->函数执行[参数后附加一个参数,比如:&search=1]-->页面刷新-->在页面加载完成后,检测search的值是否等于1,如果等于1,则调用函数;

这样是不是符合你的意图??

按你的逻辑,我猜测:你是不是想在用户浏览查询结果的时候,如果有符合查询条件新记录增加了,则让新记录也显示在查询结果内??

如果是的话,建议你采用ajax进行局部的更新,没必要刷新整个页面


大神,这个问题您能解答么?
http://bbs.csdn.net/topics/390700456