[英]SetTimeout and clearTimeout in Javascript
我已经编写了这个js函数,用于每隔15秒调用ajax。 但它应该根据其他条件限制
<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>
但是当disableReload为true时; clearTimeout不清除/删除重载功能。
我怎样才能做到这一点。
因为,查看您的代码,看起来您的页面在调用clearTimeout之前会刷新。
我不知道你期待在这里发生什么。
您正在超时函数中调用clearTimeout
方法 - 也就是说,只有在超时已经过去并且运行闭包时才会调用该代码。
clearTimeout的目的是停止运行超时,以便不调用已注册的闭包。 如果(并且仅当)超时刚刚触发时调用它将无法实现任何目标。
我只能建议您再次考虑在什么条件下要取消挂起的重新加载 - 并重新排列代码,以便在触发这些情况时调用clearTimeout
,而不是在重新加载已经发生之后。
编辑:啊,似乎你不一定要取消超时本身,而是想要根据变量的结果禁用重载。 我有几种方法可以做到这一点:
disableReload = true
, clearTimeout(tId)
调用clearTimeout(tId)
。 只要tId
具有与disableReload
相同的范围/可见性,这应该可以作为替代品。 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
变量是静态的(永远不会再写入)。 如果这是真的,为什么要首先设置超时? 只需将整个var tId = window.setTimeout...
包装在if (!disableReload)
。
如果我理解你的意图,那么你需要的是这样的东西:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.