2

我编写了这个 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 为真时;clearTimeout 不是清除/删除重载功能。

我怎样才能做到这一点。

4

4 回答 4

3

因为,查看您的代码,您的页面似乎在 clearTimeout 被调用之前被刷新。

于 2012-09-10T09:41:25.103 回答
3

我不知道你期望在这里发生什么。

您在timeout 函数clearTimeout中调用该方法- 也就是说,只有在 timeout 已经过去并且运行闭包时才会调用该代码。

clearTimeout 的目的是停止运行超时,这样注册的闭包就不会被调用。当(且仅当)超时刚刚触发时调用它不会有任何效果。

我只能建议您重新考虑在什么条件下要取消挂起的重新加载 - 并重新安排您的代码,以便clearTimeout在触发这些情况时调用,而不是重新加载已经发生之后。


编辑:啊,您似乎不一定要取消超时本身,而是要根据变量的结果禁用重新加载。我看到有几种方法可以做到这一点:

  1. 每当您设置时,请改为disableReload = true调用。clearTimeout(tId)只要tId具有相同的范围/可见性,disableReload这应该可以作为直接替代品。
  2. 更改超时功能的逻辑,以便重新加载本身以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为真,那么当超时关闭触发时不会发生任何事情。

于 2012-09-10T09:42:10.477 回答
2

看起来您的disableReload变量是静态的(再也不会写入)。如果这是真的,你为什么要设置超时?只需将整个包裹var tId = window.setTimeout...在一个if (!disableReload).

于 2012-09-10T09:45:40.850 回答
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);
于 2012-09-10T09:40:48.557 回答