Sven: Mehrere DIVs per JS ausblenden

Hallo ihr,

ich möchte mehrere DIV-Elemente ausblenden, die allesamt den gleichen Namen haben. Also:

<div name="abc" ...>

Dafür habe ich folgendes versucht:

function hidefieldsName(nname) {
 for(i=0; i<nname.length; i++) {
  document.getElementsByName(nname)[i].style.display = 'none';
 }
}

hidefieldsId('abc');

Es funktioniert zwar, die DIVs werden ausgeblendet. Dennoch meldet mir Firefox: "document.getElementsByName(nname)[i] is undefined"

Kann mir jemand verraten, warum? Was ist verkehrt?

Lg
Sven

  1. Hi Sven!

    Kann mir jemand verraten, warum? Was ist verkehrt?

    nname.length

    Du meintest sicher document.getElementsByName(nname).length...
    Tipp: Lege dir eine Variable an, in der du das Array, das getElementsByName zurückgibt speicherst.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Du meintest sicher document.getElementsByName(nname).length...
      Tipp: Lege dir eine Variable an, in der du das Array, das getElementsByName zurückgibt speicherst.

      getElementsByName liefert kein Array zurück, sondern eine NodeList. Zumindest sollte es so sein, der FF2 gibt anscheinend eine HTMLCollection zurück, der Lümmel.

      --
      Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
      Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
      1. Kurtz gegrüßt

        getElementsByName liefert kein Array zurück, sondern eine NodeList. Zumindest sollte es so sein, der FF2 gibt anscheinend eine HTMLCollection zurück, der Lümmel.

        sowas wird IMHO als "Array-Like-Object" subsummiert. Wichtig ist das .length definiert ist.

        Grüße
         Kurt

      2. Hi Timo!

        getElementsByName liefert kein Array zurück, sondern eine NodeList.

        Es ist ja nicht meine Schuld, dass dieses Array fälschlicherweise als Liste bezeichnet wird. =)

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Kurtz gegrüßt

    Kann mir jemand verraten, warum? Was ist verkehrt?

    FF geht wohl wie ich davon aus, das name analog zu id *einmalig* sein sollte.

    Ich würde deinen ansatz nicht wählen, ich weise bei sowas z.B. eine eigene css-class zu und suche alle Elemente die sie enthalten. Alternativ kannst du auch die class manipulieren, dasss könnte mit älteren Browsern problematisch werden.

    Grüße
     Kurt

    1. Kurtz gegrüßt

      ich relativiere mal was ich gesagt habe, wenn name eindeutig sein müsste würd bei getElementsByName kein plural stehen.

      Allerdings bleib ich skeptisch, da gabs mal Probleme...

      Grüße
       Kurt

      1. Hi KurtZ!

        Allerdings bleib ich skeptisch, da gabs mal Probleme...

        Probleme bereitet dem Threadersteller die Tatsache, dass er aufgrund der Stringlänge der ID, die er übergibt, entscheidet, welcher Index auf das Array der Div-Elemente zugreift.
        Er möchte aber anhand der Länge des Arrays die Obergrenze der For-Schleife festlegen.

        Dass der Firefox mit dieser Funktion Probleme haben sollte, bezweifle ich stark.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Kurtz gegrüßt

          Dass der Firefox mit dieser Funktion Probleme haben sollte, bezweifle ich stark.

          FF vielleicht nicht, aber ich halte eine Markierung der auszublenden Divs mit "name" für riskant. Irgendein IE-Bug-Neuron feuert da bei mir, aber ich bin zu faul zu recherchieren. Irgendwo werden name und id gleichgesetzt...

          Mit ID *muss* er eindeutig werden, ich nutze wie gesagt deswegen eine eigene class um wegzublenden Divs auszuzeichnen.

          Ich hab das mal vor ca. 2 Jahren so umständlich realisieren müssen, und für unnötige Workarounds bin ich eigentlich zu faul. ; )

          Grüße
           Kurt

          1. Hi KurtZ!

            Man könnte ja auch mit getElementsByTagName arbeiten und den Namen überprüfen. Damit dürfte der IE keine Probleme haben.

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. Hi H☼psel

              Man könnte ja auch mit getElementsByTagName arbeiten und den Namen überprüfen. Damit dürfte der IE keine Probleme haben.

              wie von JuergenB schon angedeutet ist name kein Universalattribut
              http://de.selfhtml.org/html/referenz/attribute.htm#div

              Man macht sich hier sonst von der Interpretationsfreiheit der Browser abhängig.

              Grüße
               Kurt

          2. Hi,

            FF vielleicht nicht, aber ich halte eine Markierung der auszublenden Divs mit "name" für riskant.

            NAME ist bei DIV nicht erlaubt - alles weitere mithin "Zufall". Gleichwohl funktioniert es in den üblichen Browsern (auch wenn ich mich bestimmt nicht drauf verlassen würde). Bis auf Opera (zumindest bis 8.x - keine Ahnung, was der 9.x macht). Der verweigert sich!

            Irgendein IE-Bug-Neuron feuert da bei mir, aber ich bin zu faul zu recherchieren. Irgendwo werden name und id gleichgesetzt...

            Der IE kann mit getElementsByName() auch dann arbeiten, wenn NAME im Tag nicht erlaubt ist. Aber er benutzt für NAME und ID den selben Namespace (was logischerweise zu Fehlern führen kann). Wird erst mit IE 8 geändert.

            Mit ID *muss* er eindeutig werden, ich nutze wie gesagt deswegen eine eigene class um wegzublenden Divs auszuzeichnen.

            Ich benutze ein eigenes Attribut oder eine ID, mit identischem Anfang (und selektiere dann anhand dieses Anfangs).

            Gruß, Cybaer

            --
            Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
            (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
            1. Hi Cybaer,

              danke dass du meine Kritik unterfütterst!

              Ich benutze ein eigenes Attribut oder eine ID, mit identischem Anfang (und selektiere dann anhand dieses Anfangs).

              "ID mit identischem Anfang" ist ne interessante Idee und erlaubt dann verschiede CSS-Klassen zu nutzen... merk ich mir, Danke!!! : )

              "benutze ein eigenes Attribut" lässt bei mir Fragen offen, erlaubt das DOM sich neue Attributnamen zu definieren, oder sind die Mainstreambrowser so tolerant?

              Wahrscheinlich letzteres, weil die Browser aufwärtskompatibel zu eventuellen Erweiterungen des HTML-Standards bleiben wollen.

              Grüße
               Kurt

              1. Kurtz gegrüßt

                "benutze ein eigenes Attribut" lässt bei mir Fragen offen, erlaubt das DOM sich neue Attributnamen zu definieren, oder sind die Mainstreambrowser so tolerant?

                Mal ein Selbstgespräch:

                Das Document Object Model wird das erlauben weil JS es fast immer erlaubt einem Objekt neue Attribute zuzuweisen, auch HTML-Objekten.

                Spiegelt sich das aber auch auf HTML-Parser-ebene wieder, dass man einem Tag neue Fantasieattribute zuweisen darf???

                Wahrscheinlich kann man es zumindest ungestraft. Oder?

                Grüße
                 Kurt

                1. Hi,

                  Spiegelt sich das aber auch auf HTML-Parser-ebene wieder, dass man einem Tag neue Fantasieattribute zuweisen darf???

                  Ja, wenn der Parser da Probleme bereitet, ist es per definitionem kein HTML-Parser.

                  Gruß, Cybaer

                  --
                  Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                  (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
              2. Hi,

                "ID mit identischem Anfang" ist ne interessante Idee und erlaubt dann verschiede CSS-Klassen zu nutzen...

                Versch. "CSS-Klassen" kann man aber auch so nutzen - falls ich dich richtig verstanden habe. Aber auch ich nutze HTML-Klassen (i.d.R.) lieber exklusiv für CSS und nicht für sonstige Dinge.

                "benutze ein eigenes Attribut" lässt bei mir Fragen offen, erlaubt das DOM sich neue Attributnamen zu definieren, oder sind die Mainstreambrowser so tolerant?

                Sind sie nicht nur, sie müssen es sogar sein.

                Wahrscheinlich letzteres, weil die Browser aufwärtskompatibel zu eventuellen Erweiterungen des HTML-Standards bleiben wollen.

                So ist es. Unbekannte Attribute sind seit dem Ur-HTML pflichtgemäß zu ignorieren, und mit HTML 5 wurde auch definiert, daß unbekannte Attribute auch in JS/DOM abzubilden sind.

                Es gibt aber, HTML 5 hin oder her, auch bislang keinen Browser, der damit ein Problem gehabt hätte - und nun ist es "offiziell".

                Gruß, Cybaer

                --
                Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
                1. Kurtz gegrüßt

                  So ist es. Unbekannte Attribute sind seit dem Ur-HTML pflichtgemäß zu ignorieren, und mit HTML 5 wurde auch definiert, daß unbekannte Attribute auch in JS/DOM abzubilden sind.

                  Es gibt aber, HTML 5 hin oder her, auch bislang keinen Browser, der damit ein Problem gehabt hätte - und nun ist es "offiziell".

                  Danke, fachlich sehr hilfreich!!!  : )

                  Grüße
                   Kurt

  3. Hallo Sven,

    <div name="abc" ...>

    nicht alle Elemente dürfen einen Namen haben. Nimm lieber eine ID

    function hidefieldsName(nname) {
    for(i=0; i<nname.length; i++) {

    name ist ein String ("abc") mit der Länge 3!

    document.getElementsByName(nname)[i].style.display = 'none';

    und daher suchst du drei Elemente mit den Namen "abc"

    }
    }

    hidefieldsId('abc');

    Gruß, Jürgen

    1. name ist ein String ("abc") mit der Länge 3!

      sorry, soll nname heißen.

      Gruß, Jürgen