2

15 秒ごとに ajax を呼び出すための js 関数を作成しました。ただし、他の条件に基づいて制限する必要があります

 <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 はリロード機能をクリア/削除していません。

どうすればそれを達成できますか。

4

4 に答える 4

3

コードを見ると、clearTimeout が呼び出される前にページが更新されているように見えるためです。

于 2012-09-10T09:41:25.103 に答える
3

あなたがここで何を期待しているのか正確にはわかりません。

タイムアウト関数内でclearTimeoutメソッドを呼び出しています。つまり、そのコードは、タイムアウトが既に経過し、クロージャーが実行されたときにのみ呼び出されます。

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が true の場合、タイムアウト クロージャが発生しても何も起こりません。

于 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 に答える