2010-12-16 4 views
4
var field1; 
var field2; 
    function setUserFields() { 
      $.ajax({ 
       type: "POST", 
       url: "url", 
       dataType: "xml", 
       complete: parseXml 
      }); 
    } 
    function parseXml { 
     $(xml.responseXML).find("myValue").each(function() 
     { 
      field1 = $(this).attr('attr1'); 
      field2 = $(this).attr('attr2'); 
      alert(field1 + ' ' field2); //shows correct values 
     }); 
    } 
setUserFields();  

$(function() { 
    alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox 
    alert(field2); //undefined in IE and Chrome | Gives correct value in FireFox 
}) 

コードがかなり複雑であるため、私が実行している正確なコードは掲載していません。投稿したコードに構文エラーがある場合は、問題の原因ではないので無視してください。コードはFirefoxでは正常に動作しますが、IEやChromeでは動作しません。また、Firebug Liteで、コードの実行順序が問題の原因ではないことを確認できます。私がやっていることは、Webサービスを呼び出し、結果を解析し、必要な情報をグローバル変数に格納して、DOMのロードが完了した後でしか呼び出せない後の関数で使用することです。私は、ドキュメントがロードされる前にsetUserFields関数を実行します。この関数は呼び出され、変数を設定しますが、変数はparseXML()のスコープ内でのみ使用できます。私はすべての関数の範囲外の変数を宣言し、parseXML関数内の変数を設定しているので、変数がグローバルに設定されると予想します。しかし、私はそれらが未定義でなくても、私は変数にアクセスできます。私はJavaScriptのアリーナにはかなり新しいので、明らかな落とし穴がないかもしれません。私は運がなくても数時間グーグルで遊んだ。どんな助けでも大歓迎です。jQuery/javascript変数スコープ

答えて

7

これは範囲の問題ではありません。これは、AJAX呼び出しの非同期性が原因である可能性があります。

アヤックスでの最初の文字は 操作が並行して行われ、完了の 順序が保証されないことを意味する「非同期」 の略です。 $ .ajax()に対するasyncオプションのデフォルト値は であり、 コードの実行は、 要求が行われた後も継続できることを示します。このオプションを に設定すると、 の呼び出しが非同期に長くなります。 が強くなります。 ブラウザが応答しなくなる可能性があります。

jQuery.ajax()

+2

+1この問題は**タイミングの問題です。コールバックの外側で、成功したコールバックに移入されたグローバル変数に依存することはできません。 –

+1

はい、完全なコールバックの中にfield1とfield2を使って何をしていてもかまいません。 – Mark

+0

変数に初期値を設定してチェックすると役立ちます。 'alert()'が初期値を示していれば、変数スコープはokで、Webサービスへの非同期呼び出しがまだ完了していないことを意味します。 – 9000

0

これは主に、あなたのAjaxコードを使用すると、問題を解決するために

alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox 
alert(field2);/

これらの変数を呼び出す時に実行取得されていない問題

タイミングさにAJAX呼び出しを行いますdocument.readyとそれ以降は、filed1とfield2に警告することができます。

これはアヤックスの非同期的な性質によるタイミングの問題であると確信しています