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

33qvvth1  于 2022-12-16  发布在  Go
关注(0)|答案(8)|浏览(214)

我收到错误“未捕获的RangeError:最大调用堆栈大小超出”在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变得更大。

iq3niunx

iq3niunx1#

由于“页面中有成千上万个单元格”,将单击事件绑定到每个单元格将导致严重的性能问题。有一个更好的方法来做到这一点,那就是将单击事件绑定到正文,然后找出单元格元素是否是单击的目标。如下图所示:

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

txu3uszq2#

当你有一个无限循环时,你也会得到这个错误。确保你没有任何无休止的,递归的自我引用。

ojsjcaue

ojsjcaue3#

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

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

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

e0bqpujr4#

当我在一个网站内使用jQUery Fancybox和其他许多jQuery插件时,这个问题就发生了。当我使用Lightbox(site here)而不是Fancybox时,问题就消失了。

gwo2fgha

gwo2fgha5#

你可以用

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

km0tfn4u6#

我最近也遇到了这个问题。我在dialog div中有一个非常大的表。它超过15,000行。当在dialog div上调用.empty()时,我得到了上面的错误。
我找到了一个迂回的解决方案,在调用cleaning对话框之前,我会从非常大的表中每隔一行删除一行,然后调用.empty()。不过,它似乎起作用了。我的旧版本JQuery似乎无法处理这么大的元素。

vlf7wbxs

vlf7wbxs7#

我得到这个错误是因为我忘记声明一个在 AJAX 数据中传递的变量。一开始只声明了mode。

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);
    }
    });
 }
vlurs2pr

vlurs2pr8#

In My case I was html element insted of value
                          |
                          |
   var uname=$("#uname");<-
    
   let data={
     uid:uid,
     .....
   };        
    
   $.post("url",data,(responseText)=>{ 
       ..
   }).fail((xhr)=>{
       ..
   });
    
  then I updated 
                              |
                              |
  var uname=$("#uname").val()<-

相关问题