web-dev-qa-db-fra.com

Chrome/jQuery Uncaught RangeError: taille maximale de la pile d'appels dépassée

L'erreur "Uncaught RangeError: taille maximale de la pile d'appels dépassée" s'affiche sur chrome. voici ma fonction jQuery

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

Notez qu'il existe des dizaines de milliers de cellules dans la page. Cependant, j'associe généralement les débordements de pile à la récursivité et, dans la mesure où je peux voir, il n'y en a pas.

Créer un lambda comme celui-ci génère-t-il automatiquement une charge de travail sur la pile? y a-t-il un moyen de le contourner?

Pour le moment, la seule solution que je puisse utiliser consiste à générer explicitement les événements onclick sur chaque cellule lors du rendu du code HTML, ce qui le rend beaucoup plus volumineux.

100
Andy

Comme "il y a des dizaines de milliers de cellules dans la page", lier l'événement de clic à chaque cellule posera un problème de performances épouvantable. Il existe un meilleur moyen de le faire, qui consiste à lier un événement de clic au corps, puis à déterminer si l'élément de la cellule était la cible du clic. Comme ça:

$('body').click(function(e){
       var Elem = e.target;
       if (Elem.nodeName=='td'){
           //.... your business goes here....
           // remember to replace $(this) with $(Elem)
       }
})

Cette méthode fera non seulement votre tâche avec la balise native "td" mais également avec "td" ajouté plus tard. Je pense que vous serez intéressé par cet article sur événement obligatoire & délégué


Ou vous pouvez simplement utiliser la méthode " .on () " de jQuery avec le même effet:

$('body').on('click', 'td', function(){
        ...
});
123
vantrung -cuncon

Vous pouvez également obtenir cette erreur lorsque vous avez une boucle infinie. Assurez-vous de ne pas avoir de références de soi sans fin et récursives.

31
John Durden

Le mien était plus une erreur, ce qui s'est passé était un clic de boucle (je suppose) en cliquant simplement sur le login sur lequel le parent a également été cliqué, ce qui a fini par causer la taille maximale de la pile d'appels dépassée. 

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

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

Ce problème est survenu lorsque j'ai utilisé jQUery Fancybox dans un site Web avec de nombreux autres plugins jQuery . Lorsque j'ai utilisé LightBox ( site here ) au lieu de Fancybox, le problème a disparu.

3
Silvio Delgado

U peut utiliser

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

Je viens tout juste de tomber sur ce problème également. J'ai eu une très grande table dans le dialogue div. C'était> 15 000 lignes. Lorsque le .empty () a été appelé sur la boîte de dialogue div, j'ai eu l'erreur ci-dessus.

J'ai trouvé une solution de contournement dans laquelle, avant d'appeler le nettoyage de la boîte de dialogue, je supprimais toutes les lignes du tableau, puis appelais le .empty () Cela semblait avoir fonctionné bien. Il semble que mon ancienne version de JQuery ne puisse pas gérer des éléments aussi volumineux.

0
dev4life