Stapelüberlauf bei Zeile 0

8

Ich habe ein Formularüberprüfungsskript, das leider kurz vor dem Absturz (IE7) die Stack overflow at line 0 Alarmbox zurückgibt und gerade IE8 stürzt ab (es funktioniert zuerst sehr langsam).

Ich habe ein jsFiddle für Ihr Testvergnügen gemacht: Ссылка Der Stapelüberlauf tritt auf, nachdem Sie einen Wert in eine Eingabe eingegeben haben Das erfordert eine Validierung und verliert dann seinen Fokus. (das E-Mail-Feld ist ajax-gesteuert, wird also dort nicht funktionieren).

Das relevante Javascript:

%Vor%

Das relevante HTML:

%Vor%

Jetzt weiß ich, dass das normalerweise auf Rekursion zurückzuführen ist, und ich verwende Rekursion in zwei Bereichen des Skripts.

Wiederkehrende Funktionsnummer 1:

%Vor%

Da der Stapelüberlauf nur auftritt, wenn Sie mit einer Eingabe interagieren, die überprüft werden muss, und die Funktion createField nur als Initialisierungsfunktion verwendet wird, glaube ich nicht, dass es sich um diese handelt.

Wiederkehrende Funktionsnummer 2:

%Vor%

Ich habe keinen Zugriff auf andere externe Programme, um diese zu debuggen (Unternehmensumgebung), kann mich jemand hier in die richtige Richtung führen?

    
George Reith 19.07.2012, 13:30
quelle

1 Antwort

12

Der Internet Explorer löst das Ereignis propertychange immer dann aus, wenn Sie jQuery als addClass oder removeClass verwenden. Der Problemcode ist hier:

%Vor%

In Ihrer Funktion toggleFlag rufen Sie jQuerys addClass und removeClass auf. Das erzeugte die unendliche Rekursionsschleife, die zu dem Stapelüberlauf führte.

Wenn Sie propertychange herausnehmen, funktioniert es sowohl im Internet Explorer als auch in allen anderen Browsern.

Arbeitsbeispiel: Ссылка

Der Grund, warum Sie dieses Problem nur bei Internet Explorer hatten, ist onpropertychange ist ein proprietäres Ereignis, das von Microsoft für Internet Explorer implementiert wird. Es ist nicht von anderen Browsern implementiert.

Debugging-Stack überläuft mit IE6-8:

Eine gute Methode, die Sie in Zukunft verwenden können, um diese Arten von Stack-Überläufen zu diagnostizieren, ist:

  1. Identifizieren Sie eine der Funktionen, die an der unendlichen Rekursionsschleife beteiligt sind. Wenn Sie mit IE6-8 ohne Debugging-Fähigkeit stecken bleiben, dann müssen Sie Warnungen in verschiedenen Funktionen platzieren, bis Sie eine endlose Schleifenfunktion finden.

  2. Platzieren Sie diese Codezeile am Anfang der Funktion:

    alert(arguments.callee.caller.toString());

Diese Warnung informiert Sie, welche Funktion die Endlosschleife aufruft. Wenn Sie dann zurückverfolgen, welche Funktionen in der unendlichen Rekursionsschleife enthalten sind, können Sie die Teile Ihres Codes isolieren, die Sie für die Ursache der Endlosschleife genau untersuchen müssen.

Natürlich, wenn Sie einen modernen Webbrowser mit geeigneten Debugging-Tools haben, ist dies nicht notwendig - Sie würden einfach durch den Code gehen.

Nebenbei bemerkt, ich fühle deine Schmerzen. Teil meiner Arbeit ist auch die Programmierung von JavaScript für Firmenkunden, wo IE6-8 oft der Browser ist, der von ihrer IT-Abteilung eingeführt wird. Keine Debug-Tools, nur Warnungen und Kommentare; nicht einmal eine Zeilennummer, mit der Sie arbeiten können, wenn Sie Stack-Überläufe beheben möchten.

    
Elliot B. 08.08.2012, 00:33
quelle