使用$.each循环创建多个div无效问题排查
核心问题:html() 方法会替换容器内容,而非追加
你当前在 $.each 循环里使用 $("div#ssss").html(...),这个方法的作用是完全替换目标容器内的所有HTML内容。所以每循环一次,之前生成的错误框就会被新的覆盖,最终页面只显示最后一个错误。
另外还有两个小问题:
- 变量
x被定义在循环内部,每次循环都会重置为0,导致所有错误框的ID都是dmessage_0和pmessage_0,不符合你"动态ID"的需求。 - 你的PHP返回格式和前端判断逻辑不匹配(后面会详细说明)。
修复步骤
1. 替换 html() 为 append(),并修正变量作用域
把 x 的初始化移到循环外面,同时用 append() 替代 html(),这样每次循环都会把新的错误框追加到容器里,而不是替换:
success: function(data){ // 解析返回的JSON数据 const result = JSON.parse(data); // 获取错误容器并清空旧内容(避免重复显示) const $errorContainer = $("#ssss"); $errorContainer.empty(); // 情况1:PHP返回包含错误对象的数组(比如[{"error_1":"...", "error_2":"..."}]) if (Array.isArray(result) && result.length > 0) { let x = 0; // 把x放在循环外,保证每次自增正确 $.each(result[0], function(key, error) { // 用append()追加元素,而非html()替换 $errorContainer.append(`<div id="dmessage_${x}" class="modal" style="display:block"><p id="pmessage_${x}">${error}</p></div>`); x++; }); } // 情况2:PHP直接返回错误对象(比如{"error_1":"...", "error_2":"..."}) else if (typeof result === 'object' && Object.keys(result).length > 0) { let x = 0; $.each(result, function(key, error) { $errorContainer.append(`<div id="dmessage_${x}" class="modal" style="display:block"><p id="pmessage_${x}">${error}</p></div>`); x++; }); } }
2. 修正PHP返回格式与前端判断的匹配问题
看你的PHP代码:
print_r(json_encode($data[0]));
这里输出的是 $data[0] 关联数组的JSON,也就是类似 {"error_1":"Error_1_text", "error_2":"Error_2_text"} 的对象。但前端里你用 result.hasOwnProperty('0') 判断,这显然不成立——因为解析后的 result 是一个对象,没有名为 0 的属性。
如果要保留前端原本的 result['0'] 逻辑,你需要在PHP里输出整个 $data 数组:
print_r(json_encode($data));
这样返回的JSON是 [{"error_1":"Error_1_text", "error_2":"Error_2_text"}],解析后的 result 是一个数组,result[0] 就是你的错误对象,此时 result.hasOwnProperty('0') 才会为 true。
为什么控制台能看到所有错误?
你测试时用 array.push(error) 收集错误,这个操作和DOM渲染无关——它只是把每个循环的 error 存入数组,所以控制台能正确显示所有错误,但DOM操作里因为每次用 html() 替换,所以页面只留下最后一个元素。
内容的提问来源于stack exchange,提问作者asdfasdfasdf

