在 jquery 中将 for 循环与 .each() 结合使用
我尝试在发送查询时在表中显示 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 循环传递到 each 函数的 id 有关,但我不知道如何解决这个问题。由于 JS 在 for 循环中没有块作用域,因此 id 变量应该可以在 $.each() 中访问,对吗? 但是我无法弄清楚为什么 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() 连接有关。
编辑 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);
});
});
您需要对每个对象使用不同的 $.each ,如下所示:
$.each(json, function (key, data) {
console.log(key)
$.each(data, function (index, data) {
console.log('index', data)
})
})
您的输入是什么?目前,您正在将“id”传递给函数“showItems”(它实际上没有输入参数)。
遍历您的代码,您有一个 for 循环调用您的函数 150 次,每次使用不同的索引。但这本质上是每个函数的目的。json.list.item 是如何构造的?如果它是嵌套的,并且您正在循环遍历一个数组数组,那么这可能会起作用(尽管它的编写方式一开始有点不清楚)。
此外,您不需要为 $c 分配任何东西,因为这些命令会立即执行附加操作。
如果您能让我深入了解您的输入,我可能会为您提供更多帮助。
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()
实际上会有一些要循环的内容。