Thami: Seltsames Phänomen

Hallo,

ich habe hier etwas, das ich mir nicht erklären kann.
ich habe ein kleines Script, dass mir das Alter einer Person berechnent und das Alter in ein Verstecktes Feld schreibt.
Da es sich um mehrere Personen handelt wird der Feldname des betreffenden versteckten Feldes zusammengesetzt und der Wert mit getElementsByName gesetzt.
Wenn ich nun das Feld 'normal' anspreche mit document.anmeldung.alterK1.value
steht nichts drinnen.
document.getElementsByName('alterK1').value hat aber den korrekten Wert.

das Alert in script unten gibt alterK1/7/
aus.

Kann mir das jemand erklären?

  
  function setAlter(inVar)  
  {  
  	if (PruefeDatum(inVar.value))  
  	{  
  		kindNr = inVar.name.substr(4,1);  
  		alter = countAlter(inVar.value);  
  		feldName = 'alterK'+kindNr;  
  		document.getElementsByName(feldName).value=alter;  		  
  		alert(feldName + '/' + document.getElementsByName('alterK1').value + '/' + document.anmeldung.alterK1.value);  
  	}  
  }  

  1. Hallo,

    document.getElementsByName(feldName).value=alter;

    http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_name@title=getElementsByName gibt dir eine Liste von Elementen. Das deutet der Plural ja bereits an: getElement*s*ByName.
    name-Attribute sind nicht dokumentweit eindeutig, daher können mehrere Formularfelder (oder andere Elemente mit name-Attribut) denselben Namen tragen, was auch häufig vorkommt.

    Diese Array-artige Liste hat keine value-Eigenschaft. Du erzeugst eine solche Eigenschaft mit dieser Codezeile.

    alert(feldName + '/' + document.getElementsByName('alterK1').value + '/' + document.anmeldung.alterK1.value);

    Hier liest du die Eigenschaft, die du gerade erzeugt hast, wieder aus. Und siehe da, sie hat den Wert, den du ihr zugewiesen hast.

    Das funktioniert selbstverständlich – es ändert aber nicht den Wert des fraglichen Feldes. Du sprichst das Feld mit document.getElementsByName('alterK1') nicht an, sondern eine Liste, in dem das fragliche Feld wahrscheinlich enthalten ist.

    Du kannst dir z.B. die Anzahl aller gefundenen Felder mit dem Namen »alterK1« ausgeben lassen:
    document.getElementsByName('alterK1').length

    Und auf das erste gefundene Feld zugreifen, sofern die Liste nicht leer ist:
    document.getElementsByName('alterK1')[0]

    In solchen Fällen hilft es auch, den Rückgabewert einfach mal in eine Variable zu speichern und diesen zu Untersuchungszwecken ausgeben zu lassen. Beispielsweise auf der JavaScript-Konsole von Firebug oder dem Chrome/Safari Web Inspector. Dort kann man Objekte wie diese Listen sehr gut untersuchen und viel dabei lernen.

    Mathias

    1. Super Spitzenklasse,

      vielen Dank Mathias. Nun geht es.