ChrisB: Objekte werden nicht in Array gehalten

Beitrag lesen

Hi,

Jedoch "verschwinden" die Objekte noch während des ersten Schleifendurchlaufs aus dem Array.. gehen einfach verloren.

Nein, das tun sie ganz und gar nicht.

Aber wenn du hier

var dateObjs = [];  
    for (i = 0; i < form.elements.length; i++) {  
        if (form.elements[i].tagName == "INPUT" &&  
            form.elements[i].type == "text")  
            dateObjs[dateObjs.length] = new dateObj(form.elements[i]);  
    }  
  
    for (j = 0; j < dateObjs.length; j++) {  
        dateObjs[j].analyzeInput();  
        if (dateObjs[j].isString) for (j = 0; j < dateObjs.length; j++)  
            dateObjs[j].validateString();  
        if (dateObjs[j].error)  
            alert(dateObjs[j].errorMsg);  
    } 

mal im Firebug den Wert der Zaehlervariablen j deiner zweiten for-Schleife beobachtest, dann siehst du, dass du mit der "ploetzlich" den Bereich verlaesst, in dem sie laufen *sollte*.

Und das ist ja auch kein Wunder, weil du in der validateString-Methode deines dateObj-Objekte ihren Wert ueberschreibst:

    // Prüft, ob die Eingabe einem der Schlüsselwörter entspricht  
    this.validateString = function() {  
        if (this.isString && !this.isValidated) {  
            for (i = 0; i < keywords.length; i++) {  
                for (j = 0; j < keywords[i].length; j++) {  
                  //...

Da benutzt du ebenfalls eine Variable namens j - und da beide global sind, ueberschreibt dir "dieses" j hier dein "anderes" j aus der anderen Schleife - womit du dort bei der Rueckkehr aus dieser Methode natuerlich einen Fehler erzeugst, denn das Array, auf das dort mit dem Index j zugegriffen werden soll, hat gar nicht so viele Elemente.

Einfache Loesung: Verwende keine globalen (Zaehler-)Variablen, sondern lokale.

In einer For-Schleife erreichst du das ganz leicht, dass die Zaehlervariable nur lokale Gueltigkeit hat, in dem du dort das Schluesselwort var voranstellst:

for (var j = 0; j < dateObjs.length; j++) { ... }  
  
for (var j = 0; j < keywords[i].length; j++) { ... }

MfG ChrisB

--
„This is the author's opinion, not necessarily that of Starbucks.“