Elemente einer bestimmten Klasse mit JS ermitteln
Marc Plogas
- javascript
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
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
ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen.
Hi,
ich möchte gern auf alle Elemente die eine bestimmte (CSS)Klasse haben, zugreifen.
Die dort gezeigte Funktion ist nicht korrekt. Es wird nicht berücksichtigt, daß das class-Attribut mehrere Klassennamen enthalten darf.
cu,
Andreas
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
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
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
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.
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
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
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
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
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