danion: getElementsByName liefert NULL

Hallo,

wenn ich über folgende Befehlssequenz eine Radiobox erzeuge

tmpinput=document.createElement("input");
tmpinput.type="radio";
tmpinput.name="selector";
tmprow.appendChild(tmpCell);

liefert der Aufruf in einer späteren Funktion

document.getElementsByName("selector");

NULL als Ergebnis. Lege ich die Radiobox im HTML selber über tags an wird sie allerdings als Objekt zurückgegeben.

Jemand eine Idee wo das Problem liegt? Danke!

  1. Tag danion.

    tmpinput=document.createElement("input");
    tmpinput.type="radio";
    tmpinput.name="selector";
    tmprow.appendChild(tmpCell);

    Was ist tmpCell? Meinst du nicht eher tmpinput?

    Siechfred

    1. Tag danion.

      tmpinput=document.createElement("input");
      tmpinput.type="radio";
      tmpinput.name="selector";
      tmprow.appendChild(tmpCell);

      Was ist tmpCell? Meinst du nicht eher tmpinput?

      Siechfred

      sorry fehlt noch eine Zeile darunter - ist eine erzeugte Tabelle und die Spalte tmpCell enthält die Radiobox
       - will nicht alle Bestandteile hier einbauen...sprengt den Rahmen

      tmpCell.appendChild(tmpinput);

      Nur warum bekommt man ein erzeugtes Element nicht mit document.getElementsByName??? Grüße

      1. hi,

        sorry fehlt noch eine Zeile darunter [...]
        Nur warum bekommt man ein erzeugtes Element nicht mit document.getElementsByName?

        Da wir nicht wissen können, ob nicht eventuell noch ein bisschen mehr fehlt - schau doch bitte erst mal mit dem DOM Inspector des Mozilla/Firefox nach, ob dein Element wirklich so wie von dir beabsichtigt in das Dokument eingehängt wurde.

        gruß,
        wahsaga

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

          sorry fehlt noch eine Zeile darunter [...]
          Nur warum bekommt man ein erzeugtes Element nicht mit document.getElementsByName?

          Da wir nicht wissen können, ob nicht eventuell noch ein bisschen mehr fehlt - schau doch bitte erst mal mit dem DOM Inspector des Mozilla/Firefox nach, ob dein Element wirklich so wie von dir beabsichtigt in das Dokument eingehängt wurde.

          gruß,
          wahsaga

          Die Idee ist echt super - von dem Inspektor hab ich auch noch nie etwas gehört danke!

          <tr><td align="center"><input type="radio" name="selector"></td></tr>

          so sieht des ja korrekt aus aber document.getElementsByName("selector") liefert NULL... hmm

          1. so sieht des ja korrekt aus aber document.getElementsByName("selector") liefert NULL... hmm

            Kannst du nicht lesen oder wartest du darauf das wir es dir vorlesen?

            Ich hab dir bereits den Link gezeigt, du musst nur drauf klicken und lesen.

            Struppi.

            1. so sieht des ja korrekt aus aber document.getElementsByName("selector") liefert NULL... hmm

              Kannst du nicht lesen oder wartest du darauf das wir es dir vorlesen?

              Ich hab dir bereits den Link gezeigt, du musst nur drauf klicken und lesen.

              Struppi.

              Ja klar kann ich lesen. Ich brauche ja auch das Array der Objekte...
              Aber selbst Zugriff auf ein Element funktioniert nicht...

              var radio=document.getElementsByName("selector")[0];
              liefert undefined als Ergebnis und kein HTML-Objekt :o(
              Hab da nix verkehrt gemacht und wenn ich die Objekte nicht erzeuge sondern als HTML eintippe liefert der ja Ergebnisse...
              Wieso kann man mit dein eingehängten nix anfangen - das versteh ich nicht.

              1. ok

                Hab da nix verkehrt gemacht und wenn ich die Objekte nicht erzeuge sondern als HTML eintippe liefert der ja Ergebnisse...
                Wieso kann man mit dein eingehängten nix anfangen - das versteh ich nicht.

                Wir auch nicht, denn normalerweise funktioniert so was ohne Probleme, es wäre mal Zeit ein Beispiel zu zeigen wo das nicht funktioniert.

                Struppi.

                1. ok

                  Hab da nix verkehrt gemacht und wenn ich die Objekte nicht erzeuge sondern als HTML eintippe liefert der ja Ergebnisse...
                  Wieso kann man mit dein eingehängten nix anfangen - das versteh ich nicht.

                  Wir auch nicht, denn normalerweise funktioniert so was ohne Probleme, es wäre mal Zeit ein Beispiel zu zeigen wo das nicht funktioniert.

                  Struppi.

                  Kein Problem hab mal ein kleines Beispiel konstruiert wie das sinngemäß ablaufen soll in der Webanwendung...

                  In der Funktion test() will ich einfach nur das hurz aus der Eingabezeile holen... einfach mal probieren - no chance
                  <html>
                  <head>
                  <script language="JavaScript">
                  function init()
                  {
                   var myInput=document.createElement("input");
                   myInput.name="testInput";
                   myInput.value="hurz";
                   document.getElementsByTagName("body")[0].appendChild(myInput);
                  }
                  function test()
                  {
                   // soll den Value von myInput mal ausgeben
                   alert(document.getElementsByName("testInput"));
                   alert(document.getElementsByName("testInput").value);
                   alert(document.getElementsByName("testInput")[0]);
                   alert(document.getElementsByName("testInput")[0].value);
                  }
                  </script>
                  <body onLoad="init()">
                  <button onclick="test()">Test aufrufen</button>
                  </body>
                  </head>
                  </html>

                  1. Ok das Beispiel klappt wenigstens im Firefox aber im Internet Explorer ist da auch Ruhe ... die Rückgabewerte sind Müll.
                    Scheint bald so dass die Browser nicht ganz ausgereift sind was das Ansprechen dynamisch eingebauter Elemente betrifft. Muss halt doch PHP das Formular generieren... Danke für eure Hilfe!

                    Daniel

                    1. Ok das Beispiel klappt wenigstens im Firefox aber im Internet Explorer ist da auch Ruhe ... die Rückgabewerte sind Müll.

                      Das Problem in deinem Falle ist, der IE ist in dem Punkt wesentlich strenger. Das name Attribut ist nicht für alle Elemente erlaubt

                      Da ich grad nicht testen kann probier es mit einem DOCTYPE der den browser in den standardmode versetzt momentan arbeitest du im fehleranfälligne Quirksmode,
                      Dann solltest du ein Formularelement eine Formular hinzufügen oder zumindest einem Element das innerhalb eines Formulares steht. Ausserdem hast du ja mit myInput eigentlich schon die Referenz die du ohne Probleme verwenden kannst.

                      Die Browser sind sehr wohl ausgereift was dynamische Elemente angeht. Das funktioniert, wenn man alles richtig macht ohne Probleme.

                      Struppi.

                      1. IE works correctly on elements that CAN'T have a name attribute.
                        It works incorrectly, however, on elements that can.

                        Firefox handelt das name Attribut fehlerfrei, Internetexplorer stattdessen das id Attribut also muss man es über die 2 Attribute handeln. So seh ich das nach den Versuchen auch.

                        <html>
                        <head>
                        <script language="JavaScript">
                        function init()
                        {
                         var myInput=document.createElement("input");
                         myInput.name="testInput";
                         myInput.id="testInput";
                         myInput.value="hurz";
                         document.getElementsByTagName("body")[0].appendChild(myInput);
                        }
                        function test()
                        {
                         var object;
                         if(document.getElementsByName("testInput")[0].value)
                          object=document.getElementsByName("testInput")[0].value;
                         else
                          object=document.getElementsById("testInput")[0].value;
                         alert(object);

                        }
                        </script>
                        <body onLoad="init()">
                        <button onclick="test()">Test aufrufen</button>
                        </body>
                        </head>
                        </html>

                        1. IE works correctly on elements that CAN'T have a name attribute.
                          It works incorrectly, however, on elements that can.

                          Sowas in der art war hier auch schon das Ergebniss, wie gesagt ich kann das grad nicht testen.

                          Firefox handelt das name Attribut fehlerfrei, Internetexplorer stattdessen das id Attribut also muss man es über die 2 Attribute handeln. So seh ich das nach den Versuchen auch.

                          Nach wie vor du hast die Referenz ja schon, warum musst du diese nochmal holen?

                          <html>
                          <head>

                          wie sieht das Ergebniss aus, wenn du das Dokument im standardmode schreibst?

                          <script language="JavaScript">

                          "language" ist ein veraltetes Attribut, benutze type

                          function init()
                          {
                          var myInput=document.createElement("input");

                          Hier hast du die Referenz auf das Objekt, du musst sie nur irgendwo unterbringen.

                          {
                          var object;
                          if(document.getElementsByName("testInput")[0].value)
                            object=document.getElementsByName("testInput")[0].value;
                          else
                            object=document.getElementsById("testInput")[0].value;
                          alert(object);

                          Wenn du dem Element eine ID gibst, reicht getElementById das können alle anderen Browser auch. Aber getElementById() (nicht getElements) liefert kein Array zurück.

                          Also:

                          var object = document.getElementById("testInput");
                          alert(object.value);

                          Struppi.

                          1. Hi Struppi, erstmal danke für deine Geduld - also das Doctype bringt leider gar nix...

                            wie gesagt an die Referenzen komm ich jetzt per id - Attribut im Internet Explorer und wenn ich mir dann den Name des Objektes ausgeben lasse ist der auch korrekt.

                            Denk nochmal zurück an die ersten Postings wo es nicht um das Testbeispiel ging sondern um Radiobuttons, die ordnen sich ja nur über den Namen zu einer Gruppe ... kurz gesagt Radiobuttons die über createElement() erzeugt werden sind nicht klickbar - im Internet Explorer.

              2. var radio=document.getElementsByName("selector")[0];
                liefert undefined als Ergebnis und kein HTML-Objekt :o(

                Schau dir mal diesen Archivthread an.

                Siechfred

  2. tmpinput=document.createElement("input");
    tmpinput.type="radio";
    tmpinput.name="selector";
    tmprow.appendChild(tmpCell);

    liefert der Aufruf in einer späteren Funktion

    document.getElementsByName("selector");

    Das du oben mit tmpinput bereits die Referenz auf das Objekt hast ist dir klar?
    Du bräuchtest also eigentlich die Funktion gar nicht.

    NULL als Ergebnis. Lege ich die Radiobox im HTML selber über tags an wird sie allerdings als Objekt zurückgegeben.

    Jemand eine Idee wo das Problem liegt? Danke!

    Ja selfhtml hat eine Idee.
    Ein kurzer Blick in die Doku zu der Funtion sollte dein Problem lösen helfen.
    und hier auch noch den Link dazu:http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_name

    Struppi.

    1. Das Problem ist dass die Elemente nicht im HTML-Code stehen sondern erzeugt werden. Ich besitze zwar nach dem Erzeugen kurzzeitig die Referenz auf die Objekte aber wenn der Benutzer später durch Interaktion eine Funktion aufruft kann ich die Radiobuttons nicht mehr ansprechen. Hab auch schon versucht die Referenzen in einem Array mitzuführen - die Attribute lassen sich dann aber auch nicht mehr ändern :o(
      Muss aber abfragen können welche aktuell auf checked==true steht und anschließend den nächsten als checked markieren.

      1. Das Problem ist dass die Elemente nicht im HTML-Code stehen sondern erzeugt werden. Ich besitze zwar nach dem Erzeugen kurzzeitig die Referenz auf die Objekte aber wenn der Benutzer später durch Interaktion eine Funktion aufruft kann ich die Radiobuttons nicht mehr ansprechen. Hab auch schon versucht die Referenzen in einem Array mitzuführen - die Attribute lassen sich dann aber auch nicht mehr ändern :o(

        Quatsch, die Attribute lassen sich jederzeit ändern. Dein Ansatz ist falsch.

        Aber die selfhtml Seite haste immer noch nicht gelesen?

        Struppi.

  3. Hallo,

    wenn ich über folgende Befehlssequenz eine Radiobox erzeuge

    tmpinput=document.createElement("input");
    tmpinput.type="radio";
    tmpinput.name="selector";
    tmprow.appendChild(tmpCell);

    liefert der Aufruf in einer späteren Funktion

    document.getElementsByName("selector");

    NULL als Ergebnis. Lege ich die Radiobox im HTML selber über tags an wird sie allerdings als Objekt zurückgegeben.

    Jemand eine Idee wo das Problem liegt? Danke!

    Die Lösung für das Problem ist nach vielen Versuchen nun gefunden. Ursache ist dass das Input Element im Internet Explorer anders als im Firefox erzeugt werden muss.
    Der Standard wurde hierbei schlicht vernachlässigt.

    tmpinput=document.createElement("<input type="radio" name="selector">"); //Erzeugung für Internet Explorer

    if (tmpinput.checked==undefined)
    {
      tmpinput=document.createElement("input");
      tmpinput.type="radio";
      tmpinput.name="selector";
    }