Chrome / jQuery Uncaught RangeError:最大コールスタックサイズを超えました


113

Chromeで「Uncaught RangeError:Maximum call stack size超過」というエラーが表示されます。ここに私のjQuery関数があります

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

ページには数万のセルがあることに注意してください。ただし、私は通常、スタックオーバーフローを再帰に関連付けます。この場合、私が見る限り、何もありません。

このようなラムダを作成すると、スタックに大量のものが自動的に生成されますか?それを回避する方法はありますか?

現時点での唯一の回避策は、HTMLをレンダリングするときに各セルでonclickイベントを明示的に生成することです。これにより、HTMLがはるかに大きくなります。


2
foo関数が再帰しないことを確認しますか?その関数呼び出しを削除してもエラーは発生しますか?
2010年

1
他のブラウザで期待どおりに動作しますか?このエラーは、foo($('#docId').val(), $(this).attr('id'));行をコメントしたときに発生しますか?-パフォーマンスに関する追加のヒント:セレクターの結果をキャッシュします。たとえば、結果を$(this)変数に保存し、必要に応じてハンドラー全体で使用します。
WTK

同様の問題がありますが、mouseenterイベントが必要です。ボディまたはテーブルを使用すると、十分なイベントが得られません。
ericslaw 2015年

回答:


133

「ページには数万のセルがある」ため、クリックイベントをすべてのセルにバインドすると、パフォーマンスに重大な問題が発生します。これを行うには、クリックイベントを本文にバインドし、セル要素がクリックのターゲットであるかどうかを確認するという、より良い方法があります。このような:

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

おかげで、とにかくこれでパフォーマンスに苦労していますので、これは素晴らしいアイデアです:-)
Andy

60
いいえ、.live()は使用しないでください!!! bitovi.com/blog/2011/04/….delegate()(またはjQueryが十分に新しい場合は.on())を使用し、ドキュメント全体ではなくテーブルレベルから委任します。これにより、単に.live()を使用するだけでなく、本質的にドキュメント全体から委任するだけでなく、パフォーマンスが大幅に向上します。
ブランドワッフル

19
そして.liveがjQuery 1.9から削除されました
cpuguy83

37

無限ループがある場合にも、このエラーが発生する可能性があります。終わりのない再帰的な自己参照がないことを確認してください。


6
それで私の問題は解決しました。私はA持っていた<a id="linkDrink" onclick="drinkBeer();">Drink</a>、と$('#linkDrink').click();ではdrinkBeer()
AycanYaşıt2016年

7

鉱山はもっと間違いでした、起こったのは基本的には親をクリックしたログインをクリックすることによるループクリック(おそらく)でした。これにより、最大コールスタックサイズを超えました。

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

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

3

この問題は、他の多くのjQueryプラグインを含むWebサイト内でjQUery Fancyboxを使用したときに発生しました。Fancyboxの代わりにLightBox(サイトはこちら)を使用した場合、問題は解決しました。


1

Uは使用できます

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

0

最近この問題にも遭遇しました。ダイアログdivに非常に大きなテーブルがありました。15,000行を超えていました。.empty()がダイアログdivで呼び出されたときに、上記のエラーが発生しました。

ダイアログボックスのクリーニングを呼び出す前に、非常に大きなテーブルから1行おきに行を削除してから、.empty()を呼び出すという回避策を見つけました。それでもうまくいったようです。私の古いバージョンのJQueryでは、このような大きな要素を処理できないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.