Johannes Vogel: JS-Zugriff auf Array-Formfeld ergibt undefined object

Hi Leute

Folgendes Problem lässt sich von mir einfach nicht selbst lösen.
Per PHP generiere ich ein umfangreiches Eingabeformular, welches u.a. auch ein oder mehrere Datumsfeld(er) beinhaltet. Um diese darzustellen, verwende ich zwei PullDown-Listen (Tage/Monate) und ein Text-Eingabefeld für das Jahr. Zusätzlich möchte ich gerne das vollständige Datum in der ISO-Form YYYY-MM-DD in einem hidden-Feld speichern. Dieses wird dann auch wieder ins PHP-Script zurückgegeben und weiter verarbeitet. Ein Bild, um sich alles vorstellen zu können, liegt bei.

Nun möchte ich, um falsche Daten im Vornherein abwenden zu können, die Tag-Liste dynamisch erweitern und kürzen. Dazu verwende ich das abgeänderte Beispiel aus SelfHTML. Problematisch dabei ist aber, dass ich Arrays für die Definition der Formularfelder benutze. Diese benötige ich einerseits, um auch mehrere Datum-Felder in einem Formular auseinander halten zu können, andererseits erleichtert dies die Datenübergabe zu PHP enorm. Leider werden aber diese Arrays von JavaScript nicht erkannt. Es tritt bei der Änderung eines Feldes in IE (6) wie auch im Netscape (7) der Fehler "DayObjValues ist undefiniert" (Monatsfeld) oder auch "ObjValues ist undefiniert" (Day-Feld) auf.

<form name="mypage" action="mypage.php" method="post">
<input type="hidden" name="ObjValues[54]" value="" />
<select name="DayObjValues[54]" size="1" onchange="
/* update des übergabefeldes */
ObjValues[54].value = YearObjValues[54].value+'-'+MonthObjValues[54].value+'-'+DayObjValues[54].value;">
 <option value="0"></option>
 <option value="1">1</option>
 :        :        :        :
 <option value="31">31</option>
</select>
<select name="MonthObjValues[54]" size="1" onchange="
 /* einige vereinfachungen */
 dobj=DayObjValues[54];
 m=MonthObjValues[54].options[MonthObjValues[54].selectedIndex].value;
 y = YearObjValues[54].value;
 /* prüfe anzahl tage der monat hat */
 if (m==2) { d = ((y/4==Math.floor(y/4)) && (y/100!=Math.floor(y/100)) || (y/400==Math.floor(y/400))) ? 29 : 28; }
 else { d = ((m<=7 && m/2!=Math.floor(m/2)) || (m>=8 && m/2==Math.floor(m/2))) ? 31 : 30; }
 /* ändere die anzahl felder der tag-box */
if (dobj.length < d) { for (i = dobj.length+1; i<=d; i++) dobj.options[dobj.length] = new Option(i,i,false,false); }
 else { for (i = dobj.length; i>d; i--) dobj.options[dobj.length-1] = null; }
 /* update des übergabefeldes */
 ObjValues[54].value = YearObjValues[54].value+'-'+MonthObjValues[54].value+'-'+DayObjValues[54].value;">
 <option value="0"></option>
 <option value="1">Januar</option>
 :       :         :      :      :
 <option value="12">Dezember</option>
</select>
<input type="text" name="YearObjValues[54]" value="" size="4" onchange="(((gleich wie MonthObjValues[54].onchange)))" />
</form>

Vielen Dank für jegliche Hilfe (oder aufmunternde Worte :)
Johannes Vogel

  1. Hallo,

    1. was ist das für ein kuddelmuddel? bitte mal js in funktionen stecken, trägt zur übersichtlichkeit bei...
    2. wenn du so abfragst -->MonthObjValues[54] erwartet js natürlich einen array, aber es ist keiner
    probier mal so:
    document.form.elements["MonthObjValues[54]"].value
    3. du hast php zur verfügung und verläßt dich hier auf js...das sollte man auf keinen fall tun, keine lebenswichtigen überprüfungen in js, mach das lieber per php...

    Odium

    1. Hi Odium

      Vielen Dank für deine Antwort!

      1. was ist das für ein kuddelmuddel? bitte mal js in funktionen stecken, trägt zur übersichtlichkeit bei...

      Ich wollte Fehlerquellen ausschliessen... Natürlich sieht das in echt wirklich alles sehr übersichtlich aus.. :)

      1. wenn du so abfragst -->MonthObjValues[54] erwartet js natürlich einen array, aber es ist keiner
        probier mal so:
        document.form.elements["MonthObjValues[54]"].value

      War wohl gestern doch etwas müder, als ich es mir eingestand. Es funktioniert nun tatsächlich mit dem DOM-Prinzip. Ich Day.., Month.. und Year.. statt via name mit id referenziert und mittels getElementByID('MonthObjValues[54]').value darauf zugegriffen. Und siehe da, IE 6 zumindest kapiert's! :-)
      document.form.elements existiert übrigens laut IE JS nicht...

      1. du hast php zur verfügung und verläßt dich hier auf js...das sollte man auf keinen fall tun, keine lebenswichtigen überprüfungen in js, mach das lieber per php...

      Nein. Das ist was für den Design Layer. Lebenswichtig ist diese Abfrage natürlich nicht, sondern soll ausschliesslich das Handling erleichtern. Natürlich wird der Wert nach Übergabe nochmals mittels PHP überprüft. Meine Erfahrung zeigt aber, dass gerade beim Datumsformat extrem viele Fehleingaben auftreten. Diese möchte ich elminieren.

      Vielen Dank für deine Hilfe, sie hat mir trotzdem sehr geholfen!
      Johannes