You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,变成了全局变量,可能和其他代码的变量重名,引发意外的函数调用循环,所以一定要给变量加声明。

调试小技巧

  1. 按F12打开浏览器开发者工具,看「Console」标签有没有其他报错;
  2. 在addentrys函数开头加console.log('addentrys被触发了'),看看是不是被重复调用;
  3. 看「Network」标签,观察AJAX请求的响应内容,确认PHP接口返回的是不是预期的JSON。

内容的提问来源于stack exchange,提问作者Joanmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:52