Chrome/jQuery Uncaught RangeError: Maximum call stack size exceeded

I am getting the error "Uncaught RangeError: Maximum call stack size exceeded" on chrome. here is my jQuery function

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

Note that there are tens of thousands of cells in the page. However, I generally associate stack overflows with recursion and in this case as far as I can see there is none.

Does creating a lambda like this automatically generate a load of stuff on the stack? is there any way round it?

At the moment the only workaround I have is to generate the onclick events explicitly on each cell when rendering the HTML, which makes the HTML much larger.

349430 次浏览

由于“页面中有成千上万个单元格”,将单击事件绑定到每个单元格将导致严重的性能问题。有一个更好的方法可以做到这一点,那就是将一个 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)
}
})

This method will not only do your task with native "td" tag but also with later appended "td". I think you'll be interested in this article about 事件绑定和委托


或者你也可以简单地使用 jQuery 的“ 。在()”方法来达到同样的效果:

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

这个问题发生在我身上,当我在一个网站内使用 jQuery Fancybox 和许多其他 jQuery 插件时。 当我使用 LightBox (站在这里)而不是 Fancybox 时,问题就解决了。

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

我的是更多的一个错误,发生了什么是循环点击(我猜)基本上通过点击登录的父亲也被点击,最终导致最大调用堆栈大小超过。

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


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

U can use

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

我最近也遇到了这个问题。在对话框 div 中有一个非常大的表。它大于15000行。当。是在对话框 div 上调用的,我得到了上面的错误。

我找到了一个迂回的解决方案,在调用清除对话框之前,我将从非常大的表中删除其他每一行,然后调用。空()。不过似乎起作用了。看起来我的旧版本的 JQuery 不能处理这么大的元素。

我得到这个错误是因为我的错误,我忘了声明一个变量,这个变量是在 Ajax 数据中传递的。一开始只宣布了模式。

data: {
tmp_id: tmp_id,
mode: mode
}

还声明了 tmp _ id 变量,它工作得很好。

let tmp_id=$("#tmp_id").val();
let mode=$("#mode").val();
$.ajax({
url: 'my-url',
method: 'post',
data: {
tmp_id: tmp_id,
mode: mode
}
dataType: 'json',
success: function(response) {
console.log(response);
}
});
}