我在 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 更大。
foo($('#docId').val(), $(this).attr('id'));
行时是否会出现此错误? -- 额外的性能提示:缓存选择器的结果 - 例如将 $(this)
的结果保存在变量中,然后根据需要在处理程序中使用它。
由于“页面中有数以万计的单元格”将点击事件绑定到每个单元格将导致可怕的性能问题。有一种更好的方法可以做到这一点,即将点击事件绑定到正文,然后找出单元格元素是否是点击的目标。像这样:
$('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(){
...
});
当您有无限循环时,您也可能会收到此错误。确保您没有任何无休止的递归自引用。
drinkBeer()
中有一个 <a id="linkDrink" onclick="drinkBeer();">Drink</a>
和一个 $('#linkDrink').click();
。
我的错误更多,发生的事情是循环单击(我猜),基本上是通过单击登录,父级也被单击,最终导致超出最大调用堆栈大小。
$('.clickhere').click(function(){
$('.login').click();
});
<li class="clickhere">
<a href="#" class="login">login</a>
</li>
当我在一个带有许多其他 jQuery 插件的网站中使用 jQUery Fancybox 时,这个问题发生在我身上。当我使用 LightBox (site here) 而不是 Fancybox 时,问题就消失了。
你可以使用
$(document).on('click','p.class',function(e){
e.preventDefault();
//Code
});
我最近也遇到了这个问题。我在对话框 div 中有一个非常大的表。超过 15,000 行。当在对话框 div 上调用 .empty() 时,我收到了上面的错误。
我找到了一个迂回的解决方案,在我调用清理对话框之前,我会从非常大的表中删除每隔一行,然后调用 .empty()。不过,它似乎奏效了。看来我的旧版本的 JQuery 无法处理这么大的元素。