首页 文章

Chrome / jQuery Uncaught RangeError:超出了最大调用堆栈大小

提问于
浏览
100

我在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更大 .

6 回答

  • 1

    当我在一个带有许多其他jQuery插件的网站中使用jquery Fancybox时,我遇到了这个问题 . 当我使用LightBox(site here)而不是Fancybox时,问题就消失了 .

  • 121

    你可以用

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

    我最近也遇到了这个问题 . 我在对话框div中有一个非常大的表 . 它是> 15,000行 . 当在对话框div上调用.empty()时,我收到了上面的错误 .

    我找到了一个圆形解决方案,在我调用清理对话框之前,我会从非常大的表中删除所有其他行,然后调用.empty() . 它似乎有效 . 看来我的旧版JQuery无法处理如此大的元素 .

  • 4

    由于“页面中有数万个单元格”将点击事件绑定到每个单元格将导致严重的性能问题 . 有一种更好的方法,即将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)
           }
    })
    

    此方法不仅可以使用本机"td"标记执行您的任务,还可以使用后面添加的"td" . 我想你会对这篇关于event binding & delegate的文章感兴趣


    或者你可以简单地使用jQuery的“.on()”方法,效果相同:

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

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

  • 31

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

    $('.clickhere').click(function(){
       $('.login').click();
    });
    
    <li class="clickhere">
      <a href="#" class="login">login</a>
    </li>
    

相关问题