Ajax通过POST传JSON栈溢出报错,脚本失效求助(附代码)
排查「Maximum call stack size exceeded」及脚本运行问题
咱们一步步拆解问题,先从代码里的明显错误入手,再深挖调用栈溢出的核心原因:
1. JS代码的低级错误:拼写错误导致回调完全失效
你写的AJAX配置里,succes是拼写错误!正确的参数名是success。这个小错误会导致请求成功后你写的alert('Ok')根本不会执行,而且因为缺失错误处理逻辑,还会隐藏其他潜在问题。
修正后的JS代码(顺便加上错误处理方便排查):
function addentrys() { var nwentry = {}; // 记得给变量加声明,避免全局变量污染 let el = document.getElementById('addname').value; let eldmn = document.getElementById('adddomain').value; nwentry.name = el; nwentry.domain = eldmn; $.ajax({ type: 'POST', url: 'api/domain', dataType: 'json', data: nwentry, success: function(data) { // 这里修正了拼写错误 alert('Ok') }, error: function(xhr, status, err) { // 新增错误处理,方便看哪里出问题 console.error('请求出错了:', status, err); } }) }
2. PHP接口的逻辑错误:AJAX请求返回重定向,这是调用栈溢出的核心原因!
你的PHP接口处理完POST请求后,返回了withRedirect('../index.html')——但这是给AJAX调用的接口啊!浏览器会自动跟随这个重定向,重新加载index.html。如果index.html里包含了这段addentrys的JS代码,而且页面加载时又不小心触发了调用addentrys的逻辑(比如按钮点击事件被重复绑定、或者页面加载时自动执行了函数),就会陷入无限循环:
AJAX请求→PHP重定向→加载index.html→触发addentrys→再次AJAX请求→再次重定向→...
循环次数多了,就会直接触发「Maximum call stack size exceeded」错误。
修正PHP逻辑:AJAX接口要返回JSON,不是重定向
因为是给前端AJAX调用的接口,不需要跳转页面,直接返回成功/失败的JSON响应就行:
// ADD $app->post('/domain', function () { $jsonContents = file_get_contents('data/data.json'); $name = $_POST['name']; $domain = $_POST['domain']; $data = json_decode($jsonContents, true); // 新增空数据判断:如果data.json是空的,end()会报错 $last_item_id = 0; if (!empty($data)) { $last_item = end($data); $last_item_id = $last_item['id']; } $data[] = array( 'name' => $name, 'domain' => $domain, 'id' => $last_item_id + 1 ); $json = json_encode($data); file_put_contents('data/data.json', $json); // 返回JSON响应,替代重定向 return $this->response->withJson(['status' => 'success', 'message' => '条目已添加']); });
3. 其他可能引发栈溢出的潜在问题
- 事件重复绑定:如果你多次给按钮绑定点击事件(比如用
click()或者addEventListener重复调用),每次点击都会触发N次addentrys,累积多了也会爆栈。可以用解绑后再绑定的方式避免:$('#你的按钮ID').off('click').on('click', addentrys); - 全局变量冲突:之前的JS里
el和eldmn没加var/let/const,变成了全局变量,可能和其他代码的变量重名,引发意外的函数调用循环,所以一定要给变量加声明。
调试小技巧
- 按F12打开浏览器开发者工具,看「Console」标签有没有其他报错;
- 在
addentrys函数开头加console.log('addentrys被触发了'),看看是不是被重复调用; - 看「Network」标签,观察AJAX请求的响应内容,确认PHP接口返回的是不是预期的JSON。
内容的提问来源于stack exchange,提问作者Joanmi
相关产品推荐
相关产品推荐

