我在尝试在发送查询时在表中显示json数据。请求工作正常,一切都很好地显示。但: 当我尝试显示内容时,jquery抛出一个TypeError:a是未定义的。
第一次加载页面时内容会正确显示,但是当通过表单发送另一个请求时,内容会拒绝更新。我只想将表行附加到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);
});
}
我很确定它与从for循环传递给每个函数的id有关,但我不知道如何解决这个问题。由于JS在for循环中没有块范围,因此id变量应该可以在$ .each()中访问吗? 但是我无法理解为什么jquery会把我扔掉,因为#a; a is undefined&#34;错误和脚本不会反应,直到页面重新加载。我认为它可能是一个未定义的变量返回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()连接有关。
编辑2:解决方案
在下面的表格中应用@ 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 :(得分:2)
您需要以这种方式为每个对象使用不同的$.each:
$.each(json, function (key, data) {
console.log(key)
$.each(data, function (index, data) {
console.log('index', data)
})
})
答案 1 :(得分:0)
您有什么要求?目前,您正在通过&#39; id&#39;进入你的功能&#39; showItems&#39; (它实际上没有输入参数)。
遍历你的代码,你有一个for循环调用你的函数150次,每次都有不同的索引。但这本身就是每个人的目的。如何构建json.list.item?如果它是嵌套的,并且你在数组数组中循环,这可能会起作用(尽管它的编写方式起初有点不清楚。)
此外,您不需要为$ c分配任何内容,因为这些命令会立即执行追加操作。
如果您对我的意见有所了解,我可能会帮助您更多。
答案 2 :(得分: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()
实际上会有一些内容可循环播放。
答案 3 :(得分: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社区真的很棒。