Alle Klassen und IDs eines Dokuments sammeln
Deus Figendi
- javascript
1 LX
Guten Morgen,
ich möchte gerade eine Liste aller in einem XML-Dokument vorhandenen Klassen und IDs haben. Außerdem will ich das inline-styling dieser sammeln.
Naja ist nicht ganz richtig, es geht um SVG und es geht eigentlich nur um bestimmte Element-Typen, nämlich alle Formen und <g>.
Mein Problem ist im Grunde, dass JS keine assoziativen Arrays kennt bzw. (soweit ich weiß) nur in Form von Objekten btw. Eigenschaften.
Denn mein Ansatz sah jetzt erstmal so aus:
var all_classes = new Array();
var all_ids = new Array();
var all_elements = document.getElementsByTagName("*");
for (var i=0; i < all_elements.length; i++) {
var nn = all_elements[i].nodeName.toUpperCase();
if (nn=='G'||nn=='RECT'||nn=='PATH'||nn=='LINE'||nn=='CIRCLE'||nn=='ELLIPSE'||nn=='POLYLINE'||nn=='POLYGON') {
if (all_elements[i].className) {
if (all_elements[i].className.baseVal) {
if (all_elements[i].className.baseVal.length > 0) {
if (all_elements[i].style) {
if (all_elements[i].style.length > 0) {
all_classes[all_elements[i].className.baseVal] = all_elements[i].style;
} else {
all_classes[all_elements[i].className.baseVal] = True;
}
} else {
all_classes[all_elements[i].className.baseVal] = True;
}
}
}
}
}
}
oder so (ist jetzt natürlich verkürzt). Man kann auch ein richtiges Objekt dahinter hängen like
all_classes[all_elements[i].className.baseVal] = new Object();
und dann die Style-Angaben als Eigenschaft speichern.
Wie auch immer, das Problem ist, dass all_classes.length immer 0 ergibt, was mich nicht überrascht, ich hab das eh nur geschrieben um zu zeigen was ich will ^^ (komischerweise wirft das allerdings keinen Fehler...)
Also: Ziel der ganzen Geschichte ist alle Klassen und IDs eines SVG-Dokuments zusammen zu tragen, so dass ich sie hinterher auch gut wiederfinde.
Denn anschließend wollte ich die Inline-Styles vielleicht auslagern in ein Style-Element (mal gucken) auf jeden Fall aber möchte ich später auf eine Form (wie shape) klicken und das passende Array-Element gleich finden.
An _ganz_ anderen Lösungen bin ich natürlich auch interessiert.
Mein Problem ist im Grunde, dass JS keine assoziativen Arrays kennt bzw. (soweit ich weiß) nur in Form von Objekten btw. Eigenschaften.
Worin besteht Dein eigentliches Problem? Es besteht doch anscheinend darin, dass Dein assoziatives Array keine lenght hat - Du musst es erst wieder in ein echtes Array umwandeln:
var classes=[];
for (var className in all_classes) {
if (all_classes.hasOwnProperty(className)) { classes.push(className); }
}
Jetzt hast Du in classes ein tatsächliches Array, mit dem Du ganz normal arbeiten kannst.
Gruß, LX
(...) Dein eigentliches Problem (...) besteht doch anscheinend darin, dass Dein assoziatives Array keine lenght hat
Stimmt, das war mir nur nicht bewusst ^^ Danke dass du Licht in meine geistige Dunkelheit brachtest :)
- Du musst es erst wieder in ein echtes Array umwandeln:
Nö, for-in (und das direkte Ansprechen durch in Variablen gespeicherte keys) ist ja genau das was ich will in dem Fall ^^