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変数スコープ
+1この問題は**タイミングの問題です。コールバックの外側で、成功したコールバックに移入されたグローバル変数に依存することはできません。 –
はい、完全なコールバックの中にfield1とfield2を使って何をしていてもかまいません。 – Mark
変数に初期値を設定してチェックすると役立ちます。 'alert()'が初期値を示していれば、変数スコープはokで、Webサービスへの非同期呼び出しがまだ完了していないことを意味します。 – 9000