2011-03-02 14 views
2

私はJavaScriptのグローバル変数(TimeStampと呼ばれる)に定義されていないonload ...という問題があります。少なくとも、それは問題だと思います。JavaScriptの変数スコープ

タイムスタンプを定義することから始めます。

 $(document).ready(function(){ 
     // AddTest(); 
     var TimeStamp = null; 
     waitForMsg(); 
    }); 

... waitForMsgは、TimeStampを使用して実行され、ajax呼び出しの正常終了時に更新されます。少なくともそれは考えですが、私はそれを前もって定義しましたが、 "TimeStampは定義されていない"ため、現時点では何も実行されません! (笑)。

waitForMsg内でタイムスタンプを再定義すると、成功したajax関数から更新された値を使用する代わりにリセットされます。

function waitForMsg(){ 


    $.ajax({ 
     type: "POST", 
     url: "backend.php", 
     async: true, 
     cache: false, 
     timeout:50000, /* Timeout in ms */ 
     data: "TimeStamp=" + TimeStamp, 
     success: function(data){ 

      var json = eval('(' + data + ')'); 

      $('#TextHistory :last-child').after('<p>' + json['msg'] + '</p>'); 


      TimeStamp = json['timestamp']; 


      setTimeout(
       'waitForMsg()', /* Request next message */ 
       1000   /* ..after 1 seconds */ 
      ); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 

      $('#TextHistory :last-child').after('<p>' + errorThrown + '</p>'); 

      setTimeout(
       'waitForMsg()', /* Try again after.. */ 
       "15000");  /* milliseconds (15seconds) */ 
     }, 
    }); 
}; 

いつもどんな助けでも大歓迎です。

Dan。

答えて

2

変更

$(document).ready(function(){ 
    // AddTest(); 
    var TimeStamp = null; 
    waitForMsg(); 
}); 

var TimeStamp = null; 
$(document).ready(function(){ 
    // AddTest(); 
    waitForMsg(); 
}); 

そのようにそれがグローバルスコープに住んでいないだけでレディ機能の範囲内になるまで。

また、の文をsetTimeout(string to eval,delay)からsetTimeout(function reference to run, delay)の形式に変更する必要があります。そうですね:

setTimeout(waitForMsg,1000); 

したがって、不要なevalコールは避けてください。

あなたは、現代のブラウザで解析するネイティブJSONの利益を得るように、さらに多くの、

var json = JSON && JSON.parse ? JSON.parse(data) : eval('(' + data + ')'); 

var json = eval('(' + data + ')'); 

を変更することを検討してください。

さらに良いことに、jQueryのAJAX呼び出しにパラメータとしてdataType: 'json'を追加することによって、あなたのためのJSONをデシリアライズしましょう:)

+0

Niiii​​。グローバルは悪です。 – Quentin

+0

必ずしもそうとは限らず、すぐに問題を解決します。 jQueryと$はあなたがjQueryを使うときにはグローバル変数ですが、その悪いのは分かりますか? –

+0

ありがとうございます!!!!!愚かな私はそれを置くことがそれをグローバルとして宣言したと思った。 –

0

はevaledする文字列を渡さないでください。これは、ハードデバッグと休憩の範囲には、非効率的である:

setTimeout('waitForMsg()',1000); 

は、関数を渡してください:

setTimeout(waitForMsg,1000); 
0

あなたはページスコープ内の任意の関数の外でのvarのタイムスタンプを定義する必要があります。

コードブロック内で変数を定義すると、変数は同じ 'レベル'でのみ表示され、そのコードブロックから呼び出すメソッド内では表示されません。

ajax呼び出し内のTimeStamp変数に値を書き込むと( 'var'で定義することなく)、TimeStamp変数をページスコープ内で自動的に定義または再利用しますが、TimeStamp( data: "TimeStamp =" + TimeStamp)変数に書き込む前に、それは '定義されていません'というエラーを生成します。

とにかく:ページスコープ変数の使用を避ける可能性を考慮してください。

関連する問題