the stell: Mein while-Counter wird verweigert!

Hi,
ich glaube ich werd noch wahnsinnig mit JavaScript. Ich fange gerade mit JavaScript an und wollte mein neuen Kenntnisse mal testen.

Gut, ich schreibe ein Script mit dem man Elemente, Attribute, Werte und Text nach DOM-Syntax einfügen kann. Da ja ein Element mehrere Attribute haben kann, gebe ich einfach dem Anwender die Möglichkeit mit einem Plus-Symbol noch weitere Eingabefelder für weitere Attribute zu erstellen.

Da alle die Eingabefelder für alle Attribute und nicht nur für das Erste ausgelesen und ausgeführt werden müssen, wird mit einer 'while'-Schleife (die 'for'-Schleife ist mir persönlich unsympathisch) auf alle Felder zugegriffen. Dazu bracht man natürlich einen Counter. Und diesen Counter verwende ich auch gleich als Zahl zwischen den eckigen Klammern beim 'get'-ten übern 'TagName'. Das funktioniert beim ersten Mal, wo dies verwendet wird, ganz gut. Doch beim zweiten Mal gibt der Validator immer folgendes aus: ''document.getElementByTagName(...)[...].value' is null or not an object'.

Ich habe herumprobiert und herausgefunden, dass es geht, wenn nicht der gleiche Counter, wie in der Schleife benutzt wird. Doch ich will keinen eigenen Counter benutzen, denn es muss ja so auch gehen. Die Frage ist nur: Wie? Und diese Frage geb' ich an euch weiter, weil ich echt keine Ahnung habe.

Hier geht's zum Bsp.

thx im vorraus.
lg stell

  1. Hi,

    Da alle die Eingabefelder für alle Attribute und nicht nur für das Erste ausgelesen und ausgeführt werden müssen, wird mit einer 'while'-Schleife (die 'for'-Schleife ist mir persönlich unsympathisch) auf alle Felder zugegriffen.

    Grundsaetzlich sind die gaengigen Schleifen-Konstrukte in den meisten Programmiersprachen in vielen Faellen austauschbar.

    Allerdings verstehe ich deine "Unsympathie" gegen die for-Schleife nicht.
    Wenn man eine Schleife ueber einen bestimmten nummerischen, fortlaufenden Wertebereich haben will, ist die for-Schleife i.a.R. das Mittel der Wahl, und die am besten verstaendliche Variante.

    Dazu bracht man natürlich einen Counter. Und diesen Counter verwende ich auch gleich als Zahl zwischen den eckigen Klammern beim 'get'-ten übern 'TagName'. Das funktioniert beim ersten Mal, wo dies verwendet wird, ganz gut. Doch beim zweiten Mal gibt der Validator immer folgendes aus: ''document.getElementByTagName(...)[...].value' is null or not an object'.

    Du setzt den Wert von counter schon nach dem ersten Zugriff per counter++ hoch.
    Wenn du ihn danach noch mal zum Zugriff auf getElementsByTagName(...)[counter] benutzt, ist das natuerlich nicht mehr das gleiche Element, sondern schon das naechste.

    Und nach diesem zweiten Zugriff machst du gleich noch mal counter++, setzt also den Zaehlerstand in einem Schleifendurchlauf gleich um 2 hoch.

    Ueberleg dir, ob das wirklich das ist, was du willst.

    Ich habe herumprobiert und herausgefunden, dass es geht, wenn nicht der gleiche Counter, wie in der Schleife benutzt wird. Doch ich will keinen eigenen Counter benutzen, denn es muss ja so auch gehen. Die Frage ist nur: Wie? Und diese Frage geb' ich an euch weiter, weil ich echt keine Ahnung habe.

    Und ich hab keine Ahnung, was du hier meinst.
    Wenn du einfach voellig unkommentierten Code hier ablaedst, kannst du nicht erwarten, dass jemand aus deiner nicht allzu logischen Beschreibung schlau wird.

    Ach ja, noch was: Methoden wie document.getElementsByTagName liefern eine NodeList zurueck, die "live" eventuelle Aenderungen am Dokumentbaum widerspiegelt. Man sollte solche Methoden nicht staendig wieder aufrufen, das ist nicht sonderlich performant; besser ist es, sich einmal die Referenz auf die NodeList in einer Variablen abzulegen, und dann ueber diese zuzugreifen.
    Und wenn es ganz speziell um Formularelemente geht, dann muss es nicht mal unbedingt getElementsByIrgendwas sein - dazu gibt es auch noch andere Moeglichkeiten.

    MfG ChrisB

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

      auch Hi,

      »» Dazu bracht man natürlich einen Counter. Und diesen Counter verwende ich auch gleich als Zahl zwischen den eckigen Klammern beim 'get'-ten übern 'TagName'. Das funktioniert beim ersten Mal, wo dies verwendet wird, ganz gut. Doch beim zweiten Mal gibt der Validator immer folgendes aus: ''document.getElementByTagName(...)[...].value' is null or not an object'.

      Du setzt den Wert von counter schon nach dem ersten Zugriff per counter++ hoch.
      Wenn du ihn danach noch mal zum Zugriff auf getElementsByTagName(...)[counter] benutzt, ist das natuerlich nicht mehr das gleiche Element, sondern schon das naechste.

      Das ist Absicht, weil ich ja auch einmal den Namen und einmal den Wert des Attributes auslesen will. Und diese stehen in 2 aufeinandenfolgenden Inputs.

      Und nach diesem zweiten Zugriff machst du gleich noch mal counter++, setzt also den Zaehlerstand in einem Schleifendurchlauf gleich um 2 hoch.
      Ueberleg dir, ob das wirklich das ist, was du willst.

      Ja, weil ja auch 2 inputs pro Schleifendurchlauf behandelt werden.

      »» Ich habe herumprobiert und herausgefunden, dass es geht, wenn nicht der gleiche Counter, wie in der Schleife benutzt wird. Doch ich will keinen eigenen Counter benutzen, denn es muss ja so auch gehen. Die Frage ist nur: Wie? Und diese Frage geb' ich an euch weiter, weil ich echt keine Ahnung habe.

      Und ich hab keine Ahnung, was du hier meinst.

      Ich meine, dass er die Fehlermeldung nur dann ausgibt, wenn der gleiche Counter für 'getElementsByTagName' wie für die Schleifenbedingung benutzt wird.

      Und den Quelltext habe ich auch kommentiert.

      Und wenn es ganz speziell um Formularelemente geht, dann muss es nicht mal unbedingt getElementsByIrgendwas sein - dazu gibt es auch noch andere Moeglichkeiten.

      Ja, ich wollte mich nur in diesem Script speziell mit dem allgemeinen DOM und dem node-Objekt auseinandersetzten.

      lg the stell

      1. Hi,

        Ich meine, dass er die Fehlermeldung nur dann ausgibt, wenn der gleiche Counter für 'getElementsByTagName' wie für die Schleifenbedingung benutzt wird.

        Dann laeuft dein Counter einfach zu weit.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
      2. Das ist Absicht, weil ich ja auch einmal den Namen und einmal den Wert des Attributes auslesen will. Und diese stehen in 2 aufeinandenfolgenden Inputs.

        Auch für JavaScript-generierte Inhalte gilt, dass man auf Semantik achten sollte. Ich an deiner Stelle würde eine ungeordnete Liste oder eine Definitionsliste (m.E. passend) verwenden, somit könnte ich mit einer Schleifenvariable, die von 0 bis Anzahl der Attribute-1 durchläuft, arbeiten.

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  2. Hi,
    ich habe nach noch ewigen herumprobieren die Lösung doch noch gefunden, bevor mit der Schädel geplatzt ist: Chis hatte recht:

    Dann laeuft dein Counter einfach zu weit.

    Ich habe nählich nicht daran gedacht, dass der Submit-Button auch ein Input-Element ist. Das hat gereicht, dass er den nächsten Schleifendurchlauf noch durchgeführt hat und hat dann natürlich Fehlermeldungen ausgespuckt.

    Vielen Dank, an alle die mir weitergeholfen haben wünscht...
    lg the stell