Javascript Chrome/jQuery未捕获范围错误:超过最大调用堆栈大小

Javascript Chrome/jQuery未捕获范围错误:超过最大调用堆栈大小,javascript,jquery,google-chrome,webkit,stack-overflow,Javascript,Jquery,Google Chrome,Webkit,Stack Overflow,我在chrome上收到错误“UncaughtRangeError:超过最大调用堆栈大小”。这是我的jQuery函数 $('td').click(function () { if ($(this).context.id != null && $(this).context.id != '') { foo($('#docId').val(), $(this).attr('id')); } return false

我在chrome上收到错误“UncaughtRangeError:超过最大调用堆栈大小”。这是我的jQuery函数

$('td').click(function () {
        if ($(this).context.id != null && $(this).context.id != '') {
            foo($('#docId').val(), $(this).attr('id'));
        }
        return false;
    });
请注意,页面中有成千上万个单元格。然而,我通常将堆栈溢出与递归联系起来,在这种情况下,据我所知,根本没有

像这样创建lambda会自动在堆栈上生成一堆东西吗?有什么办法吗

目前,我唯一的解决方法是在呈现HTML时在每个单元格上显式生成onclick事件,这使HTML变得更大。

因为“页面中有成千上万个单元格”将单击事件绑定到每个单元格将导致严重的性能问题。有一种更好的方法可以做到这一点,那就是将click事件绑定到body&然后确定cell元素是否是click的目标。像这样:

$('body').click(function(e){
       var Elem = e.target;
       if (Elem.nodeName=='td'){
           //.... your business goes here....
           // remember to replace $(this) with $(Elem)
       }
})
此方法不仅可以使用本机“td”标记执行任务,还可以在后面附加“td”。我想你会对这篇关于


或者您可以简单地使用jQuery的“”方法,效果相同:

$('body').on('click', 'td', function(){
        ...
});

当我在一个网站中与许多其他jQUery插件一起使用jQueryFancyBox时,这个问题就发生在我身上。
当我使用LightBox()而不是Fancybox时,问题就不存在了。

当你有一个无限循环时,你也可以得到这个错误。确保您没有任何无休止的递归自引用。

我的错误更多,发生的是循环单击(我猜),基本上是通过单击登录名,父级也被单击,最终导致超过最大调用堆栈大小

$('.clickhere').click(function(){
   $('.login').click();
});

<li class="clickhere">
  <a href="#" class="login">login</a>
</li>
$('.clickhere')。单击(函数(){
$('.login')。单击();
});
  • U可以使用

      $(document).on('click','p.class',function(e){
       e.preventDefault();
          //Code 
       });
    

    我最近也遇到了这个问题。对话框分区中有一个非常大的表,超过15000行。在对话框div上调用.empty()时,我得到了上面的错误


    我找到了一个全面的解决方案,在我调用清理对话框之前,我会从非常大的表中删除每一行,然后调用.empty()。不过,这似乎奏效了。我的旧版本JQuery似乎无法处理如此大的元素。

    您确定foo函数不会递归吗?如果删除该函数调用,是否仍会发生错误?它是否在其他浏览器中按预期工作?注释
    foo($('#docId').val(),$(this.attr('id'))时是否会发生此错误行?--额外的性能提示:缓存选择器的结果-例如,将
    $(this)
    的结果保留在变量中,然后根据需要在处理程序中使用它。我有一个类似的问题,但需要mouseenter事件。当使用body或table时,我没有得到足够的事件。谢谢,无论如何,我们都在努力提高性能,所以这是一个好主意:-)不,不要使用。live()!!!使用.delegate()(如果jQuery足够新,则使用.on()),并从表级别而不是整个文档进行委托。这将大大提高您的性能,而不仅仅是使用.live(),它实际上只是从整个文档中进行委托。并且.live已从解决我的问题的jQuery 1.9中删除。我喝了一杯
    饮料
    ,喝了一杯
    $(“#linkDrink”)。单击()drinkBeer()中的code>。