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

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

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

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

创建这样的 lambda 是否会在堆栈上自动生成大量内容?有什么办法可以绕过它吗?

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


答案 1

由于“页面中有数以万计的单元格”将单击事件绑定到每个单元格将导致可怕的性能问题。有更好的方法可以做到这一点,那就是将点击事件绑定到正文,然后找出单元格元素是否是点击的目标。喜欢这个:

$('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(){
        ...
});

答案 2

当您有无限循环时,也可能收到此错误。确保你没有任何无休止的递归自我引用。