AJAX脚本触发'too much recursion'错误,求排查代码问题
解决'too much recursion'递归溢出问题
嘿,我来帮你揪出这个递归溢出的问题!结合你给出的代码片段和jBox的使用逻辑,大概率是这里的触发逻辑形成了无限循环:
问题根源
你的clickMe函数里创建jBox Modal时,设置了attach: '.pin'和trigger: 'click'——如果这个clickMe函数本身是绑定在.pin元素的点击事件上的(比如你在HTML里写了<button class="pin" onclick="clickMe()">),那麻烦就来了:
- 你点一下
.pin,触发clickMe()执行 clickMe()里的jBox会给.pin再绑定一层点击触发逻辑- 这就会导致后续(甚至当下)不断触发点击事件,重复调用
clickMe(),形成无限递归,最终浏览器就报错“too much recursion”了
另外你的代码里onCloseCompl...被截断了,如果这个关闭回调里又调用了clickMe()或者手动触发了.pin的点击,那也会直接引发递归循环。
给你两个修复方向
方向1:直接手动打开模态框,不用重复绑定触发
既然你已经通过clickMe()来触发模态框,那就没必要让jBox再绑定.pin的点击了,直接创建后手动打开:
function clickMe() { new jBox('Modal', { width: 1000, height: 500, title: 'Admin PIN', theme: 'TooltipBorder', closeButton: 'title', draggable: 'title', animation: false, // 这里注意别加引号,布尔值不需要字符串包裹 position: { x: 'center', y: 'center' }, offset: { x: 15, y: -10 }, onCloseComplete: function() { // 这里写你的关闭完成逻辑,*千万别在这里调用clickMe或者触发.pin的点击哦* } }).open(); // 手动调用open打开模态框 }
方向2:页面加载时初始化jBox,不用单独写点击函数
如果你的需求就是点击.pin弹出模态框,那完全不需要clickMe(),直接在页面加载好后初始化jBox就行,让它自己绑定点击触发:
// 等页面元素都加载完再初始化 document.addEventListener('DOMContentLoaded', function() { new jBox('Modal', { attach: '.pin', width: 1000, height: 500, title: 'Admin PIN', theme: 'TooltipBorder', closeButton: 'title', draggable: 'title', trigger: 'click', animation: false, position: { x: 'center', y: 'center' }, offset: { x: 15, y: -10 }, onCloseComplete: function() { // 你的关闭逻辑 } }); });
额外小提醒
- 你代码里的
animation: 'false'是个小错误,jBox的animation参数要传布尔值false,传字符串'false'会被浏览器当成“真”值,起不到禁用动画的效果。 - 一定要补全
onCloseComplete的代码检查一遍,确保里面没有触发.pin点击或者调用clickMe()的逻辑,这也是常见的递归坑。
内容的提问来源于stack exchange,提问作者DCJones
相关产品推荐
相关产品推荐

