Objekte werden nicht in Array gehalten
BenediktS
- javascript
Hallo zusammen,
ich möchte ein paar Input-Elemente anhand bestimmter Regeln überprüfen und habe zu diesem Zweck eine dateObj-"Klasse", anhand derer jedes Element überprüft wird. Gesteuert wird das Ganze von einer Funktion "checkDate".
Initialisiere ich nun jedes Objekt "von Hand" und rufe die Methoden ebenso einzeln "von Hand" auf, funktioniert alles einwandfrei. Da jedoch die Anzahl der zu prüfenden Elemente variabel sein wird, will ich mein Skript dahingehend erweitern, dass die Elemente in einem Array abgelegt sind und dann eine Schleife für mich die Arbeit macht.
Jedoch "verschwinden" die Objekte noch während des ersten Schleifendurchlaufs aus dem Array.. gehen einfach verloren. Jemand eine Idee?
Code @ nopaste: http://paste.nn-d.de/798
So long,
Benedikt
P.S.: Ich arbeite zum ersten Mal auf objektorientierter Basis mit JS.. Tipps nehme ich freudig entgegen ;)
Hi,
Code @ nopaste: http://paste.nn-d.de/798
Bitte poste relevante Code-Teile hier - ansonsten ist die Diskussion im Archiv spaeter nicht mehr nachvollziehbar, wenn das Beispiel auf der Fremdseite mal entfernt wird.
MfG ChrisB
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
Danke für deine sehr schnelle und kompetente Antwort. Dass der Fehler solch trivialer Natur ist, hatte ich zwar nicht erwartet, jedoch kann ich damit leben.. :)
Ich ging bisher davon aus, dass bei JS im Schleifenkopf definierte Variablen immer lokal sind.
So long,
Benedikt
P.S.: Wollte kein Fullquote machen + da ich bei JS immer der Meinung bin, der Fehler kann überall seine Ursache haben, hab ichs ge-nopaste'd. Aber gut, beim nächsten mal mach ichs besser :)