127 votes

Chrome/jQuery non Interceptée RangeError: le Maximum de la pile d'appels de taille dépassait

J'obtiens l'erreur "Uncaught RangeError: le Maximum de la pile d'appels de taille dépassé" 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, en général, je associer les débordements de pile avec la récursivité et dans ce cas, aussi loin que je peux voir il n'y a aucun.

Ne la création d'un lambda comme cela automatiquement générer une charge de trucs sur la pile? est-il de toute façon autour de lui?

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

140voto

vantrung -cuncon Points 1658

"Il y a des dizaines de milliers de cellules dans la page" liaison la, cliquez sur l'événement à chaque cellule sera la cause d'une terrible problème de performance. Il y a une meilleure façon de le faire, c'est de la liaison d'un événement de clic sur le corps et ensuite de savoir si l'élément de cellule a été la cible du clic. Comme ceci:

$('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 sera pas seulement faire de votre tâche avec native "td" tag, mais aussi avec des plus tard ajouté "td". Je pense que vous serez intéressé par cet article à propos de l'événement de liaison et délégué


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

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

39voto

John Durden Points 51

Vous pouvez également obtenir cette erreur quand vous avez une boucle infinie. Assurez-vous que vous n'avez pas interminable, récursive auto-références.

3voto

Silvio Delgado Points 1650

Ce problème s'est passé avec moi lorsque j'ai utilisé jQUery Fancybox à l'intérieur d'un site web avec de nombreux autres plugins jQuery. Lorsque j'ai utilisé la LightBox (site ici) au lieu de Fancybox, le problème a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X