Siri: Verschachteltes getElementsByName()

Hallo,

var elements1Array = document.getElementsByName('examplename1');  
for (var i=0; i < elements1Array.length; i++) {  
  
var element1 = elements1Array[i];  
var element2 = element1.getElementsByName('examplename2')[0];  
  
// -> Fehlermeldung: element1.getElementsByName is not a function  
}

Geht das prinzipiell nicht oder mach ich was falsch?

Grüße
Siri

  1. Nope das geht so nicht.
    getElementsByName ist eine Funktion des document Objektes. Du versuchst es jedoch auf einem HTML Element aus zu führen.

    getT-RexByGruß

    1. Hallo,

      getElementsByName ist eine Funktion des document Objektes. Du versuchst es jedoch auf einem HTML Element aus zu führen.

      Mhmmm...

      var elements1Array = document.getElementsByName('examplename1');  
      for (var i=0; i < elements1Array.length; i++) {  
        
      var element1 = elements1Array[i];  
      var element2 = element1.getElementsByTagName('exampletagname')[0];  
        
      }
      

      funktioniert. Das ist doch auch eine HTML-Elementzugriff. Ich versteh den Unterschied nicht.

      Grüße
      Siri

      1. Mhmmm...

        var elements1Array = document.getElementsByName('examplename1');

        for (var i=0; i < elements1Array.length; i++) {

        var element1 = elements1Array[i];
        var element2 = element1.getElementsByTagName('exampletagname')[0];

        }

        
        >   
        > funktioniert. Das ist doch auch eine HTML-Elementzugriff. Ich versteh den Unterschied nicht.  
          
        Das sind zwei Grundverschiedene Methoden. Das Resultat kann unter Umständen gleich sein -> eine Liste mit HTML Elementen.  
          
        Gruß  
        der grundverschiedene  
        T-Rex
        
    2. [latex]Mae  govannen![/latex]

      Nope das geht so nicht.
      getElementsByName ist eine Funktion des document Objektes.
      Du versuchst es jedoch auf einem HTML Element aus zu führen.

      Das ist möglich..

      Vielleicht wird einem Element ein name-Attribut zugewiesen, das keines haben darf. Oder irgendwas Anderes. Ohne weitere Einblicke  nicht überprüfbar.

      Stur lächeln und winken, Männer!
      Kai

      --
      It all began when I went on a tour, hoping to find some furniture
       Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
      SelfHTML-Forum-Stylesheet
      1. Moin,

        Das ist möglich..

        element.getElementsByTagName != element.getElementsByName

        Grüße Marco

        1. [latex]Mae  govannen![/latex]

          Das ist möglich..

          element.getElementsByTagName != element.getElementsByName

          *Brille putz*
          Das kommt davon, wenn man kurz vorher mit gEBTN arbeiten musste :(

          Stur lächeln und winken, Männer!
          Kai

          --
          It all began when I went on a tour, hoping to find some furniture
           Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
          SelfHTML-Forum-Stylesheet
  2. Moin,

    es ist, wie T-Rex schon geschrieben hat. Kindelemente kannst du aber beispielsweise per getElementsByClassName oder getElementsByTagName zugreifen.

    Möglich sind auch weitere Javascript-Funktionen, wie firstChild, lastChild etc...

    Grüße Marco

  3. Hi,

    du könntest .querySelector() verwenden:

    var elements1Array = document.getElementsByName('examplename1');  
    for (var i=0; i < elements1Array.length; i++) {  
      var element1 = elements1Array[i];  
      var element2 = element1.querySelector('[name=examplename2]');  
    }
    

    Oder ggf. .querySelectorAll():

    document.querySelectorAll('[name=examplename1] [name=examplename2]');

    ~dave

    1. document.querySelectorAll('[name=examplename1] [name=examplename2]');

      Aber wieso sollte man Elemente mit name-Attributen verschachteln?

      Gibts überhaupt HTML-Elemente mit name, die sich sinnvoll und valide verschachteln lassen? Da würde mir erstmal form und input/select/button usw. einfallen.

      Dazu braucht man nicht getElementsByName oder gar QSA. Dazu reicht die Old-School-Werkzeuge aus Netscape JavaScript 1.0, nämlich document.forms und formElement.elements:

      http://de.selfhtml.org/javascript/objekte/forms.htm#allgemeines
      http://de.selfhtml.org/javascript/objekte/elements.htm

      Mathias

  4. Hallo,

    Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.

    Ich vermute, diese Abfrage ließe sich stark vereinfachen. Es gibt viele andere und ggf. passendere Abfragetechniken als getElementsByTagName. dann ließe sich auch das Problem lösen, dass Elementobjekte keine getElementsByTagName-Methode haben.

    Mathias

    1. Hallo,

      Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.

      <div name="nav" id="a">  
       <div name="leftpart"></div>  
       <ul>  
        <li>A</li>  
         ...  
        <li>X</li>  
       </ul>  
       <div name="rightpart"></div>  
      </div>  
        
      <div name="nav" id="b">  
       <div name="leftpart"></div>  
       <ul>  
        <li>A</li>  
         ...  
        <li>X</li>  
       </ul>  
       <div name="rightpart"></div>  
      </div>
      

      usw. Es können beliebig viele divs mit name="nav" sein. Zuerst suche ich alle mit Namen und innerhalb des jeweiligen Divs die Elemente leftpart und rightpart. Denen möchte ich einen eventListener verpassen. Aber soweit komme ich ja nicht mal...

      Grüße
      Siri

      1. Es geht um dieses Thema.

      2. Hi,

        mir ist kein Doctype bekannt in dem das div-Element ein name-Attribut haben darf.
        Welchen verwendest du?

        ~dave

        1. Hallo,

          mir ist kein Doctype bekannt in dem das div-Element ein name-Attribut haben darf.
          Welchen verwendest du?

          XHTML4.01 Strict und die "äüßeren" Div werden auch über getElementsByName gefunden.

          Grüße
          Siri

          1. Hi,

            XHTML4.01 Strict und die "äüßeren" Div werden auch über getElementsByName gefunden.

            Es gibt kein XHTML 4.01 Strict.
            validator.w3c.org

            ~dave

            1. Hallo,

              ist natürlich XHTML 1.0 Strict

              Grüße
              Siri

              1. Hi,

                ist natürlich XHTML 1.0 Strict

                Das ändert nichts daran dass div-Elemente kein name-Attribut haben dürfen.

                ~dave

                1. Hallo

                  Das ändert nichts daran dass div-Elemente kein name-Attribut haben dürfen.

                  Das ist aber ziemlich lästig...

                  Danke!

                  Grüße
                  Siri

      3. Hallo siri,

        Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.

        <div name="nav" id="a">

        <div name="leftpart"></div>
           ...
        <div name="rightpart"></div>
        </div>

        <div name="nav" id="b">
        <div name="leftpart"></div>
           ...
          <li>X</li>
        </div>

          
        
        > usw. Es können beliebig viele divs mit name="nav" sein.  
          
        ich nähme in Deinem Fall hier zuallererst einfach "class" statt "name" und getElementsByClassName(). Damit wäre Dein direktes Problem erledigt. Andererseits glaube ich, dass sich die Struktur Deines HTML vermutlich vereinfachen ließe.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. Hallo,

          ich nähme in Deinem Fall hier zuallererst einfach "class" statt "name" und getElementsByClassName(). Damit wäre Dein direktes Problem erledigt. Andererseits glaube ich, dass sich die Struktur Deines HTML vermutlich vereinfachen ließe.

          Für Hinweise wäre ich echt dankbar. Es geht vom Grundsatz her um dieses Thema. Ich möchte jeweils für die scroll-auslösenden-Elemente (Div, Img, A oder was auch immer) einen Event-Handler registrieren. Nach allem, was ich in den letzten Wochen hier so mitgelesen habe ist das besser und auch eleganter, als die entsprechenden Element direkt mit onclick etc. im HTML zu versehen. Orientiert habe ich mich bei Moliliy.
          Bei getElementsByClassName weiß ich jetzt nicht inwieweit das propertitär ist bzw. ob es auch noch für ältere Browser taugt.

          Ich kann natürlich über alle möglichen Element eine Schleife ziehen und wenn dass Attribut "name" einen bestimmten Wert hat, den Handler registrieren. Wär doch aber komplizierter, als die Elemente selbst anzusprechen. Das Problem scheint ja zu sein, das bei der VErwendung von getElementsByName keine Kinder Elemente mehr abgefragt werden können. Bei getElemetsByTagName schon. Und das versteh ich nicht...

          Grüße
          Siri

          1. Hallo Siri,

            vergiss das name-Attribut. Das ist, so wie du es einsetzt, fgalsch!

            Wenn deine Elemente eindeutig sind, gib ihnen eine ID. Wenn du sie gruppieren kannst, gib dem Umgebenen Element eine ID und selektiere sie dann über den Tag-Name. Wenn das auch nicht geht, gehe den Weg über den Class-Name, Google wird dir reichlich Versionen eines browserübergreifenden getElementsByClassName liefern.

            Gruß, Jürgen

            PS Du solltest auch hin und wieder mal den Validator befragen.

            1. Hallo JürgenB,

              vergiss das name-Attribut. Das ist, so wie du es einsetzt, fgalsch!

              "fgalsch" ist jetzt richtig falsch.

              Gruß, Jürgen

            2. Hallo,

              Wenn deine Elemente eindeutig sind, gib ihnen eine ID. Wenn du sie gruppieren kannst, gib dem Umgebenen Element eine ID und selektiere sie dann über den Tag-Name. Wenn das auch nicht geht, gehe den Weg über den Class-Name, Google wird dir reichlich Versionen eines browserübergreifenden getElementsByClassName liefern.

              Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n). Da ist doch das Ansprechen per ID nicht der richtige Ansatz. Wozu gibt's denn das Attribut name? Wie macht jquery sowas? Alles über getElementsByClassName? Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?

              Versteh mich nicht falsch! Ich bin froh, dass ich den Hinweis bekommen habe. Aber warum der andere Weg nicht geht, leuchtet mir nicht ein.

              Grüße
              Siri

              1. Hi,

                Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n). Da ist doch das Ansprechen per ID nicht der richtige Ansatz.

                Stimmt.

                Wozu gibt's denn das Attribut name?

                div-Elemente haben _kein_ Attribut "name"!
                Form-, input-, button-, textarea-, select-Elemente und ein paar die ich vergessen habe, haben ein Attribut "name". Dort erfüllen sie auch eine Funktion.

                Alles über getElementsByClassName? Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?

                Dann gibst du ihnen nicht nur eine Klasse sondern mehrere.

                ~dave

              2. Hallo Siri,

                Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe

                und warum gruppierst du sie dann nicht?

                <div id="gruppe">  
                 <button ...>...</button >  
                 <button ...>...</button >  
                 <button ...>...</button >  
                </div>
                

                und

                zweiterKnopf = document.getElementById("gruppe"´).getElementsByTagName("button")[1];

                Gruß, Jürgen

              3. Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n).

                Exakt dafür bietet HTML Klassen.

                Wozu gibt's denn das Attribut name?

                Um Formularelemente zu gruppieren. (Früher auch um Bilder, Iframes usw. zu benennen, als es noch noch keine id-Attribute überall gab.)

                Wie macht jquery sowas? Alles über getElementsByClassName?

                jQuery macht gar nichts besonders. jQuery hat eine Selektor-Engine die dir erlaubt, Elemente auf verschiedene Weise zu adressieren. Intern wird die Querying-Methode verwendet, die der Abfrage entspricht. (childNodes/children, getElementsByTagName, getElementsByClassName, getElementsByName, querySelectorAll usw.)

                Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?

                Dann gib ihnen eine Klasse, die nichts anderes als diese Gemeinsamkeit anzeigt, und gebe keine CSS-Regeln für diese Klasse an.

                Klassen sind nicht nur für CSS-Formatierung dar und sind nicht zwangsläufig an CSS gebunden.

                Versteh mich nicht falsch! Ich bin froh, dass ich den Hinweis bekommen habe. Aber warum der andere Weg nicht geht, leuchtet mir nicht ein.

                Den anderen Weg hast du dir ausgedacht. Das ist schön, so KÖNNTE es theoretisch sein, aber er ist in HTML nicht vorgesehen.

                Mathias