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

Je reçois l'erreur "Uncaught RangeError: taille maximale de la pile d'appels 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, je associe généralement les débordements de pile à la récursivité et dans ce cas, autant que je peux voir, il n'y en a pas.

La création d'une lambda comme celle-ci génère-t-elle automatiquement une quantité de choses sur la pile? Y a-t-il un moyen de le faire?

En ce moment, la seule solution de rechange que je dois consiste à générer les événements onclick explicitement sur chaque cellule lors du rendu du HTML, ce qui rend le HTML beaucoup plus grand.

Comme "il y a des dizaines de milliers de cellules dans la page", la liaison de l'événement de clic à chaque cellule entraînera un problème de performance terrible. Il y a une meilleure façon de le faire, qui lie un événement de clic au corps et découvre 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 ne fera pas que votre tâche avec la balise "td" native, mais aussi avec "td" ajouté ultérieurement. Je pense que vous serez intéressé par cet article sur la liaison d'événements 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(){ ... }); 

Vous pouvez également obtenir cette erreur lorsque vous avez une boucle infinie. Assurez-vous que vous n'avez pas de références indépendantes et non récurrentes.

Le mien était plus une erreur, ce qui s'est passé était un clic de boucle (je suppose) en cliquant sur la connexion, le parent a également 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> 

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

U peut utiliser

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