2009-09-27 5 views
6

私はjQueryを使用してXMLファイルを解析していますが、XMLファイルの各要素をjQuery .eachループを使用して配列にプッシュしようとしています。不思議なことに、ループ内の配列の値を警告すれば、必要に応じて出力されますが、ループが終了した後に配列の値を警告しようとすると、結果は "未定義"になります。jQueryの各ループ内の配列へのプッシュ

この種のループ内で値を配列にプッシュすると、何か変なことがありますか?ここで


Javascriptのである:ここでは

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
    $('image', xml).each(function (i) { 
     splashArray.push($(this).attr("src")); 
    }); 
}); 

alert(splashArray[1]); // Results in undefined 



はXMLです:

<?xml version="1.0" encoding="UTF-8"?> 
<site>  
    <image src="splash1.jpg" /> 
    <image src="splash2.jpg" /> 
    <image src="splash3.jpg" /> 
    <image src="splash4.jpg" /> 
    <image src="splash5.jpg" /> 
    <image src="splash6.png" /> 
</site> 

答えて

10

正しいバリアント:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     alert(splashArray[1]); 
}); 

あなたの亜種のコードで警告(splashArray [1]); ajax get xml resultの前に実行されるため、インデックス1の要素に警告しようとするとsplashArrayが空になります。コードは、スレッドがサーバーの応答を待つ同期モードの場合のみ有効です。非同期モードでは、コールバック関数を使用する必要があります。コールバックと

バリアント:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     work_with_splash(); 
}); 

function work_with_splash() { 
    alert(splashArray[1]); 
} 

または1つ以上のパターン(擬似コード):

function process(ajax_is_done) { 
    if (!ajax_is_done) { 
     ajax(function (result) { 
      import_result(result); 
      process(true); 
     }) 
    } 
} 
process(); 
+0

ここでも未定義となります。 – jakeisonline

+0

私には警告がありますsplash2.jpg – Anatoliy

+0

はい、あなたのコードは$ .getブロック内の配列を正しく取得しますが、なぜ$ .getブロック。多分私ははっきりしていなかったでしょう。私の問題はalert()が機能しなくなったため、後のコードで配列の値を取得できるようにしています。 – cmal

2

配列が移入される前に、あなたが警告しています。 XHR/Ajaxが非同期(同期とは対照的)であることを理解する必要があります。そのため、コールバック関数の後には、常にが実行されません。実際のHTTPリクエストを実行してxmlを取得し、コールバックは、XHRの処理が完了した後にそれが設定されることを保証します。

作品:

var splashArray = []; 

function fn() { 
    alert(splashArray[1]); 
} 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     fn(); 
}); 

は動作しません:

var splashArray = []; 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     // this will populate the array almost always AFTER the alert below. 
}); 


alert(splashArray[1]); // this will almost ALWAYS alert BEFORE the callback function is done 
+0

実際に両方のメソッドが正常に動作しているように見えるので、dataTypeビットは実際には問題になりません。それが正しいxmlファイルパスだと確信していますか?おそらく、 '/xml/splash.xml'のようなルート関連が必要でしょうか? Firebugのネットタブを試して、正しいURIを要求しているかどうか確認してください。 –

+0

これはほとんど動作しますが、あなたはまだスプラッシュアレイをの外に呼び出すことはできません。ajax関数では、結果は未定義です。 – jakeisonline

+0

私はあなたが「解決策に取り組んでいる」と思いましたか?そして私はコールバックの外でそれを警告しなかった、私はコールバックの内部にそれを警告した、したがってそれは動作し、私はそれをテストしました。 –

0

あなたは標準のコールバックを使用しない場合は、他のオプションは、jQueryのイベントをトリガすることです。

関連する問題