2011-02-04 9 views
0

次のjavascriptコードに問題があります。 基本的には、Unixサーバー上のプロセスに対してバックグラウンドチェック(check.php)を実行します。 PHPとレスポンスの実行時間は約1.2-1.5秒(Mozillaでテストしました)ですので、以下のスクリプトを作成して、そのプロセスで何が起きているのかを確認し、それに応じてDIVの背景を変更してください。 ちょうどいくつかのリフレッシュの後、それはちょうどハングします、なぜなら私はそれがループに入り、最初の機能が終了するのを待たずにそれが積み重なるからです。 アイデアは何ですか?より簡単な方法はありますか?JavaScriptの更新機能の問題

<script language="javascript" type="text/javascript"> 

    function getVal(param) 
    { 
     var strURL = param; 
     var req = new XMLHttpRequest(); 
     req.open("GET", strURL, false); //third parameter is set to false here 
     req.send(null); 
     return req.responseText; 
    } 

    function changeDivImage() 
    { 
     var pid = getVal("check.php") 
     var imgPath = new String(); 
     imgPath = document.getElementById("status_body").style.backgroundImage; 

      if(pid == 2) 
      { 
       document.getElementById("status_body").style.backgroundImage = "url(active.png)"; 
      } 
      else 
      { 
       document.getElementById("status_body").style.backgroundImage = "url(down.png)"; 
      } 
     changetimer(); 
    } 

    function changetimer() 
    { 
     setInterval("changeDivImage()", 5000); 
    } 
    </script> 
+1

:これを試してみてください。これはほとんどあなたが望むものではなく、特定の条件の下でユーザーのブラウザをほぼ確実にハングアップさせます。 –

+1

さらに、setIntervalは使用しないでください。 setTimeoutを使用し、次回要求が戻ったときに別のsetTimeoutを実行します。そうすれば、たくさんのリクエストを積み重ねることはできません(そして、LIFOタイプの問題を得る)。 – Sean

答えて

2

setIntervalは繰り返し機能を呼び出すので、changeDivImageが返された後にchangetimer関数を再度呼び出すと、より多くの不要な関数がスタックされます。同期XHRを使用しないでください

<script language="javascript" type="text/javascript"> 

    function getVal(param) 
    { 
     var strURL = param; 
     var req = new XMLHttpRequest(); 
     req.open("GET", strURL, false); //third parameter is set to false here 
     req.send(null); 
     return req.responseText; 
    } 
    //this function calls it self automatically and again everytime 
    //but only when it finishes its operations. 

(function changeDivImage() 
{ 
    var pid = getVal("check.php") 
    var imgPath = new String(); 
    imgPath = document.getElementById("status_body").style.backgroundImage; 

     if(pid == 2) 
     { 
      document.getElementById("status_body").style.backgroundImage = "url(active.png)"; 
     } 
     else 
     { 
      document.getElementById("status_body").style.backgroundImage = "url(down.png)"; 
     } 
     setTimeout(changeDivImage, 5000); 
})(); 

+1

[あなたは本当にarguments.calleeを使用すべきではありません。](http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript) setTimeout(changeDivImage、5000); '代わりに? –

+0

可読性とパフォーマンスのためにOK –

+0

あなたの返信をありがとう、私はあなたのコードを昨日試してみましたが、うまくいきませんでした。 Firebugによると、changeDivImage()は未定義であるため、最後に括弧を削除して機能させる必要がありました。今はjavascriptコードでエラーが出ることはありませんが、check.phpの実行時間を短縮する必要があります。私はそれが正しいとすぐにsomethignを投稿します。 – Chris19

1

MDCによれば、setInterval機能

は機能 への各呼び出しの間 一定時間遅延して、繰り返し関数を呼び出します。あなたがchangeDivImage関数の最後にchangetimer機能を呼び出しているので

は、それは古いタイマーchangetimerが呼び出されるたびに削除せずに新しいタイマーを作成します。 changeDivImage関数の最後にあるchangetimer関数への呼び出しを削除することをお勧めします。