it-swarm.com.de

Chrome/jQuery nicht gefunden RangeError: Maximale Größe des Aufrufstacks überschritten

Ich erhalte die Fehlermeldung "Unrecept RangeError: Maximale Aufrufstackgröße überschritten" auf Chrome. hier ist meine jQuery-Funktion

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

Beachten Sie, dass die Seite Zehntausende von Zellen enthält. Normalerweise assoziiere ich Stack-Überläufe mit Rekursion. In diesem Fall gibt es meines Erachtens keine.

Wird durch das Erstellen eines solchen Lambda automatisch eine Menge Sachen auf dem Stapel erzeugt? gibt es eine Möglichkeit, es zu umgehen?

Momentan besteht die einzige Problemumgehung darin, die Onclick-Ereignisse beim Rendern des HTML-Codes explizit in jeder Zelle zu generieren, wodurch der HTML-Code viel größer wird.

100
Andy

Da "es Zehntausende von Zellen auf der Seite gibt", führt das Binden des Klickereignisses an jede einzelne Zelle zu einem schrecklichen Leistungsproblem. Es gibt einen besseren Weg, dies zu tun, indem ein Klickereignis an den Körper gebunden wird und dann herausgefunden wird, ob das Zellenelement das Ziel des Klicks war. So was:

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

Diese Methode erledigt Ihre Aufgabe nicht nur mit nativem "td" -Tag, sondern auch mit später angefügtem "td". Ich denke, Sie interessieren sich für diesen Artikel über Eventbindung & Delegierte


Oder Sie können einfach die " .on () " Methode von jQuery mit dem gleichen Effekt verwenden:

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

Sie können diese Fehlermeldung auch erhalten, wenn Sie eine Endlosschleife haben. Stellen Sie sicher, dass Sie keine unendlichen, rekursiven Selbstreferenzen haben.

31
John Durden

Meiner war eher ein Fehler, was passiert war, war ein Klick auf die Schleife (ich denke, im Grunde), indem man auf das Login klickte, auf das auch das übergeordnete Element geklickt wurde. 

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

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

Dieses Problem trat bei mir auf, als ich jQUery Fancybox in einer Website mit vielen anderen jQuery-Plugins verwendet habe .. Wenn ich die LightBox ( site here ) anstelle von Fancybox verwendet habe, ist das Problem weg.

3
Silvio Delgado

Sie können verwenden

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

Ich bin kürzlich auch auf dieses Thema gestoßen. Ich hatte eine sehr große Tabelle im Dialog div. Es waren> 15.000 Reihen. Beim Aufruf von .empty () im Dialogfeld div wurde der obige Fehler angezeigt.

Ich habe eine Rundum-Lösung gefunden, bei der ich vor dem Aufrufen des Dialogfelds zum Bereinigen jede zweite Zeile aus der sehr großen Tabelle entfernen und dann die .empty () aufrufen würde. Es schien jedoch zu funktionieren. Es scheint, dass meine alte Version von JQuery mit so großen Elementen nicht umgehen kann.

0
dev4life