AJAX请求成功后调用函数出现Cannot read property 'length' of undefined错误求助
咱先把问题拆解透:这个报错本质是你在尝试读取一个未定义(undefined)值的length属性,结合你贴的代码来看,大概率是$.each(model.NcdexClass, function() {...})这行出的问题——因为jQuery的$.each内部会自动去遍历目标的length属性,如果model.NcdexClass是undefined,直接就会触发这个错误。
下面一步步排查解决:
1. 先确认AJAX返回的数据结构是否符合预期
你把接口返回的response赋值给了model,第一步先搞清楚这个model里到底有没有NcdexClass这个字段,以及它是不是可遍历的数组/对象:
// 在var model = response;后面加两行调试代码,看控制台输出 console.log('接口返回的完整数据:', model); console.log('NcdexClass字段的值:', model.NcdexClass);
如果控制台里model.NcdexClass显示undefined,那要么是后端接口返回的字段名写错了(比如人家返回的是小写的ncdexClass,你写成大写开头了),要么是接口返回的整体结构和你预期的不一样,比如外层多了data包裹,得写model.data.NcdexClass才对。
2. 检查AJAX的响应解析是否正确
如果后端返回的是JSON字符串,你得确保已经把它转成JS对象了:
- 要是用jQuery的
$.ajax,记得加上dataType: 'json'参数,不然response可能还是纯字符串,这时候model.NcdexClass肯定是undefined; - 要是没加这个参数,也可以手动转换:
var model = JSON.parse(response);。
3. 给遍历加个「安全锁」
为了避免以后再踩这种坑,建议在遍历前先做非空判断,确保model.NcdexClass存在且是可遍历的数组:
// 先判断数据是否合法,再执行遍历 if (model.NcdexClass && Array.isArray(model.NcdexClass)) { $.each(model.NcdexClass, function() { var ncdex = this; // 注意:每次循环都要克隆新的row,不然所有行都是同一个DOM元素 var newRow = row.clone(true); $("td", newRow).eq(0).html(ncdex.script); $("td", newRow).eq(1).html(ncdex.expiryDate); $("td", newRow).eq(2).html(ncdex.measure); $("td", newRow).eq(3).html(ncdex.ltp); // 把新行追加到表格里 $("#tblGet").append(newRow); }); } else { console.warn('NcdexClass数据不存在或者格式不对哦'); }
哦对了,你原来的代码里直接用row去append的话,会导致所有循环添加的都是同一个DOM节点,最后表格里只会显示最后一行,所以每次循环都要克隆新的row才行。
4. 顺便检查表格模板行是否存在
你代码里先克隆了表格最后一行作为模板,然后删除了除第一行外的所有行——这里要确保初始状态下表格至少有两行(表头行+模板行),不然row会是空的jQuery对象,后续操作也会出问题。可以加个判断:
var row = $("#tblGet tr:last-child").clone(true); if (row.length === 0) { console.error('表格里没有可克隆的模板行啊!'); return; }
内容的提问来源于stack exchange,提问作者Amit-Kalshetti

