JS-Noob: document.forms ist undefined

Hallo,

ich weiß nicht, wie ichs schreiben muß.

Bisher

document.forms['sp_anl']

Aber nun möchte ich den Formularnamen der funktion als parameter übergeben.

function nimm_formular_entgegen(a,b,c) {

wobei c den Namen des Formulares enthält.

Über alert ('Variable: '+c); wird mir der Name auch korrekt ausgegeben.

Aber ich kenne die Schreibweise von document.forms nicht :-(

document.forms[e] ist jedenfalls _undefined_
document.forms['e'] auch,
document.forms['+e+'] auch,
document.forms[''+e+''] auch.

Wie schreibe ich das denn nun  korrekt?

Grüße,JS

  1. document.forms[e] ist jedenfalls _undefined_
    document.forms['e'] auch,
    document.forms['+e+'] auch,
    document.forms[''+e+''] auch.

    Hier oben meinte ich natürlich jeweils [c] anstelle [e] usw.

    Ich war etwas durcheinander, weil ich zuvor stundenlang den Formularnamen als Parameter "e" weitergegeben hatte.

    Grüße, JS

  2. Hi,

    Aber ich kenne die Schreibweise von document.forms nicht :-(

    Aber du hast wengistens mal Lesen gelernt ...?

    Spitze, hier entlang: http://de.selfhtml.org/javascript/objekte/forms.htm#allgemeines

    Wie schreibe ich das denn nun  korrekt?

    Was das Problem ist bzw. was du falsch machst, ist aus dem bisschen Code nicht ersichtlich.
    </hilfe/charta.htm#tipps-fuer-fragende>

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Wie schreibe ich das denn nun  korrekt?

      Was das Problem ist bzw. was du falsch machst, ist aus dem bisschen Code nicht ersichtlich.

      Hallo Chris,

      Du hast Dir ganz offensichtlich nicht die Zeit genommen, mein Post zu lesen, respektive zu verstehen.

      Es steht sehr genau darin, was meinProblem ist.

      Der Formularname steht in der Variablen "c".

      Und ich weiß nicht, wie ich das, was noch mit der Formulierung

      document.forms['sp_anl']

      wunderbar funktioniert hat, nun formulieren muss, nachdem z.b. der String "sp_anl" per Parameter (nämlich c) übergeben wurde.

      Ich schrieb auch, was ich alles schon versucht habe und was jeweils undefined war.

      Es ist also offensichtlich, was mein Problem hierbei ist.

      Aber du hast wengistens mal Lesen gelernt ...?

      Somit gebe ich diese Frage gerne an Dich zurück, verbunden mnit der Bitte, Dich nachfolgend aus diesem Themenstrag herauszuhalten.

      Danke für Dein Verständniss

      JS

      1. Hi,

        Es steht sehr genau darin, was meinProblem ist.

        Und ich habe dir sehr deutlich geschrieben, dass dein Problem auf Basis der gelieferten Information nicht nachvollziehbar ist.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Hi!

    Bisher
    document.forms['sp_anl']

    Hier verwendest du einen String. Oder genauer: ein Stringliteral. Du weißt, dass man statt der Literale auch Variablen verwenden kann, denn das ist ja das A und O der programmierung, dass man sich einmal eine Strategie ausdenkt und mit unterschiedlichen Werten laufen lassen kann.

    Über alert ('Variable: '+c); wird mir der Name auch korrekt ausgegeben.

    An genau der Stelle, an der du c auch verwenden willst, also direkt vor dem document.forms[...]?

    Aber ich kenne die Schreibweise von document.forms nicht :-(

    Das hat nichts damit zu tun. Eingangs erwähnte ich ja, dass man statt Literalen auch Variablen verwenden kann. Damit ein Compiler/Parser zwischen Text und Variablennamen unterscheiden kann, gibt es Regeln. Text kommt in Anführungszeichen, Variablennamen stehen, zumindest bei Javascript, einfach so da, wobei reservierten Wörter ausgeschlossen sind.

    document.forms[c] ist jedenfalls _undefined_

    Da verwendest du die Variable c anstelle eines fest notierten Stringliterals. Das entspricht gültiger Syntax. Wo kommt denn das undefined her? Aus der Fehlerkonsole? Von einer ganz anderen Stelle?

    document.forms['c'] auch,
    document.forms['+c+'] auch,

    Stringliterale, weißt du doch, stehen in Anführungszeichen. Soll der JS-Interpreter hellsehen, dass du doch einen Variablennamen meinst? Wenn du nun sagst: PHP kann das. Jein. Das kann das nur, weil da Variablennamen zwingend noch extra mit einem $ gekennzeichnet sind. Javascript kennt solch ein eindeutiges Erkennungsmerkmal nicht, weswegen es da keine Variablennamen in Anführungszeichen geben kann.

    document.forms[''+e+''] auch.

    Das ist ungültige Syntax. Die Fehlerkonsole kennst du und hast sie offen? Sie ist wichtig, weil sie dir solche offensichtlichen Fehler anzeigt.

    Wie schreibe ich das denn nun  korrekt?

    Das solltest du nun hoffentlich wissen. Dein Fehler steckt aber irgendwo anders.

    Lo!

    1. Hi,

      document.forms[''+e+''] auch.
      Das ist ungültige Syntax.

      Warum sollte ein Leerstring, an den der Inhalt der Variable e angehängt wird, und an den anschließend noch ein Leerstring angehängt wird, nicht den Syntaxregeln entsprechen?

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    2. Hallo,

      document.forms[''+e+''] auch.
      Das ist ungültige Syntax.

      nein, das ist syntaktisch korrekt, wenn auch sinnlos. Verkette einen leeren String mit dem Inhalt von e und einem weiteren leeren String, und benutze das Ergebnis (das immer noch mit e identisch ist, sofern e ein String ist) als Index in document.forms.

      Ciao,
       Martin

      --
      Das Leben ist lebensgefährlich und endet meistens tödlich.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hi!

        document.forms[''+e+''] auch.
        Das ist ungültige Syntax.
        nein, das ist syntaktisch korrekt, wenn auch sinnlos.

        Stimmt natürlich. Da hab ich fälschlicherweise das gesamte Konstrukt als einen String angesehen und dann hätten die Maskierungen der inneren ' gefehlt.

        Da Leerstrings an Strings (Variablen oder Literale) anzuhängen am Ergebnis nichts ändert, ist diese Version gleichbedeutend zur ersten Variante.

        Lo!

        1. Hi,

          Stimmt natürlich. Da hab ich fälschlicherweise das gesamte Konstrukt als einen String angesehen und dann hätten die Maskierungen der inneren ' gefehlt.

          Da Leerstrings an Strings (Variablen oder Literale) anzuhängen am Ergebnis nichts ändert, ist diese Version gleichbedeutend zur ersten Variante.

          Wirklich? Wird bla[1] gleich behandelt wie bla["1"]?

          Sieht fast so aus:

          var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);

          ergibt zweimal def. Hm. Überrascht mich jetzt doch etwas.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. Hi,

            Wirklich? Wird bla[1] gleich behandelt wie bla["1"]?

            Sieht fast so aus:

            var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);

            ergibt zweimal def. Hm. Überrascht mich jetzt doch etwas.

            ECMA-262, 15.4 Array Objects:
            “Array objects give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to (2^32)−1.”

            Das erklärt es doch eigentlich schon, oder irre ich mich da?

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Hi,

              ECMA-262, 15.4 Array Objects:
              “Array objects give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to (2^32)−1.”

              Das erklärt es doch eigentlich schon,

              ja.

              oder irre ich mich da?

              Nein.

              Ich benutze Javascript so selten, daß ich mir da die Spezifikationen nicht wirklich genau angucke. Normalerweise bekomm ich meine Miniscripts auch ohne Spezi-Lektüre zum "funzen".

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
              1. Hi,

                Ich benutze Javascript so selten, daß ich mir da die Spezifikationen nicht wirklich genau angucke. Normalerweise bekomm ich meine Miniscripts auch ohne Spezi-Lektüre zum "funzen".

                Das geht mir ähnlich, auch wenn ich JavaScript schon öfters benutze - aber in die Tiefen der ECMAScript-Spezifikation hinrab zu steigen, ist für mich dabei auch selten „nötig“ - aber interessant ist es doch trotzdem schon ab und zu.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          2. Wird bla[1] gleich behandelt wie bla["1"]?

            Ja. array[1] ist auch nur der ganz normale Property Accessor. Alle Eigenschaftsnamen sind letztlich Strings, daher wird beim Property Access immer mit Strings gearbeitet. bla[1] wird intern zu aller erst in bla["1"] umgewandelt.
            Das gilt immer, auch für Arrays. Es gibt keine echten Arrays in JavaScript. Arrays sind lediglich Objects mit einer besonderen Bedeutung der numerischen Properties (der Link zu ChrisBs Zitat).

            var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);

            Um dich ganz zu verwirren: bla["foo"] geht auch. Weil der Array auch nur ein Object ist. Natürlich zählt diese Eigenschaft nicht als Array-Eintrag, erhöht length also nicht.

            Mathias

            1. Hi,

              Wird bla[1] gleich behandelt wie bla["1"]?

              Ja. array[1] ist auch nur der ganz normale Property Accessor. Alle Eigenschaftsnamen sind letztlich Strings, daher wird beim Property Access immer mit Strings gearbeitet. bla[1] wird intern zu aller erst in bla["1"] umgewandelt.
              Das gilt immer, auch für Arrays. Es gibt keine echten Arrays in JavaScript. Arrays sind lediglich Objects mit einer besonderen Bedeutung der numerischen Properties (der Link zu ChrisBs Zitat).

              Auch Dir danke für die Aufklärung.

              var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);

              Um dich ganz zu verwirren: bla["foo"] geht auch. Weil der Array auch nur ein Object ist. Natürlich zählt diese Eigenschaft nicht als Array-Eintrag, erhöht length also nicht.

              Das wird meine Liebe zu Javascript sicher nicht erhöhen ... ;-)

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          3. Hi!

            Da Leerstrings an Strings (Variablen oder Literale) anzuhängen am Ergebnis nichts ändert, ist diese Version gleichbedeutend zur ersten Variante.
            Wirklich? Wird bla[1] gleich behandelt wie bla["1"]?

            Das ist ein anderer Fall. Du vergleichst hier ein Zahlenliteral mit einem Stringliteral, das eine Zahl enthält. Es ging im OP um eine Variable mit einem String als Inhalt und ein Stringliteral.

            var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);
            ergibt zweimal def. Hm. Überrascht mich jetzt doch etwas.

            Und nicht nur dass, auch ist bla.length gleich 1.

            Ich weiß nicht, ob man ein Array mit document.forms vergleichen kann ... das jedenfalls ist auch interessant:

            <form name="4">...</form>

            Mit einer 4 (als String oder Zahl) jedenfalls bekommt man (ich) das Array über document.forms[...] nicht angesprochen. Aber auch das entspricht nicht dem Fall vom OP, er hat ja einen Nicht-Zahl-String als Form-Namen.

            Lo!

            1. Hi,

              Hi!

              Da Leerstrings an Strings (Variablen oder Literale) anzuhängen am Ergebnis nichts ändert, ist diese Version gleichbedeutend zur ersten Variante.
              Wirklich? Wird bla[1] gleich behandelt wie bla["1"]?

              Das ist ein anderer Fall. Du vergleichst hier ein Zahlenliteral mit einem Stringliteral, das eine Zahl enthält. Es ging im OP um eine Variable mit einem String als Inhalt und ein Stringliteral.

              Ich hab das halt etwas allgemeiner betrachtet, Du nur den Spezialfall des Users.

              var bla=Array(); bla[0]="abc"; bla["0"] = "def"; alert(bla[0]); alert(bla["0"]);
              ergibt zweimal def. Hm. Überrascht mich jetzt doch etwas.

              Und nicht nur dass, auch ist bla.length gleich 1.

              Das ist dann die logische Konsequenz, wenn bla[0] und bla["0"] gleichbehandelt werden.

              Ich weiß nicht, ob man ein Array mit document.forms vergleichen kann ... das jedenfalls ist auch interessant:

              ich auch nicht.

              <form name="4">...</form>

              für forms verwende ich normalerweise kein name-Attribut - wenn ich die form identifizierbar haben will, bekommt sie eine id.
              Kommt auch selten vor, daß mehrere form-Elemente auf einer Seite sind, so daß forms[0] auch schon ausreicht.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    3. Danke an Euch Beide, dass document.forms[c] die hier gültige Syntax für mich war und mein Fehler woanders liegen musste.

      Dadurch habe ich tatsächlich herausgefunden, dass der Fehler woanders lag und konnte ihn beheben. Die Variable C war an der Stelle, wo sie gebraucht wurde, leer, dadurch war dann auch obiger Ausdruck undefined.

      Danke fürs Mitdenken an Euch Beide und für das Verstehen meines Problems bzw, meiner Frage.

      Grüße, JS-Noob

      1. Mahlzeit JS-Noob,

        Die Variable C

        ... ist eine andere als die Variable c - Dir ist bewusst, dass Javascript Wert auf Groß- und Kleinschreibung legt?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. ... ist eine andere als die Variable c - Dir ist bewusst, dass Javascript Wert auf Groß- und Kleinschreibung legt?

          Hi EKKI,

          ja doch, ist klar. Ich schlampte ein wenig ;-)

          Danke für den Hinweis.

          JS

  4. Aber ich kenne die Schreibweise von document.forms nicht :-(

    document.forms[e] ist jedenfalls _undefined_

    Das ist aber richtig - dann musst du woanders einen Fehler machen.
    Oder es gibt einfach kein Formular mit dem Namen bzw. mit dieser ID.

    Bist du dir sicher, dass das HTML-Dokument zum Zeitpunkt des Aufrufs bereits komplett geparst wurde, sodass das Formular überhaupt über das DOM ansprechbar ist?

    <!DOCTYPE html>  
    <html>  
    <head>  
    <title>Beispiel</title>  
    <script>  
    [code lang=javascript]function nimm_formular_entgegen(formularID) {  
    	var f = document.forms[formularID];  
    	f.elements[0].value = "Funktioniert!";  
    }
    

    </script>
    </head>
    <body>

    <form id="foo">
    <p><input type="text"></p>
    </form>

    <button onclick="nimm_formular_entgegen('foo')">
    nimm_formular_entgegen('foo')
    </button>

    </body>
    </html>[/code]

    Mathias