【问题标题】:Fancybox Recursion causes a stack overflowFancybox Recursion 导致堆栈溢出
【发布时间】:2012-03-28 21:55:59
【问题描述】:

似乎当我将 afterClose 回调添加到我的 fancybox 时,我收到了这个错误:

未捕获的 RangeError:超出最大调用堆栈大小

这是我正在使用的代码:

$("a.termsLink").fancybox({
    type            : 'iframe', 
    fitToView       : false,
    width           : 450,
    height          : 600,
    afterClose  : function(){
        $('#regForm').click();
    }
});

应该发生的是当termsLink 框关闭时,regForm 应该打开。我已经过期了不同的回调,但我遇到的问题似乎不受此影响。

解决方案似乎如下:

    afterClose      : function(){
        setTimeout(function(){$('#regForm').click();}, 1);
    }

然而,这对我来说是一个非常 hacky 的方法,问题似乎是 fancybox 代码在另一个盒子的动画仍在运行时尝试调用新盒子,这导致了这个问题。这是 FancyBox 的记录问题吗?或者这是 jQuery 动画事件工作方式的一个功能?这个问题有更优雅的解决方案吗?

【问题讨论】:

  • 我敢打赌你有两个库的加载。
  • 绝对不是这样,我已经验证过了。这是唯一出现此错误的地方
  • 什么是#regFormdiv 标签还是 form 标签? ...点击它的想法是什么? ...您要做的是在关闭后将访问者重定向到该元素? ...喜欢<a href="#regForm" ..? ...这里缺少一些信息。
  • #regForm,是我试图在 termsLink Fancybox 退出时调用的另一个 fancybox。从技术上讲,它是一个锚标签,但它附加在一个花哨的盒子上。

标签: javascript jquery jquery-plugins fancybox jquery-events


【解决方案1】:

如果您使用的是 Twitter Bootstrap

更多详情:https://github.com/fancyapps/fancyBox/issues/519

【讨论】:

    【解决方案2】:

    试试

    $("a.termsLink").fancybox({
        type            : 'iframe', 
        fitToView       : false,
        width           : 450,
        height          : 600,
        afterClose  : function(){
            $('#regForm').focus();
        }
    });
    

    虽然你所拥有的应该可以工作,但你是对的。不确定但检查脚本不会关闭所有打开的fancybox。如果#regForm 被打开到一个花哨的盒子中,那么为什么你需要超时。

    【讨论】:

    • 我应该提到regForm和termLink都是fancybox,所以调用click函数是试图打开一个不同的fancybox,但我的假设是afterClose方法可以提供足够的事件分离。跨度>
    • 你用的是什么版本的fancy box?
    【解决方案3】:

    查看他们使用这个函数的fancybox脚本

        function _cleanup() {
            overlay.fadeOut('fast');
    
            title.empty().hide();
            wrap.hide();
    
            $.event.trigger('fancybox-cleanup');
    
            content.empty();
    
            currentOpts.onClosed(currentArray, currentIndex, currentOpts);
    
            currentArray = selectedOpts = [];
            currentIndex = selectedIndex = 0;
            currentOpts = selectedOpts  = {};
    
            busy = false;
        }
    

    这基本上证实了我之前所说的。运行此函数后,fancybox 的所有实例都会被清除。因此,即使您在真正被展示之前就被清除了一个开口。你提出的解决方案似乎是更好的解决方案,除非你想自己摆弄fancybox脚本:)

    【讨论】:

    • 那么这似乎是我应该在fancybox中报告的错误?我的理解是使用 setTimeouts 和 setIntervals 是不好的做法。我很担心,因为 Chrome 中的调用堆栈大小非常大。所以不断的往栈中添加事件并导致递归错误似乎是个严重的问题。
    【解决方案4】:

    您确定问题与点击功能有关吗? 我发现了同样的问题,包括错误的两个 jQuery 版本 (jquery-1.2.6.pack.js 和 jquery-1.4.4.min.js) 删除最后一个解决了这个问题。 因为这个话题loading jquery twice causes an error?,我检查了这个。 你可以试着检查一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2015-12-21
      • 2018-11-27
      相关资源
      最近更新 更多