2016-08-30 2 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);'출력 [0] 요소가 '정의되지 않음'때문에 오류가 발생합니다. 의도적으로 루프의 인덱스 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

와우 ...이 문제에 관해 더 많은 것이 있었고 깨달았습니다. –

관련 문제