2015-04-12 72 views
-1

我試圖在發送查詢時在表中顯示json數據。該請求工作正常,一切都很好地顯示。但是: jquery拋出一個TypeError:當我嘗試顯示內容時未定義a。在jQuery中將循環與.each()結合使用

第一次加載頁面時內容正確顯示,但當通過表單發送另一個請求時拒絕更新。我只是想在HTML中的錶行追加到一個表:

<table id="table"></table> 

的JS是這樣的:

  for (var id = 0; id < 150; id++) { 
       showItems(id); 
      } 

      function showItems(){ 
       $.each(json.list.item[id], function(i, val) { 
        var $r = $('<tr>'); 
        var $c = $('<td>').text(i).appendTo($r); 
        $c = $('<td>').text(val).appendTo($r); 
        $("#table").append($r); 
       }); 
      } 

我敢肯定它有事情做與傳遞的ID for循環到每個函數,但我不知道如何解決這個問題。由於JS在for循環中沒有塊範圍,所以在$ .each()中可以訪問id變量? 但我不能解決爲什麼jQuery會拋出「a未定義」的錯誤,並且腳本不會反應,直到頁面重新加載。我認爲它可能是一個未定義的變量返回NULL,但我不知道哪個。

在這裏和網上閱讀噸的答案找不到解決方案(也關於JS變量範圍和閉包)。

http://jshint.com/不顯示任何未定義的變量,除了jquery $ S。

幫助是極大的讚賞:)

編輯: 的_id修復沒有幫助。這是整個js代碼。

$(document).ready(function(){ 


$("#term").focus(function() { 

    var full = $("#table > tbody > tr").length? true : false; 
    if(full == false) { 
     $("#message").empty(); 
     $("#table").empty(); 
    } 
}); 

var getFood = function(){ 

    var food = $('#term').val(); 

    if(food ==''){ 

     $('#message').html("Ha! We haven't seen you type, so no request! Type something!<hr>"); 
    } else { 

     $('#message').html("Your information is on its way!<hr>"); 

     $.getJSON("APICALL", function(json){ 
      console.log(json); 

      for (var id = 0; id < 150; id++) { 
       showItems(id); 
      } 

      function showItems(){ 

       $.each(json.list.item[id], function(i, val) { 
        var $r = $('<tr>'); 
        var $c = $('<td>').text(i).appendTo($r); 
        $c = $('<td>').text(val).appendTo($r); 
        $("#table").append($r); 
       }); 
      } 

     }); 
    } 
}; 

$('#search').click(getFood); 
}); 

當我離開了for循環,而是隻需使用:

   $.each(json.list.item[0], function(i, val) { 
        var $r = $('<tr>'); 
        var $c = $('<td>').text(i).appendTo($r); 
        $c = $('<td>').text(val).appendTo($r); 
        $("#table").append($r); 
       }); 

僅顯示的第一個對象,它工作正常,並不會引發錯誤。這讓我認爲它與for/.each()連接有關。

EDIT2:解決方案

應用於下面的表格由@ MM-TAC提出的代碼和完美的作品:

 $.each(json.list.item, function (key, data) { 
      console.log(key) 
      $.each(data, function(index, data) { 
       var $r = $('<tr>'); 
       var $c = $('<td>').text(index).appendTo($r); 
       $c = $('<td>').text(data).appendTo($r); 
       $("#table").append($r); 
      }); 
     }); 
+0

可能需要添加更多代碼。什麼是錯誤?在該代碼塊中甚至沒有使用'a',所以我不認爲這是錯誤所在。 – Drazisil

+1

嘗試使用'function showItems(_id)'和'json.list.item [_id]' – slash197

+0

我們需要猜測JSON結構,可能您沒有以正確的方式訪問數據。它的格式爲「{」list「:{」item「:[」Text0「,」Text1「,...]},...}'? – rplantiko

回答

2

您需要使用不同的$.each每個對象是這樣的:

$.each(json, function (key, data) { 
    console.log(key) 
    $.each(data, function (index, data) { 
     console.log('index', data) 
    }) 
}) 
+0

謝謝@ MM-tac!這個伎倆。 – Juri

0

你有什麼投入?目前,您正在將'id'傳遞給函數'showItems'(它實際上沒有輸入參數)。

通過你的代碼,你有一個for循環調用你的函數150次,每次都有一個不同的索引。但這本身就是每個人的目的。 json.list.item是如何構建的?如果它是嵌套的,並且你正在循環一個數組數組,這可能會起作用(儘管它的寫法起初有點不清楚)。

此外,您不需要將任何內容分配給$ c,因爲這些命令正在立即執行附加操作。

如果您對我的輸入有所瞭解,我可能會幫助您更多。

+0

我輸入一個JSON:?'{ 「清單」:{ 「項目」:[{ 「偏移」:0, 「group」:「X」,「 」name「:」 。 – Juri

0
 for (var id = 0; id < 150; id++) { 
      showItems(id); 
     } 

     function showItems(id){ 
      $.each(json.list.item[id], function(i, val) { 
       var $r = $('<tr>'); 
       var $c = $('<td>').text(i).appendTo($r); 
       $c = $('<td>').text(val).appendTo($r); 
       $("#table").append($r); 
      }); 
     } 

如果添加function showItems(id)而不是function showItems()each()實際上有話要對循環。

+0

在'showItems(id){....}'中插入了id,但遺憾的是沒有更改任何代碼錯誤。它的工作方式與以前一樣沒有ID。 – Juri

+0

我認爲我們正在越來越翻譯。你現在已經發布的代碼將不起作用,因爲在'showItems()'內它不知道'id'是什麼。你需要用'function showItems(id){'替換'function showItems(){'這是完整的更正後的代碼,希望能夠解釋我比較好說的話嗎? http://jsfiddle.net/9261rdgL/ – Drazisil

+0

謝謝澄清!沒有ID可能是錯的。但目前它確實有效! (無論什麼原因,我現在不)。插入了id,但這不會改變我從腳本獲得的結果。 – Juri

0

修正了這個代碼的問題:

  $.each(json.list.item, function (key, data) { 
       console.log(key) 
       $.each(data, function(index, data) { 
        var $r = $('<tr>'); 
        var $c = $('<td>').text(index).appendTo($r); 
        $c = $('<td>').text(data).appendTo($r); 
        $("#table").append($r); 
       }); 
      }); 

感謝大家幫助我。不勝感激。 Stackoverflow社區真的很棒。