Knusperklumpen: Name eines geklonten (cloneNode) Formulars ändern

Hi.

Ich habe eine Tabelle in der eine Zeile ist welche ich mittels cloneNode dupliziere und mit appendChild der Tabelle hinzufüge. Das funtioniert auch wunderbar.
Innerhalb dieser Zeile ist ein Formular welches natürlich mit kopiert wird. Wenn ich die Zeile 3 mal kopiere hab ich also dann 4 mal das Formular welches dann natürlich auch immer den gleichen Namen hat. Dadurch sind die einzelnen Formulare nicht eindeutig ansprechbar. Ich habe also versucht den Namen der Formulare zu ändern. Der Internet Explorer scheint damit aber ein Problem zu haben.
Ich habe verschiedene Dinge probiert um den Namen zu ändern aber bei allem scheitert er kläglich.

Unter folgender Adresse kann das Ganze mal angeschaut werden:
http://www.knusperklumpen.de/testtest.html

Wer sich das anschaut wird sehen, dass die ID des Forms problemlos geändert werden kann, nur beim Name gibt es halt Probleme (im IE).
Obendrein ist mir aufgefallen, dass der Firefox Probleme mit der Anordnung der Formulare innerhalb von Tabellen hat. Bei allen geklonten Zeilen verändert er den HTML-Code indem er die Form sofort wieder schließt ... das sieht man im Beispiel besser.

Danke und mfg
Knusperklumpen

  1. Hi,

    Ich habe verschiedene Dinge probiert um den Namen zu ändern aber bei allem scheitert er kläglich.

    arbeite nicht mit cloneNode, sondern erzeuge selbst die neuen Elemente.

    Obendrein ist mir aufgefallen, dass der Firefox Probleme mit der Anordnung der Formulare innerhalb von Tabellen hat.

    Nein, Firefox hat da keine Probleme, sondern Du. Dein HTML-Code ist ungültig. Anstatt ihn komplett abzulehnen, führt Firefox eine Fehlerkorrektur durch. Dass diese nicht Deinen Wünschen entsprichst, kannst Du ihm nicht anlasten - der Fehler ist Deine Schuld.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi

      arbeite nicht mit cloneNode, sondern erzeuge selbst die neuen Elemente.

      Mmh, gerade das wollte ich ja vermeiden, weil es umständlicher ist und im Falle einer Erweiterung von Inhalten auch im JS rumgefummelt werden müsste. Das cloneNode ist ja im eigentlichen auch nicht der Grund warum es nicht funktioniert ... das klappt ja alles ... nur die Namensänderung des Formulars halt nicht.

      Nein, Firefox hat da keine Probleme, sondern Du. Dein HTML-Code ist ungültig. Anstatt ihn komplett abzulehnen, führt Firefox eine Fehlerkorrektur durch. Dass diese nicht Deinen Wünschen entsprichst, kannst Du ihm nicht anlasten - der Fehler ist Deine Schuld.

      Gut, das sehe ich ein und habe es mir auch schon so gedacht ... schade nur, dass in der selfHTML-Doku bei Form folgendes steht:
      "Sie können an einer beliebigen Stelle innerhalb des Dateikörpers einer HTML-Datei ein Formular definieren."
      Das könnte durchaus etwas genauer sein!

      Danke und mfg
      Knusperklumpen

      1. Hallo Knusperklumpen,

        Dein HTML-Code ist ungültig.

        schade nur, dass in der selfHTML-Doku bei Form folgendes steht:
        "Sie können an einer beliebigen Stelle innerhalb des Dateikörpers einer HTML-Datei ein Formular definieren."
        Das könnte durchaus etwas genauer sein!

        Bitteschön, SELFHTML-HTML-Referenz: <form>

        Darf innerhalb der folgenden HTML-Elemente vorkommen:
          applet | blockquote | body | button | center | dd | del | div fieldset |
          iframe | ins | li | map | noframes | noscript | object | td | th

        Den Fehler hätte dir der Validator gezeigt.

        Grüße
         Roland

  2. hi,

    Obendrein ist mir aufgefallen, dass der Firefox Probleme mit der Anordnung der Formulare innerhalb von Tabellen hat.

    _Du_ hast das Problem - schließlich baust du FORM in einer TR ein, wo es nicht zu suchen hat.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Na gut ... ich bin ja nicht so und hab den HTML-Code mal umgebaut, so dass es jetzt valide sein sollte, zumindest was die Position der Form betrifft.
    Leider klappt das Umbennen des Formularnamens immernoch nicht ... also im IE.

    mfg
    Knusperklumpen

    1. hi,

      Leider klappt das Umbennen des Formularnamens immernoch nicht ... also im IE.

      Ich habe den Eindruck, dass dein Problem eigentlich gar nicht existent ist - der IE veräppelt dich lediglich ein wenig mit dem, was er dir bei deiner "Kontrolle" über innerHTML anzeigt.

      Lade mal deine Seite, füge ein Formular hinzu - und rufe dann in der Adresszeile
      javascript:for(i=0,c=document.forms.length;i<c;i++) alert("forms["+i+"].name = "+document.forms[i].name);
      auf - das zeigt dir den wirklichen Inhalt der name-Attribute aller im Dokument vorhandenen Formulare an.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hi ... hast recht.
        Irgendwie konnte ich mir das denken, da die Ausgabe alert(klon_form.name); ja auch schon den richtigen Namen ausgespuckt hat. Warum bringt er dann aber beim Aufruf der check-Funktion (testi) den undefined-Fehler. Da ich nämlich nicht weiß inwieweit noch andere Formulare in dem zukünftigen Dokument vorkommen will bzw. muss ich sie über ihre Namen ansprechen und nicht über die internen Indizes.

        Danke
        Knusperklumpen

        1. hi,

          Warum bringt er dann aber beim Aufruf der check-Funktion (testi) den undefined-Fehler.

          Weil du da mit deinem eval()-Konstrukt ziemlichen Humbug veranstaltest.

          Warum nutzt du nicht die simple Zugriffsart, die dir selfhtml in der Beschreibung des forms-Objektes unter Schema 4 vorschlägt?

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi

            Weil du da mit deinem eval()-Konstrukt ziemlichen Humbug veranstaltest.

            Daran liegt es nicht ... ich habe mal in der Funktion, die die neue Zeile erzeugt 2 Ausgaben eingebaut. Einmal der Name der Original-Formulars vor und einmal nach dem appandChild. Das Ergebnis ist, dass durch das appendChild der Name "verloren" geht. Warum auch immer. Vielleicht kannst du das mal online nachvollziehen.

            Danke
            Knusperklumpen

            1. hi,

              Daran liegt es nicht ... ich habe mal in der Funktion, die die neue Zeile erzeugt 2 Ausgaben eingebaut. Einmal der Name der Original-Formulars vor und einmal nach dem appandChild. Das Ergebnis ist, dass durch das appendChild der Name "verloren" geht. Warum auch immer.

              Der IE scheint durch das Klonen tatsächlich durcheinanderzukommen - wenn man nach dem appendChild anstatt auf
              document.forms['new_rubrik_zeitfreigabe_1'].name
              auf
              document.forms['new_rubrik_zeitfreigabe_1'][0].name
              zugreift, gibt er wieder den Formularnamen aus - obwohl man dort eigentlich das erste Element der elements-Collection erwarten dürfte.

              Aber anyway, mit der von mir vorgeschlagenen Zugriffsweise erhalte ich auch anschließend wieder ein korrektes Ergebnis:

              function testi()  
              {  
                 for(i=0, f=document.forms, l=f.length, a=""; i<l; i++) {  
                    a += "Formname: " + f[i].name + "\n";  
                    a += "Anzahl Formularelemente: " + f[i].elements.length + "\n\n";  
                 }  
                 alert(a);  
              }
              

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hallo wahsaga.

                for(i=0, f=document.forms, l=f.length, a=""; i<l; i++) {

                Da ich dies nun schon zum zweiten Male bei dir sehe, frage ich einmal nach: Befürchtest du, dass einige Formulare plötzlich im Nichts verschwinden, oder warum speicherst du deren Anzahl zwischen?

                Einen schönen Dienstag noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                mathbr:del.icio.us/ mathbr:w00t/
                1. hi,

                  for(i=0, f=document.forms, l=f.length, a=""; i<l; i++) {

                  Da ich dies nun schon zum zweiten Male bei dir sehe, frage ich einmal nach: Befürchtest du, dass einige Formulare plötzlich im Nichts verschwinden, oder warum speicherst du deren Anzahl zwischen?

                  Meine eiserne Grundregel:
                  In einer Schleifen(abbruch)bedingung niemals [1] auf Werte zugreifen, die innerhalb der Schleifendurchläufe verändert werden könnten - wie schnell hat man sonst eine Endlosschleife, oder andere unerwünschte Nebeneffekte ...
                  Das ist zwar hier nicht der Fall - aber warum von einer guten Regel eine Ausnahme machen? :-)

                  Wer andernfalls doch mal innerhalb der Schleife eine unbeabsichtigte Änderung macht, sucht sich u.U. einen Wolf beim Debuggen. Und wenn sich das beim Entwickeln vermeiden lässt, dann tue ich das doch gerne.

                  [1] Von Ausnahmen abgesehen: Wenn mal die Anzahl Schleifedurchläufe explizit von etwas abhängen soll, was erst innerhalb der Schleifen-Anweisungen manipuliert werden soll, o.ä.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Hallo wahsaga.

                    In einer Schleifen(abbruch)bedingung niemals [1] auf Werte zugreifen, die innerhalb der Schleifendurchläufe verändert werden könnten - wie schnell hat man sonst eine Endlosschleife, oder andere unerwünschte Nebeneffekte ...

                    Berechtigter Gedankengang.

                    Das ist zwar hier nicht der Fall - aber warum von einer guten Regel eine Ausnahme machen? :-)

                    Es gibt keinen Grund, es hat mich nur (gerade weil hier nichts innerhalb der Schleife geschieht, was die Abbruchbedingung verändern könnte) interessiert.
                    Vermutlich kam dir der Code von dir nur deswegen so befremdlich vor, weil du nie (?) Code postest.

                    Einen schönen Dienstag noch.

                    Gruß, Ashura

                    --
                    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                    mathbr:del.icio.us/ mathbr:w00t/
              2. Ok ... ich habe nun noch rumgespielt um dem IE seinen Fehler auszutreiben aber ne Lösung habe ich nicht gefunden ... werde ich wohl die document.forms[..] Methode nehmen um darauf zuzugreifen.
                Um sicher zu sein, dass ich auch nur die Formulare erwische die ich will vergleiche ich dann halt die Namen, die er mir mit document.forms[..].name ja ausspuckt mit dem was ich haben will.
                Schade, dass es so umständlich wird aber wenigstens funktioniert es dann. Warum allerdings der IE da so durcheinander kommt täte mich trotzdem interessieren.

                Naja, danke für die Mühe und Hilfe!
                Knusperklumpen

                1. hi,

                  [...] werde ich wohl die document.forms[..] Methode nehmen um darauf zuzugreifen. [...]
                  Schade, dass es so umständlich wird aber wenigstens funktioniert es dann.

                  Was ist daran umständlich, die im DOM Level 1 vorgesehene Methode für den Formularzugriff zu benutzen?

                  Das Gebastel mit eval() erscheint mir um einiges umständlicher und fehlerträchtiger ...

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Hi

                    Was ist daran umständlich, die im DOM Level 1 vorgesehene Methode für den Formularzugriff zu benutzen?

                    Naja, wenn ich über die Namen direkt zugreifen könnte ... also document.forms.formname.elements... (oder halt document.forms['formname'].elements...) brauch ich in einer Schleife nur bis zur Anzahl der entsprechenden Forms hochzählen und greife nur auf die Formulare zurück, die mich wirklich interessieren ... also alle, die mit "formname" beginnen, z.b. "formname1", "formname2", "formname3" ... du verstehst was ich meine.

                    Wenn ich aber die Indizes verwende ... also von 0 bis document.forms.length erwische ich ja alle im Dokument vorhandenen Forms und nicht nur die, die ich wirklich will.
                    Ich muss also zusätzlich noch prüfen ob denn der Name des derzeitigen Formulars zu meinen gewünschten Formularen passt.

                    form = "formularname";
                    ende = form.length;
                    for(i=0; i<document.forms.length; i++)
                    {
                      if(document.forms[i].name.substr(0, ende) == form)
                      {
                        mache was du machen sollst
                      }
                    }

                    Diese substr-Geschichte könnte ich mir sparen.
                    Gut, es ist nicht viel aber immerhin wieder mehr was der Browser machen muss.

                    Das Gebastel mit eval() erscheint mir um einiges umständlicher und fehlerträchtiger ...

                    Wieso ... hat doch bestens funktioniert ;-)

                    Außerdem würde ich eval() nichtmal brauchen:

                    form = "formularname";
                    anz = anzahl der entsprechenden gewünschten Formulare, welche beim anlegen einer neuen Zeile entsprechend hochgezählt werden würde;

                    for(i=0; i<anz; i++)
                    {
                      form2 = form+i;
                      alert(document.forms[form2].name);
                    }

                    Naja, ist im Endeffekt wohl gehupft wie gesprungen.

                    mfg
                    Knusperklumpen

                    1. hi,

                      Naja, wenn ich über die Namen direkt zugreifen könnte ... also document.forms.formname.elements... (oder halt document.forms['formname'].elements...) brauch ich in einer Schleife nur bis zur Anzahl der entsprechenden Forms hochzählen und greife nur auf die Formulare zurück, die mich wirklich interessieren ... also alle, die mit "formname" beginnen, z.b. "formname1", "formname2", "formname3" ... du verstehst was ich meine.

                      Ja, warum machst du es denn dann nicht so?

                      Du zählst einen Index hoch, und hängst diesen an den Text "formname" an - und jetzt das dann in document.forms[...] ein.

                      gruß,
                      wahsaga

                      --
                      /voodoo.css:
                      #GeorgeWBush { position:absolute; bottom:-6ft; }
                      1. Hi

                        Ja, warum machst du es denn dann nicht so?

                        Na weil der gemeine Internet Explorer doch den Namen der ersten Form "vergisst" oder "verliert" oder sonstwas macht, nachdem ich eine neue Zeile mit appendChild angehägt habe. Genau das ist ja der Punkt warum dieser mittlerweile schon recht beachtliche Thread überhaupt erst entstanden ist ;-)

                        mfg und noch nen schönen Abend
                        Knusperklumpen

                        1. hi,

                          Na weil der gemeine Internet Explorer doch den Namen der ersten Form "vergisst" oder "verliert" oder sonstwas macht, nachdem ich eine neue Zeile mit appendChild angehägt habe.

                          Nö, tut er nicht.
                          Wie ich dir jetzt schon mehrmals demonstriert habe, steht er - wenn auch erst ausserhalb der klonenden Funktion - problemlos zur Verfügung.

                          gruß,
                          wahsaga

                          --
                          /voodoo.css:
                          #GeorgeWBush { position:absolute; bottom:-6ft; }
                          1. Hi

                            Nö, tut er nicht.

                            Dann schau dir das http://www.knusperklumpen.de/testtest.html bitte noch einmal an, klicke auf "zeile hinzufügen", achte auf die Alert-Ausgaben und sage mir warum der IE bei der 2. Ausgabe ein "undefined" bringt!
                            Er hat nach dem appendChild offensichtlich ein "Problem" die Form über ihren Namen anzusprechen.

                            Wie ich dir jetzt schon mehrmals demonstriert habe, steht er - wenn auch erst ausserhalb der klonenden Funktion - problemlos zur Verfügung.

                            Eben nicht! Klicke dann nochmal auf "Check" ... auch da kommt ein "undefinded". Über die Indizes kann man wahrlich problemlos zugreifen aber eben nicht über den Namen (zumindest beim Originalformular).

                            mfg
                            Knusperklumpen