2016-08-30 29 views
5

編集:私は以来、以下にコメントした他のユーザーの助けを借りて問題を見つけました。 問題は、jQuery.load()の使用に時間がかかることです。そして下で指摘したように、問題は変数が見られただけで、その中のデータではありませんでした。私の下の問題への解決策は、jquery's deferred object関数を使ってコードをわずかに調整することでした。私のJS変数がjquery.each()関数の外で見えないのはなぜですか?

$.ajax({ 
    url: 'koc-click-tracker-loader.php', 
    data: {url: 'ar'}, 
    dataType: 'html', 
    context: document.body }) 
.done(function(data) { 
    // Same functionality as below 
    }); 

オリジナルポスト: 私は7列

ランクでHTMLテーブルを解析しようとしています|ユーザー名|最高CPM |最後の24時間|合計クリック数|リンク先|最後にクリックした

次に、各行のデータをJSONオブジェクトに入れようとしています。しかし、.each()ループの外側にあるデータにアクセスしようとすると、私はできません。私の変数はグローバルスコープで定義されています。私が試してみると、デバッグのために警告(出力1 .Rank)。

var output = []; 
$(function(){ 
    var output = []; 
    $("#_BLANK").load("koc-click-tracker-loader.php #ar_content table", { url: 'ar' }, function() { 
     var data = $("#_BLANK table tbody"); i=0; 
     data.find('tr').each(function() { 
      var $td = $(this).find('td'); 

      if (i > 0) { // Skip first iteration, has blank data. 
      output[i] = { 
       Rank: $td.eq(0).text(), 
       User: $td.eq(1).text(), 
       KocID: $td.eq(1).find('a').prop("href"), 
       CPM: $td.eq(2).text(), 
       Last24: $td.eq(3).text(), 
       TotalClick: $td.eq(4).text(), 
       LinksLeft: $td.eq(5).text(), 
       LastClicked: $td.eq(6).text() }; 
       } 
      i++; 
      }); 
     // Will Error here as well. 
     }); 
    alert(output[1].Rank); // Errors here. 
    console.log("output", output); // Shows all the data properly. 
    }); 

未定義のプロパティ 'ランク' を読み取ることができません。

また、何らかの理由で、私の変数がグローバルではありません。または、jQueryで何か不足しているものがあります。

+1

'alert(output [0] .Rank);'あなたの 'output [0]'要素が 'undefined 'なのでエラーを返します。意図的にループのインデックス1をスキップします。 – nnnnnn

+0

この場合、正しいです。私の一部にはタイプミス。 1つ以上の静止エラー。 –

+0

その場合、それは[この質問]の複製と思われる(http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call?noredirect = 1&lq = 1)とかなりの数があります。 'output'が定義されていないとは言わないので、' output [1] 'は定義されていません。 – nnnnnn

答えて

1

$ .each()関数が$ .load()関数の中にあるからです。

ロード機能は非同期呼び出しです。あなたは競争状態にあります。

output[i] = {行にブレークポイントを、さらにalert(output[0].Rank);行にブレークポイントを設定すると、最初に警告が表示されます。

+1

結果のタイミングを事前に決定することができない状況という意味では、実際には「競合状態」ではありません。 '.load()'コールバックは、他のコードが実行された後は確実に*実行されることがわかります。 – nnnnnn

+0

はい、彼はまだ存在しないオブジェクトの属性にアクセスしようとしているため、エラーになります。 –

+0

Whoa ...この問題にはもっと多くのことがありました。 –

関連する問題