0

私は ajax 呼び出しを行い、正常に動作している setInterval 関数を呼び出しています。残念ながら、それを止めようとしてもうまくいきません。

    function test(str)
        {
        if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
          }
        else
          {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
        xmlhttp.onreadystatechange=function()
          {
          if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                if (str=="?stage=3"){
                    test('?stage=4');
                } 
                if (str=="?stage=4"){
                     document.getElementById("main").innerHTML+=xmlhttp.responseText;
 prog=window.clearInterval(prog);

                }else{
                    document.getElementById("main").innerHTML+=xmlhttp.responseText;        
                }

            }
          else
          {
            if (str=="?stage=3"){
                var prog = self.setInterval( "ajaxrequest('progress_track.php', 'main')", 1000 );
            } 
        }
          }
        xmlhttp.open("GET","test.php"+str,true);
        xmlhttp.send();
        }

どんな助けでも本当に感謝しています。

編集:

setinveral 関数の 3 倍を呼び出していることがわかったので、コードを作り直しました。このコードでは、2回しか呼び出されません。理由がわかりません。

var prog = 0;
function test(str)
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200 && str=="?stage=3")
    {
        test('?stage=4');   
    }else{
        if( str=="?stage=3"){
        prog = self.setInterval( "ajaxrequest('progress_track.php', 'main')", 1000 );   
        }
    }
    if (xmlhttp.readyState==4 && xmlhttp.status==200 && str=="?stage=4")
    {
        prog=window.clearInterval(prog);    
    }
    if (xmlhttp.readyState==4 && xmlhttp.status==200 && str!="?stage=4" && str!="?stage=3")
    {
        document.getElementById("main").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","test.php"+str,true);
xmlhttp.send();
}

しかし、cleariterval はまだ機能していません。

編集:

問題が見つかりました。このコードでは、この状態で到着することはありません。

if (xmlhttp.readyState==4 && xmlhttp.status==200 && str=="?stage=4")
    {
        prog=window.clearInterval(prog);    
    }

唯一の質問は、なぜそうしないのかということです。

4

2 に答える 2

2

より高いスコープで「prog」を宣言する必要があります。関数宣言の外に移動できます。

var prog;
function test(str) {
  ...
  if (str=="?stage=3"){
    prog = self.setInterval( 
      "ajaxrequest('progress_track.php', 'main')", 1000 
    );
  }
  ...
}

あなたが今それを持っている方法はprog、あなたが呼び出すときに定義されていませんclearInterval()

于 2012-06-27T13:41:36.400 に答える
0

それが機能しない理由は、関数内にタイマーIDを保持するように変数を宣言しているにもかかわらず、定義される前にそれを使用しようとしているためです。あなたがそれをクリアしようとしているとき、変数は定義されていません。あなたができることは、変数を外部で定義してからそれを使用することです。このようなもの:

var prog = 0;

function test(str)
    {
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            if (str=="?stage=3"){
                test('?stage=4');
            } 
            if (str=="?stage=4"){
                 document.getElementById("main").innerHTML+=xmlhttp.responseText;
                 prog=window.clearInterval(prog);

            }else{
                document.getElementById("main").innerHTML+=xmlhttp.responseText;        
            }

        }
      else
      {
        if (str=="?stage=3"){
            prog = self.setInterval( "ajaxrequest('progress_track.php', 'main')", 1000 );
        } 
    }
      }
    xmlhttp.open("GET","test.php"+str,true);
    xmlhttp.send();
}

クリアする前に、0かどうかを確認することもできます。0の場合は、まだ設定されておらず、クリアする必要がないことを意味します。

于 2012-06-27T13:41:51.440 に答える