Javascript中的SetTimeout和clearTimeout
我编写了这个js函数,用于每15秒调用一次ajax。 但应根据其他条件加以限制Javascript中的SetTimeout和clearTimeout,javascript,settimeout,Javascript,Settimeout,我编写了这个js函数,用于每15秒调用一次ajax。 但应根据其他条件加以限制 <script type="text/javascript"> var disableReload = '<s:property value="#session[\'EXECUTOR\'] == null" />'; var tId = window.setTimeout(function () { location.reload(true); //alert(dis
<script type="text/javascript">
var disableReload = '<s:property value="#session[\'EXECUTOR\'] == null" />';
var tId = window.setTimeout(function () {
location.reload(true);
//alert(disableReload);
if(disableReload){
//alert("Clearing");
clearTimeout(tId);
}else{
var url = 'my.action';
var form = document.getElementById('myForm');
var params = Form.serialize(form) + '&ms=' + new Date().getTime();
var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
}
}, 15 * 1000);
</script>
var disableReload='';
var tId=window.setTimeout(函数(){
位置。重新加载(true);
//警报(禁用重新加载);
如果(禁用重新加载){
//警报(“清算”);
清除超时(tId);
}否则{
var url='my.action';
var form=document.getElementById('myForm');
var params=Form.serialize(Form)+'&ms='+new Date().getTime();
var myAjax=new Ajax.Request(url,{method:'post',参数:params,onComplete:showResponseAction});
}
}, 15 * 1000);
但当disableReload为真时;clearTimeout不是清除/删除重新加载功能
我怎样才能做到这一点。如果我理解你的意图,那么像这样的东西就是你所需要的:
var disableReload = false; // toggle this to false, on AJAX response(?) to stop repeats
var repeat = function()
{
if(disableReload)
{
clearInterval(intervalID);
}
else
{
var url = 'my.action';
var form = document.getElementById('myForm');
var params = Form.serialize(form) + '&ms=' + new Date().getTime();
var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
}
}
var intervalID = window.setInterval(repeat, 1000);
因为,查看您的代码,您的页面似乎在调用clearTimeout之前得到刷新。我不知道您在这里期望发生什么 您在timeout函数中调用
cleartimout
方法,也就是说,只有在超时已经过去并且关闭运行时才会调用该代码
clearTimeout的要点是停止运行超时,以便不调用已注册的闭包。如果(且仅当)超时刚刚触发,则调用它不会有任何效果
我只能建议您重新考虑在什么情况下取消挂起的重新加载,并重新安排代码,以便在触发这些情况时调用clearTimeout
,而不是在重新加载已经发生之后
编辑:啊,似乎您不一定要取消超时本身,而是希望根据变量的结果禁用重新加载。我认为有几种方法可以做到这一点:
disableReload=true
,请调用clearTimeout(tId)
。只要tId
与disableReload
具有相同的范围/可视性,这应该可以作为一种替换品disableReload
设置回false时会发生什么的问题
但后者对现有代码的实质性更改较少,而且可能更容易掌握:
window.setTimeout(function () {
if (!disableReload) {
location.reload(true);
// I think these are dependent on the disableReload variable too?
// If not you can move them outside the if block
var url = 'my.action';
var form = document.getElementById('myForm');
var params = Form.serialize(form) + '&ms=' + new Date().getTime();
var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
}
}, 15 * 1000);
这样,如果
disableReload
为true,则在触发超时闭包时不会发生任何事情。看起来您的disableReload
变量是静态的(不再写入)。如果这是真的,那么为什么要首先设置超时?调用ajax后,只需将整个var tId=window.setTimeout…
包装在if(!disableReload)
中,根据响应我正在更改它的值。太长的条件和代码不会影响这一点。所以我没有发布part@NitinGurram那是在你已经在被延迟的函数中之后。您没有使用setInterval
,因此它不会重复。在该阶段,您只需从函数
返回。您还将在函数开始处重新加载页面,该函数将重置所有内容。哎呀。。我是js的新手,通过谷歌学习。你能根据我的要求为这个案例编写js代码吗。我将学习:)我认为您需要删除位置。重新加载(true)
,将窗口更改为窗口。setTimeout
(这一个重复),然后您应该能够像现在一样使用函数,但使用clearInterval
而不是clearTimeout
。是的。我的要求是每1分钟调用一个ajax函数(比方说)。但是我应该能够基于disableReload变量禁用这个。所有这些事情都应该在没有任何按钮点击或其他基于用户的操作的情况下发生我看到了-我已经根据您的评论更新了我的答案,因为听起来你根本不需要取消超时。@NitinGurram我仍然不明白你为什么要做一个定位。在AJAX请求的同时重新加载。你错过了一些代码吗。我能看出情况是否有点不对劲。在其他部分。位置。重新加载(true)将重新加载页面right@NitinGurram是的,我从你的代码中复制了这个。正如我所说,我试图通过阅读代码来理解您的目标,因为问题不是很清楚。我的要求是每1分钟调用一个ajax函数(比方说)。但是我应该能够基于disableReload变量禁用这个。所有这些事情都应该在没有任何按钮点击或其他基于用户的操作的情况下发生operations@NitinGurram理解。我已经更新了我的答案。您只需以某种方式切换“disableReload”变量以停止重复。希望有帮助!