J'obtiens l'erreur "Uncaught RangeError: la taille maximale de la pile d'appels a été dépassée" 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 y a 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 ce cas, pour autant que je sache, il n'y en a pas.

La création d'un lambda comme celui-ci génère-t-elle automatiquement une charge de choses sur la pile? y a-t-il un moyen de contourner cela?

Pour le moment, la seule solution de contournement que j'ai est de générer explicitement les événements onclick sur chaque cellule lors du rendu du HTML, ce qui rend le HTML beaucoup plus grand.

117
Andy 5 oct. 2011 à 12:48

6 réponses

Meilleure réponse

Comme «il y a des dizaines de milliers de cellules dans la page», lier l'événement click à chaque cellule entraînera un terrible problème de performances. Il existe une meilleure façon de le faire, qui consiste à lier un événement de clic au corps, puis à déterminer si l'élément de 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 aussi avec le "td" ajouté ultérieurement. Je pense que vous serez intéressé par cet article sur liaison d'événement et déléguer


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

$('body').on('click', 'td', function(){
        ...
});
132
Andrew Ng 22 juil. 2013 à 20:46

La mienne était plus une erreur, ce qui s'est passé était un clic de boucle (je suppose) essentiellement en cliquant sur la connexion, le parent a également été cliqué, ce qui a entraîné un dépassement de la taille maximale de la pile d'appels.

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

<li class="clickhere">
  <a href="#" class="login">login</a>
</li>
7
Raptor 27 juil. 2015 à 03:37

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

3
Silvio Delgado 12 avril 2013 à 22:35

J'ai récemment rencontré ce problème également. J'avais une très grande table dans la div de dialogue. C'était> 15 000 lignes. Lorsque le .empty () a été appelé sur la div de dialogue, j'obtenais l'erreur ci-dessus.

J'ai trouvé une solution de contournement où avant d'appeler le nettoyage de la boîte de dialogue, je supprimais toutes les autres lignes de la très grande table, puis appelais le .empty (). Cela semblait avoir fonctionné cependant. Il semble que mon ancienne version de JQuery ne puisse pas gérer des éléments aussi volumineux.

0
dev4life 17 janv. 2018 à 21:26

Vous pouvez également obtenir cette erreur lorsque vous avez une boucle infinie. Assurez-vous que vous n'avez pas d'auto-références récursives sans fin.

36
John Durden 28 déc. 2013 à 20:18

Vous pouvez utiliser

  $(document).on('click','p.class',function(e){
   e.preventDefault();
      //Code 
   });
1
demenvil 10 mars 2017 à 13:42