Sven Wißmann: Anfängerfehler (?) Value von Hidden Formfeldern onClick ändern

Hallo Zusammen,
ich habe eine Problem mit meinen Javascript Zeilen.
Ich habe zwar schon nach eine Lösung gesucht und auch verschiedene Ansaätze versucht - bisher jedoch ohen Erfolg.

Hier zuerst mal mein JS-Code:

function markieren(zelle, uebergabezellenid)  
{  
  
if (zelle.className!="")  
  {  
	zelle.className="";  
  } else {  
  
  
  if (document.tagesart.elements[0].checked) { zelle.className="eins"; var zellenid = "document.form_tage.elements[\"" + uebergabezellenid + "\"]"; zellenid.value = "1"; }  
  if (document.tagesart.elements[1].checked) { zelle.className="zwei";	document.form_tage.elements["uebergabezellenid"].value = "2"; }  
  if (document.tagesart.elements[2].checked) { zelle.className="drei"; 	document.form_tage.elements["uebergabezellenid"].value = "3"; }  
  
  }  
  
  
}

Das Script ändert zum einen die Hintergrundfarbe der angeklickten Zelle (über die Klasse) - was auch funktioniert. Auf der anderen Seite ist jeder Zelle ein Hidden elemt zugeordnet welches eine id hat die aus PHP erzeugt wird.

Zur veranschauung hier ein Ausschnitt aus dem Aufruf:

<td  
   	   bgcolor='#e0ffff' onclick='markieren(this,1246921200)'>07<input type='hidden' name="1246921200" value = '0'></td>

Leider funktioniert der Code auf diesem Wege nicht. Je nach dem wie ich ihn umstelle (im ersten Code sieht man auch einen Versuch) funktioniert er im FF aber nicht im IE. Wenn ich ein Hidden-Feld erstelle und es so benenne wie die Variable (uebergabezellenid), dann wird dort die Änderung sofort wirksam. Ich vermute also, dass der Fehler darin liegt ob JS erkennt, dass es sich um eine Variable handelt.

Rufe ich die Felder über elements[2] also über die Nummer statt den Namen auf funktioniert das ganze. Das ist bei einer durch PHP erzeugten Website aber ziemlich unberechenbar ;-)

Würde mich freuen, wenn Ihr mir helfen könnt.

LG

  1. if (document.tagesart.elements[0].checked) { zelle.className="eins"; var zellenid = "document.form_tage.elements["" + uebergabezellenid + ""]"; zellenid.value = "1"; }

    Dei Zugriff auf die Formularelemente ist falsch. http://de.selfhtml.org/javascript/objekte/elements.htm

    Struppi.

    1. if (document.tagesart.elements[0].checked) { zelle.className="eins"; var zellenid = "document.form_tage.elements["" + uebergabezellenid + ""]"; zellenid.value = "1"; }

      Dei Zugriff auf die Formularelemente ist falsch. http://de.selfhtml.org/javascript/objekte/elements.htm

      Struppi.

      Wie gesagt, die erste Zeile war nur ein Versuch, aber die anderen beiden Zeilen

        
      document.form_tage.elements["uebergabezellenid"].value = "2";  
      
      

      funktionieren auch nicht.

      Ich habe es zwischenzeitlich noch mal mit der exakten Umsetzung der Anleitung versucht, also ~~~javascript document.forms["Testformular"].elements["Eingabe"].value = "Unsinn";

        
      Was in meinem Script dann  
        
      ~~~javascript
      document.forms["form_tage"].elements[" uebergabezellenid "].value = "2";  
      
      

      heisst. Leider funktioniert auch das nicht...

      Auch das Element über GetElementbyID zu kriegen also quasi so :
      document.getElementById("uebergabezellenid").value = "1";
      War nicht von Erfolg gekrönt. Bei den Form Elements habe ich natürlich vorher die ID entsprechend angelegt.

      Würde mich also sehr freuen, wenn noch mal jemand einen Tipp hat ;)

      1. Dei Zugriff auf die Formularelemente ist falsch. http://de.selfhtml.org/javascript/objekte/elements.htm

        Struppi.

        Bitte kein Fullquote, Danke.

        Wie gesagt, die erste Zeile war nur ein Versuch, aber die anderen beiden Zeilen

        document.form_tage.elements["uebergabezellenid"].value = "2";

        
        >   
        > funktionieren auch nicht.  
          
        Das funktioniert, wenn es das Element, mit dem Namen gibt - Name! Nicht ID.  
          
        
        > Würde mich also sehr freuen, wenn noch mal jemand einen Tipp hat ;)  
          
        Solche Fehler stehen in der Fehlerkonsole.  
          
        Struppi.
        
        1. Dei Zugriff auf die Formularelemente ist falsch. http://de.selfhtml.org/javascript/objekte/elements.htm

          Struppi.

          Bitte kein Fullquote, Danke.

          Wie gesagt, die erste Zeile war nur ein Versuch, aber die anderen beiden Zeilen

          document.form_tage.elements["uebergabezellenid"].value = "2";

          
          > >   
          > > funktionieren auch nicht.  
          >   
          > Das funktioniert, wenn es das Element, mit dem Namen gibt - Name! Nicht ID.  
          >   
          > > Würde mich also sehr freuen, wenn noch mal jemand einen Tipp hat ;)  
          >   
          > Solche Fehler stehen in der Fehlerkonsole.  
            
          Leider nein, ausser bei den GetElementByID versuchen und den falschen Leerzeichen ist die fehlerkonsole leer geblieben.  
            
          
          >   
          > Struppi.  
            
            
          Im Firefox läuft es jetzt - aber durch eine unschöne Lösung :  
            
          `eval("document.forms['form_tage'].elements[" + uebergabezellenid + "].value = '2'");`{:.language-javascript}  
            
          Aber wie gesagt nur im FF..  
          Ich nehme an, dass JS irgendwie nicht erkennt, dass uebergabezellenid nicht der Name des Elements sondern eben eine Variable ist.  
            
            
            
          Hier der HTML Code:  
            
          ~~~html
            
          <form name='form_tage' action='time_control.php' method='post'>  
          <table>  
            <tr>  
             <td>Jan</td><td  
             	   bgcolor='#e0ffff' onclick='markieren(this,1230764400)'>01<input type='text' name="1230764400" value = '0'></td><td  
             	   bgcolor='#e0ffff' onclick='markieren(this,1230850800)'>02<input type='text' name="1230850800" value = '0'></td><td  
             	   bgcolor='#cd5c5c' onclick='markieren(this,1230937200)'>03<input type='text' name="1230937200" value = '0'></td><td  
             	   bgcolor='#cd5c5c' onclick='markieren(this,1231023600)'>04<input type='text' name="1231023600" value = '0'></td><td  
             	   bgcolor='#e0ffff' onclick='markieren(this,1231110000)'>05<input type='text' name="1231110000" value = '0'></td></tr></table>  
            
             	   <input type=submit value = 'Testen'></form>
          
          1. Hallo,

            Struppi hat dich doch schon freundlich gebeten:

            Bitte kein Fullquote, Danke.

            Solche Fehler stehen in der Fehlerkonsole.
            Leider nein, ausser bei den GetElementByID versuchen und den falschen Leerzeichen ist die fehlerkonsole leer geblieben.

            Das überrascht mich aber sehr!

            eval("document.forms['form_tage'].elements[" + uebergabezellenid + "].value = '2'");

            Autsch. Nein, es ist ganz sicher nicht nötig, hier eval() zu verwenden.

            Ich nehme an, dass JS irgendwie nicht erkennt, dass uebergabezellenid nicht der Name des Elements sondern eben eine Variable ist.

            Dann solltest du das auch als Variable benutzen, nicht als Stringkonstante.

            <form name='form_tage' action='time_control.php' method='post'>

            <table>
              <tr>
               <td>Jan</td><td
                   bgcolor='#e0ffff' onclick='markieren(this,1230764400)'>01<input type='text' name="1230764400" value = '0'></td><td
                   bgcolor='#e0ffff' onclick='markieren(this,1230850800)'>02<input type='text' name="1230850800" value = '0'></td><td
                   bgcolor='#cd5c5c' onclick='markieren(this,1230937200)'>03<input type='text' name="1230937200" value = '0'></td><td
                   bgcolor='#cd5c5c' onclick='markieren(this,1231023600)'>04<input type='text' name="1231023600" value = '0'></td><td
                   bgcolor='#e0ffff' onclick='markieren(this,1231110000)'>05<input type='text' name="1231110000" value = '0'></td></tr></table>

            <input type=submit value = 'Testen'></form>

              
            Prima. Der Zugriff auf die Eingabefelder wäre also möglich mit ...  
              
             document.form\_tage.1230764400  
              
            .. wenn, ja wenn Bezeichner in Javascript mit einer Ziffer beginnen dürften. Dürfen sie aber nicht, also kommt nur die alternative Form in Frage:  
              
             document.form\_tage.elements["1230764400"]  
              
            Wenn du nun noch den konstanten String "1230764400" durch eine Variable ersetzt (nicht durch eine andere Stringkonstante!), bist du doch schon am Ziel.  
              
            Nebenbei: In HTML müssen name- und id-Attribute mit einem Buchstaben beginnen! Deine rein numerischen name-Werte sind also an sich schon ungültig. Dass manche Browser trotzdem damit umgehen können, ist vielleicht schön, aber nicht selbstverständlich.  
              
            So long,  
             Martin  
            
            -- 
            Zwischen Leber und Milz  
            passt immer noch'n Pils.  
            
            
            1. Bitte kein Fullquote, Danke.

              Ok, habs jetzt verstanden - Sorry !

              Solche Fehler stehen in der Fehlerkonsole.

              Habe das Script ein wenig umgestellt und die Namenskonventionen eingehalten. Die HTML Aufrufe sehen jetzt beispielsweise so aus:

              <td bgcolor='#cd5c5c' onclick='markieren(this,"zid1237071600")'>15<input type='text' name="zid1237071600" value = '0'></td>

              Jetzt erhalte ich in der Fehlerkonsole auch eine entsprechende Meldung.
              Fehler: document.form_tage.elements.uebergabezellenid is undefined

              Dann solltest du das auch als Variable benutzen, nicht als Stringkonstante.

              Wahrscheinlich eine dumme Frage, aber wie? Ich habe beim Googlen zwar rausgefunden, das Konstanten nicht mehr verändert werden und das Variablen über var lokal definiert werden können. Mir ist aber nicht klar wie ich einen Wert der ja schon im Kopf der Funktion übergeben wird zu einer Variablen mache.

              Danke nochmal für die ganzen Versuche mir bei meinen Denkfehlern zu helfen ;-)

              1. @Struppi - Ja, du hast recht, die Überabe war vorher nur eine Zahl, deswegen habe ich es wie von Martin beschrieben geändert.

                Der Ganz Programmcode funktioniert jetzt auch in beiden Browsern. Allerdings nur dann wenn ich eval benutze - was ich eigentlich vermeiden möchte. Ich denke mal, dass ich irgendwo noch einen Fehler mache...

                  
                function markieren(zelle,uebergabezellenid)  
                {  
                  
                if (zelle.className!="")  
                  {  
                	zelle.className="";  
                  } else {  
                  
                  if (document.tagesart.elements[0].checked) { zelle.className="anwesend"; 	eval("document.form_tage.elements[\"" + uebergabezellenid + "\"].value = \"1\""); }  
                  if (document.tagesart.elements[1].checked) { zelle.className="urlaub";	eval("document.form_tage.elements[\"" + uebergabezellenid + "\"].value = \"2\""); }  
                  if (document.tagesart.elements[2].checked) { zelle.className="krank"; 	eval("document.form_tage.elements[\"" + uebergabezellenid + "\"].value = \"3\""); }  
                  
                  }  
                }  
                
                
                1. Der Ganz Programmcode funktioniert jetzt auch in beiden Browsern. Allerdings nur dann wenn ich eval benutze - was ich eigentlich vermeiden möchte. Ich denke mal, dass ich irgendwo noch einen Fehler mache...

                  Ja, nur wo?

                  document.form_tage.elements[uebergabezellenid].value = 1;

                  sollte, soweit ich das verfolgt habe, funktionieren.

                  Struppi.

              2. Hallo,

                Dann solltest du das auch als Variable benutzen, nicht als Stringkonstante.
                Wahrscheinlich eine dumme Frage, aber wie?

                aus deinem Eröffnungsposting:

                document.form_tage.elements["uebergabezellenid"].value = "2";

                Hier benutzt du eine Stringkonstante, nämlich "uebergabezellenid", als Index (bzw. als Feldname). Warum? Du wolltest doch einfach die Variable uebergabezellenid verwenden, oder nicht? Dann tu das doch einfach.

                Ich habe beim Googlen zwar rausgefunden, das Konstanten nicht mehr verändert werden und das Variablen über var lokal definiert werden können.

                Das ist eine eher formale Betrachtung, ja. Mir ging es um die Notation.

                Danke nochmal für die ganzen Versuche mir bei meinen Denkfehlern zu helfen ;-)

                Ich hoffe, der Knoten geht irgendwann auch auf.

                Ciao,
                 Martin

                --
                Wer im Glashaus sitzt, sollte sich nur im Dunkeln ausziehen.
            2. Hi,

              Nebenbei: In HTML müssen name- und id-Attribute mit einem Buchstaben beginnen!

              Bei id-Attributen stimme ich sofort zu. Bei name-Attributen nicht, außer beim meta-Element.

              cu,
              Andreas

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

                Nebenbei: In HTML müssen name- und id-Attribute mit einem Buchstaben beginnen!
                Bei id-Attributen stimme ich sofort zu. Bei name-Attributen nicht, außer beim meta-Element.

                Die Spezifikation sagt es ausdrücklich:

                "ID and NAME tokens must begin with a letter ([A-Za-z]) ..."

                Schönen Abend noch,
                 Martin

                --
                Was du heute kannst besorgen,
                das geht sicher auch noch morgen.
                1. Hi,

                  Nebenbei: In HTML müssen name- und id-Attribute mit einem Buchstaben beginnen!
                  Bei id-Attributen stimme ich sofort zu. Bei name-Attributen nicht, außer beim meta-Element.

                  Die Spezifikation sagt es ausdrücklich:

                  "ID and NAME tokens must begin with a letter ([A-Za-z]) ..."

                  Das sagt, daß ID- und NAME-Tokens nicht mit einer Ziffer beginnen dürfen.
                  Der Wert der name-Attribute (außer beim meta-Element) sind aber weder ID- noch NAME-token.

                  cu,
                  Andreas

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

                    Der Wert der name-Attribute (außer beim meta-Element) sind aber weder ID- noch NAME-token.

                    Muß natürlich "Die Werte" heißen am Satzanfang ...

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    O o ostern ...
                    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          2. Ich nehme an, dass JS irgendwie nicht erkennt, dass uebergabezellenid nicht der Name des Elements sondern eben eine Variable ist.

            Nein, es ist eine Zahl.
            Laß dir den Wert doch mal ausgeben.

            Struppi.

      2. Hallo,

        document.form_tage.elements["uebergabezellenid"].value = "2";

        gibt es denn ein Formular mit dem Namen "form_tage"? Und enthält das ein Element mit dem Namen "uebergabezellenid"?

        document.forms["form_tage"].elements[" uebergabezellenid "].value = "2";

        Das wird nichts werden, wenn du Leerzeichen im Namen hast.

        Auch das Element über GetElementbyID zu kriegen also quasi so :
        document.getElementById("uebergabezellenid").value = "1";
        War nicht von Erfolg gekrönt. Bei den Form Elements habe ich natürlich vorher die ID entsprechend angelegt.

        Dann zeig mal bitte das HTML dazu, sonst stochern wir doch nur im Nebel.

        Ciao,
         Martin

        --
        Theorie ist, wenn jeder weiß, wie's geht, und es geht trotzdem nicht.
        Praxis ist, wenn's geht, und keiner weiß warum.
        Bei uns sind Theorie und Praxis vereint: Nichts geht, und keiner weiß warum.