我在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更大。
答案 0 :(得分:126)
由于“页面中有数万个单元格”将点击事件绑定到每个单元格都会导致严重的性能问题。有一种更好的方法可以做到这一点,即将点击事件绑定到身体和身体上。然后找出单元格元素是否是点击的目标。像这样:
$('body').click(function(e){
var Elem = e.target;
if (Elem.nodeName=='td'){
//.... your business goes here....
// remember to replace $(this) with $(Elem)
}
})
此方法不仅可以使用本机“td”标记执行任务,还可以使用后面添加的“td”执行此任务。我想你会对这篇关于event binding & delegate
的文章感兴趣或者你可以简单地使用jQuery的“.on()”方法,效果相同:
$('body').on('click', 'td', function(){
...
});
答案 1 :(得分:34)
当您有无限循环时,也可能会出现此错误。确保您没有任何无休止的递归自引用。
答案 2 :(得分:5)
Mine更是一个错误,发生了什么是循环点击(我猜)基本上是通过点击登录父母也被点击最终导致超出最大调用堆栈大小。
$('.clickhere').click(function(){
$('.login').click();
});
<li class="clickhere">
<a href="#" class="login">login</a>
</li>
答案 3 :(得分:3)
当我在一个带有许多其他jQuery插件的网站中使用jquery Fancybox时,我遇到了这个问题。 当我使用LightBox(site here)而不是Fancybox时,问题就消失了。
答案 4 :(得分:1)
你可以使用
$(document).on('click','p.class',function(e){
e.preventDefault();
//Code
});
答案 5 :(得分:0)
我最近也遇到了这个问题。我在对话框div中有一个非常大的表。它是> 15,000行。当在对话框div上调用.empty()时,我收到了上面的错误。
我找到了一个圆形解决方案,在我打电话清理对话框之前,我会从非常大的表中删除所有其他行,然后调用.empty()。它似乎有效。似乎我的旧版JQuery无法处理如此大的元素。