为何jQuery Ajax填充<select>框时始终返回undefined?
问题分析与解决方向
首先,你遇到的undefined问题核心大概率是对返回数据的结构理解有误,遍历方式不对。咱们一步步来排查:
1. 先明确后端返回的rows结构
先重点看你控制台里console.log(rows)的输出:
- 如果输出是对象数组(比如
[{"subcat":"分类1"}, {"subcat":"分类2"}]):那你用Object.keys(rows)遍历的是数组的索引(0、1、2...),索引是数字类型,自然没有subcat属性,所以会返回undefined。 - 如果输出是键值对对象(比如
{"1":"分类1", "2":"分类2"}):那Object.keys(rows)拿到的是键名("1"、"2"),你需要用rows[rowss]来获取对应的值,而不是rowss.subcat。
2. 针对不同结构的修正代码
情况一:返回的是对象数组(最常见的场景)
直接遍历数组本身,不需要Object.keys,另外建议加上dataType: 'json'让jQuery自动解析JSON,省去手动解析的步骤:
$(document).ready(function() { $("#ddlcomp").change(function() { var cid = $("#ddlcomp").val(); $.ajax({ url: 'doload.php', method: 'post', data: 'catid=' + cid, dataType: 'json' // 自动解析JSON,无需手动JSON.parse }).done(function(rows) { console.log(rows); $('#ddlsubcat').empty(); // 直接遍历数组元素 rows.forEach(function(row) { // 注意确认row里的属性名是否和后端返回的完全一致(比如有没有拼写错误) $('#ddlsubcat').append('<option>' + row.subcat + '</option>'); }) }) }) })
情况二:返回的是键值对对象
如果后端返回的是类似{"id1":"分类1", "id2":"分类2"}的结构,那应该这样遍历:
Object.keys(rows).forEach(function(key) { // rows[key]才是对应的分类名称,key可以作为option的value值 $('#ddlsubcat').append('<option value="' + key + '">' + rows[key] + '</option>'); })
3. 额外排查点
- 检查后端
doload.php返回的JSON格式是否正确,有没有语法错误(比如逗号遗漏、引号不匹配)。 - 确认后端返回的属性名是否和你前端用的
subcat完全一致(比如后端可能是sub_cat或者Subcat,大小写、下划线要严格对应)。 - 可以在遍历里加
console.log(row)(数组情况)或者console.log(rows[rowss])(键值对情况),直观确认是否能拿到正确的属性值。
内容的提问来源于stack exchange,提问作者Aniebiet
相关产品推荐
相关产品推荐

