• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Array undefined: Lösungsaufgabe funktioniert, aber ich kann Unterschied nicht sehen.

Bas

New member
Hiho!

Z. Z. Arbeite ich ein JS-Tutorial durch.

Nun habe ich eine Aufgabe durchgeführt, die bei mir aber leider nicht klappt. Beim Quelltext der Website (kopiert) aber schon - Allerdings kann ich nicht feststellen, WARUM mein Kode nicht funktioniert.

Das Ganze scheint bei mir schon daran liegen, dass entweder nichts in meinem Array steht oder ich es nicht vernünftig schaffe auszulesen.

Meins:
HTML:
<script  language="JavaScript" type="text/javascript">
function Einband(pFarbe, pArt)
{
   this.Farbe  = pFarbe;
   this.Art    = pArt;
}



function Buch(pTitel, pVerlag, pSeiten, pFarbe, pArt)
{
   this.Titel       = pTitel;
   this.Verlag      = pVerlag;
   this.Seiten      = pSeiten;
   this.Einband     = new Einband(pFarbe, pArt);
}


function hinzufuegen(pTitel, pVerlag, pSeiten, pFarbe, pArt)
{
   this[this.length] = new Buch(pTitel, pVerlag, pSeiten, pFarbe, pArt);
}

meineBuecher.hinzufuegen = hinzufuegen;//("pTitasdel", "pVerlag", "pSeiten", "pFarbe", "pArt");



      meineBuecher.hinzufuegen("JavaScript Workshop",
                  "Addison-Wesley", 300,
                  "gelb", "Taschenbuch");
      meineBuecher.hinzufuegen("JavaScript 1.2",
                  "Addison-Wesley", 500,
                  "weiß", "gebunden");

for (var i = 0; i < meineBuecher.lenght; i++)
{

document.writeln('Das Buch "'+meineBuecher[i].Titel+'" ');
}
Meine Schleife wird nicht durchlaufen, meine.Buecher.lenght ist "undefined".

Lösung:
HTML:
<!--
/* * * Vorbereitende Funktionen * * */
// Konstruktorfunktion fuer Einbaende
function Einband(pFarbe, pArt)
{
   this.Farbe  = pFarbe;
   this.Art    = pArt;
}
// Konstruktorfunktion fuer Buecher
function Buch(pTitel, pVerlag, pSeiten, pFarbe, pArt)
{
   this.Titel       = pTitel;
   this.Verlag      = pVerlag;
   this.Seiten      = pSeiten;
   this.Einband     = new Einband(pFarbe, pArt);
}
// fuegt als Methode einer Liste von Buechern neue hinzu
function hinzufuegen(pTitel, pVerlag, pSeiten, pFarbe, pArt)
{
   this[this.length] = new Buch(pTitel, pVerlag,
                           pSeiten, pFarbe, pArt);
}
/* * * Beginn der Abarbeitung * * */
// erst mal nachsehen, ob der Browser Arrays kennt
if (window.Array)
{
   // eine "Liste" fuer all meine Buecher anlegen
   meineBuecher = new Array();
   // Methode fuer das Hinzufuegen definieren
   meineBuecher.hinzufuegen = hinzufuegen;
   // einzelne Buecher eintragen
   // hier muss ich spaeter neue einfuegen
   with (meineBuecher)
   {
      hinzufuegen("JavaScript Workshop",
                  "Addison-Wesley", 300,
                  "gelb", "Taschenbuch");
      hinzufuegen("JavaScript 1.2",
                  "Addison-Wesley", 500,
                  "weiß", "gebunden");
   }
}
else
  // zum Abschluss noch der Hinweis
  // fuer Leute mit aelteren Browsern:
  alert('Ihr Browser ist recht alt, kennt kein Array!');
// -->
</script>    
</head>
<body>
<h1>Alle meine Bücher</h1>
<script language="JavaScript" type="text/javascript">
<!--
// diese Funktion generiert eine Auflistung aller Buecher
document.write(meineBuecher.length);
function zeigeBuecher()
{
   var Aus = '<ol>';
   for (var i = 0; i < meineBuecher.length; i++)
   {
       document.write("test");
      Aus += '<li>' + meineBuecher[i].Titel;
      Aus += '<ul>';
      Aus += '<li>' + meineBuecher[i].Verlag + '</li>';
      Aus += '<li>ca. : ' + meineBuecher[i].Seiten;
      Aus += ' Seiten</li>';
      Aus += '<li>' + meineBuecher[i].Einband.Art + '\/';
      Aus += meineBuecher[i].Einband.Farbe + '</li>';
      Aus += '</ul>';
   }
   Aus+= '</ol>\n';
   Aus+= '<p>Ich besitze ';
   Aus += meineBuecher.length + ' Bücher.</p>';
   return Aus;
}
// existiert meineBuecher ueberhaupt?
if (window.meineBuecher)
   var Ausgabe = zeigeBuecher();

document.writeln(Ausgabe);
 
du hast vergessen die Variable meineBuecher zu initialisieren.

Allerdings muß ich zugeben, daß die Funktion hinzufuegen() eine ziemlich fragile Konstruktion ist (ein this, das keine offensichtlich Zuordnung hat, so wie man es eigentlich von einer Objektmethode erwartet, dazu eine Property (length) die nirgendwo referenziert ist).
 
meine.Buecher.lenght ist "undefined".
Zusätzlich heißt es meineBuecher.length.

PS: das Tutorial ist anscheinend nicht wirklich aktuell... so ist z.B. das language-Attribut schon länger veraltet -> weg damit.
PPS: hab' gerade noch mal genauer hingesehen - die "Lösung" ist ja echt grottig: document.write (nein hesst - ich werde nicht diskutieren), with, prüfen ob window.Array existiert (welcher Browser konnte denn JS ohne Array?), das sehr seltsame Konstrukt mit hinzufuegen, das Dormilich schon angesprochen hat, HTML-Kommentare im JS (will wirklich noch jemand den Mosaic unterstützen), schlechte if-Blocks (Ausgabe wird auch ausgegeben, wenn meineBuecher nicht existiert - dann eben mit "undefined"...), inkonsistente Namenskonvention, der Array-Konstruktor (nein hesst - auch darüber diskutier ich hier nicht mit dir), unnötige globale Variablen. Fazit: such dir ein neues Tutorial.
 
Zurück
Oben