Marc Plogas: Elemente einer bestimmten Klasse mit JS ermitteln

Hallo allerseits,

ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen. So in etwa wie getElementById oder getElementByTagName, nur halt für die Klasse. Geht das, oder muss ichs schlussendlich doch mit getElementByName machen?
Via Klasse wäre optimal, denn da muss ich nicht per Hand alle Elemente mit dieser Klasse bearbeiten und das name-Attribut übergeben...
*Faulheit siegt*

Danke
Marc

  1. hi,

    ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen. So in etwa wie getElementById oder getElementByTagName, nur halt für die Klasse. Geht das, oder muss ichs schlussendlich doch mit getElementByName machen?

    du kannst die eigenschaft className abfragen, da steht der klassenname - wenn vorhanden - drin.

    um eine schleife über alle in frage kommenden elemente kommst du aber wohl kaum herum.

    ist natürlich gut, wenn du dabei schon vorher einschränken kannst, z.b. per getElementsByTagName nur einen bestimmten element-typ betrachten o.ä., weil dies die laufzeit der "suche" verringert.

    gruß,
    wahsaga

    --
    I'll try being nicer if you'll try being smarter.
  2. ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen.

    http://www.styleassistant.de/tips/tip100.htm

    1. Hi,

      ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen.

      http://www.styleassistant.de/tips/tip100.htm

      Die dort gezeigte Funktion ist nicht korrekt. Es wird nicht berücksichtigt, daß das class-Attribut mehrere Klassennamen enthalten darf.

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo,

        http://www.styleassistant.de/tips/tip100.htm

        Die dort gezeigte Funktion ist nicht korrekt. Es wird nicht berücksichtigt, daß das class-Attribut mehrere Klassennamen enthalten darf.

        Die Funktion ist fuer den Fall einfacher Klassennamenzuweiungen gedacht.

        Es waere moeglich, die Zeile

        if(all_obj[i].className==class_name)

        durch

        if(all_obj[i].className.indexOf(class_name)!=-1)

        zu ersetzen.

        MfG, Thomas

        1. Hi,

          Es waere moeglich, die Zeile
              if(all_obj[i].className==class_name)
          durch
              if(all_obj[i].className.indexOf(class_name)!=-1)
          zu ersetzen.

          Nein, das reicht nicht.
          Beispiel:
          mit indexOf würde
          getElementsByClassName("bla");
          auch das folgende Element
          <span class="blamabel">schäm</span>
          finden.

          Man müßte den Wert an Whitespace aufsplitten und dann die Einzelteile vergleichen oder einen Regex einsetzen, der vor dem gesuchten Wert nur Whitespace oder Stringanfang und danach nur Whitespace oder Stringende zuläßt.

          cu,
          Andreas

          --
          MudGuard? Siehe http://www.Mud-Guard.de/
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. gruss wahsaga,

            du meintest schon in https://forum.selfhtml.org/?t=87040&m=516365:

            Die dort gezeigte Funktion ist nicht korrekt. Es wird nicht
            berücksichtigt, daß das class-Attribut mehrere Klassennamen
            enthalten darf.

            dieser hinweis ist berechtigt, jedoch sollte man fremden code
               nicht unbesehen verwenden, sondern auf dessen funktionsweise
               hin abklopfen, insbesondere auch deshalb, da sich diese
               spezielle loesung als quickhack aus einem hier formulierten
               problem ergab:
               http://forum.de.selfhtml.org/archiv/2002/12/31500/#m170452

            das wirklich entscheidende stueck code in Thomas Meinikes posting
               war fuer mich damals ohnehin >>document.getElementsByTagName("*")<<;

            mit dem hinweis auf eine erlaubte wildcard und mit der idee eines
               "document.getElementsByClassName(s)" kann sich jeder selbst ans
               werk machen;

            meinereinige umsetzung findet man hinter dem folgenden link:
               http://www.pseliger.de/jsExtendedApi/jsApi.document.getElementsByClassNames.js

            by(t)e by(t)e - peterS. - pseliger@gmx.net

            --
            br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
            1. aehm ... gruss MudGuard, hallo wahsaga,

              gruss wahsaga,

              entschuldigt bitte beide diesen fauxpas;

              da hab ich Euch ganz schlimm gurcheinanderbegracht -

              ich meinte latuernich: "gruss MudGuard";

              pudelig begossen - peterS.

              --
              br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
          2. Hallo,

            Nein, das reicht nicht.

            OK, war nur ansatzweise getestet ...

            So sollte es innerhalb der for-Schleife besser funktionieren:

            if(all_obj[i].className.indexOf(class_name)!=-1)
                {
                  teststr=","+all_obj[i].className.split(" ").join(",");
                  if(teststr.indexOf(","+class_name)!=-1)
                  {
                    ret_obj[j]=all_obj[i];
                    j++;
                  }
                }

            MfG, Thomas

            1. Hi,

              So sollte es innerhalb der for-Schleife besser funktionieren:

              Reicht immer noch nicht. Das schließt jetzt zwar aus, daß der gesuchte Klassenname irgendwo außer am Anfang gefunden wird, aber "bla" findet immer noch "blamabel".

              Annahme: class="blamabel"
              Suche nach: "bla"

              if(all_obj[i].className.indexOf(class_name)!=-1)
                  {
                    teststr=","+all_obj[i].className.split(" ").join(",");

              teststr ist jetzt also ",blamabel".

              if(teststr.indexOf(","+class_name)!=-1)

              Hier wird geprüft, ob teststr den Wert ",bla" enthält.

              Das ist der Fall.

              Diese beiden Zeilen müßten also korrigiert werden zu:

              teststr=","+all_obj[i].className.split(" ").join(",") + ",";
                    if(teststr.indexOf(","+class_name + ",")!=-1)

              Dann klappt es auch bzw. sollte es.

              {
                      ret_obj[j]=all_obj[i];
                      j++;
                    }
                  }

              cu,
              Andreas

              --
              MudGuard? Siehe http://www.Mud-Guard.de/
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hallo,

                Annahme: class="blamabel"
                Suche nach: "bla"

                Genau diesen Fall hatte ich ausgelassen.

                Diese beiden Zeilen müßten also korrigiert werden zu:

                teststr=","+all_obj[i].className.split(" ").join(",") + ",";
                      if(teststr.indexOf(","+class_name + ",")!=-1)

                Dann klappt es auch bzw. sollte es.

                Ja, danke.

                MfG, Thomas

                1. Hi,

                  Annahme: class="blamabel"
                  Suche nach: "bla"

                  Genau diesen Fall hatte ich ausgelassen.

                  War ja nur der, den ich vorher schon gebracht hatte ;-)
                  Scheiß-Hitze!

                  cu,
                  Andreas

                  --
                  MudGuard? Siehe http://www.Mud-Guard.de/
                  Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Hi,

    ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen. So in etwa wie getElementById oder getElementByTagName, nur halt für die Klasse. Geht das, oder muss ichs schlussendlich doch mit getElementByName machen?

    Vordefiniert gibt es das meines Wissens nicht.
    Kann doch aber auch nicht so schwer sein.
    Rekursiv durch die Kindelemente von html durchlaufen, jeweils das class-Attribut (className, nicht class!) auslesen, in die einzelnen Klassennamen zu zerlegen und falls der gesuchte Klassenname dabei ist, das Element in ein Array aufnehmen.

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.