我已经编写了这个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没有清除/删除重载功能。
我怎样才能做到这一点。
答案 0 :(得分:3)
因为查看代码,看起来在调用clearTimeout之前页面会刷新。
答案 1 :(得分:3)
我不确切地知道你期待在这里发生什么。
您正在超时函数中调用clearTimeout
方法 - 也就是说,只有在超时已经过去并且运行闭包时才会调用该代码。
clearTimeout的目的是停止运行超时,以便不调用已注册的闭包。如果(并且仅当)超时刚刚触发时调用它将无法实现任何目标。
我只能建议你再考虑一下你想在什么条件下取消挂起的重新加载 - 并重新安排代码,以便在触发这些情况时调用clearTimeout
,而不是之后 >重装已经发生。
编辑:啊,似乎你不一定要取消 timeout 本身,而是想要根据变量的结果禁用重载。我有几种方法可以做到这一点:
disableReload = true
时,请致电clearTimeout(tId)
。只要tId
具有与disableReload
相同的范围/可见性,这应该可以作为替代品。disableReload
。前者可能是最干净的选择 - 保持超时运行没有什么意义,你知道什么也不会做,而且它也避免了如果在{}之前将disableReload
设置为假的情况会发生什么的问题。超时过去了。
但后者对现有代码的改动较小,而且可能更容易掌握:
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
为真,那么当超时闭包触发时没有任何反应。
答案 2 :(得分:2)
看起来你的disableReload
变量是静态的(永远不会再写入)。如果这是真的,为什么要首先设置超时?只需将整个var tId = window.setTimeout...
打包在if (!disableReload)
。
答案 3 :(得分:1)
如果我明白你的意图,那么你需要的是这样的东西:
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);