Chrome / jQuery未捕获RangeError:超出最大调用堆栈大小


113

我在Chrome上收到错误消息“未捕获RangeError:超出最大调用堆栈大小”。这是我的jQuery函数

$('td').click(function () {
        if ($(this).context.id != null && $(this).context.id != '') {
            foo($('#docId').val(), $(this).attr('id'));
        }
        return false;
    });

请注意,页面中有成千上万个单元格。但是,我通常将堆栈溢出与递归相关联,在这种情况下,据我所知没有。

创建像这样的lambda是否会自动在堆栈上产生大量负载?有什么办法吗?

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


2
您确定foo函数不会递归吗?如果删除该函数调用,是否还会发生错误?
某物

1
是否可以在其他浏览器中正常工作?您在注释行时会发生此错误foo($('#docId').val(), $(this).attr('id'));吗?-额外的性能提示:缓存选择器的结果-例如将结果保留$(this)在变量中,然后根据需要在处理程序中使用它。
WTK

我有一个类似的问题,但需要mouseenter事件。使用正文或表格时,我没有得到足够的事件。
ericslaw

Answers:


133

由于“页面中有成千上万个单元”将点击事件绑定到每个单元,将导致严重的性能问题。有一种更好的方法,将点击事件绑定到主体,然后找出单元格元素是否为点击的目标。像这样:

$('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 的“ .on() ”方法来达到相同的效果:

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

谢谢,无论如何我们都在为性能而挣扎,所以这是一个好主意:-)
Andy

60
不,不要使用.live()!!!bitovi.com/blog/2011/04/…使用.delegate()(如果您的jQuery很新,则使用.on()),然后从表级而不是整个文档进行委派。这将大大提高性能,而不仅仅是使用.live(),它实际上只是从整个文档开始进行委派。
brandwaffle 2012年

19
并且.live已从jQuery 1.9中删除
cpuguy83

37

当您遇到无限循环时,也会出现此错误。确保您没有任何无休止的递归自引用。


6
那解决了我的问题。我有一个<a id="linkDrink" onclick="drinkBeer();">Drink</a>$('#linkDrink').click();drinkBeer()
AycanYaşıt'Mar

7

我的错误更多,实际上是通过单击父级也被单击的登录名来进行循环单击(我猜),最终导致超出最大调用堆栈大小。

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

<li class="clickhere">
  <a href="#" class="login">login</a>
</li>


1

你可以用

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

0

我最近也遇到了这个问题。我在对话框div中有一个很大的表。它是> 15,000行。在对话框div上调用.empty()时,出现了以上错误。

我找到了一种环回解决方案,在调用清理对话框之前,我将从非常大的表中删除所有其他行,然后调用.empty()。它似乎已经奏效了。看来我的旧版JQuery无法处理这么大的元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.