Sven Rautenberg: Standardisierung von [getElementsByClassName(s)]

Beitrag lesen

Moin!

ich weiss, dass es einige muehe kostet, sich in den aktuellen stand der
dinge einzulesen. trotzdem, oder besser sogar dessen ungeachten, moechte
ich von Euch wissen, was Ihr von einer solchen methode hinsichtlich design
(anzahl, typ, namen der argumente) und  arbeitsweise (bedingungen fuer
(un)gueltige matches - typ der zurueckzugebenden trefferliste) erwartet.

Ich habe nur <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2006-October/007407.htmlqtitle=diese Zusammenfassung> vom Oktober letzten Jahres durchgelesen, und außerdem die derzeitige Spec.

Meine Anforderungen an getElementsByClassName sind:
1. Konsistenz innerhalb Javascript
2. Konsistenz innerhalb der restlichen Umgebung.

Zu 1.
Konsistenz innerhalb von Javascript betrifft erstmal die Rückgabe - und da ist ja auch keinerlei Diskrepanz. gEBCN() liefert genau dasselbe zurück, was alle getElements-Funktionen zurückliefern, ein Array von Nodes.

Als Parameter sollte die Funktion aber ebenso einfach gestrickt sein, also ebenso einen String entgegennehmen, der sagt, welche Elemente gemeint sind.

Und da kommen wir dann zu 2.
Konsistenz innerhalb der restlichen Umgebung. Das meint erst einmal HTML und CSS (alles andere wie SVG, MathML etc. basiert auf den Erfahrungen und Vorgaben von HTML).

In HTML schreibe ich "<p>", in CSS selektiere ich "p", und in Javascript nehme ich getElementsByTagName("p"). Überall "p".

In HTML schreibe ich id="foo", in CSS selektiere ich "#foo", und in Javascript nehme ich getElementById("foo"). Überall "foo".

In HTML schreibe ich class="bar", in CSS selektiere ich ".bar", und in Javascript erwarte ich getElementsByClassName("bar"). Überall "bar".

Soweit ganz einfach. Aber es sind ja mehrere Klassennamen pro HTML-Attribut erlaubt:

In HTML schreibe ich class="foo bar", in CSS selektiere ich ".foo.bar", in Javascript getElementsByClassName("foo bar").

Da die Reihenfolge der Klassennamen in HTML und CSS nicht relevant ist, darf sie auch in Javascript nicht relevant sein. Ich muß also foo und bar in allen drei Sprachen vertauschen können, und trotzdem muß dasselbe rauskommen.

Im Prinzip sollte sich getElementsByClassName() eben so verhalten, wie sich die CSS-Selektoren auch verhalten - halt eingegrenzt auf den Klassennamen.

Und ich glaube, dass ich nichts davon halte, ein Array als Parameter zu erlauben. Keine andere getElement-Funktion erlaubt so etwas bisher (was deshalb auch ziemlich gut ausschließt, dass es mal soweit kommen wird, weil man das nicht einfach herausfinden kann), die Frage wäre also zu beantworten, welchen Zusatznutzen man davon hätte.

Die Argumentation lautet: Mit Arrays könnte man mehrere Klassennamen übergeben, die auch Leerzeichen als Namensbestandteil enthalten, weil das Leerzeichen nicht als Trennzeichen genutzt wird. Das halte ich allerdings nicht für stichhaltig, da alle bisherigen Anwendungen den Klassennamen als leerzeichenseparierten String definieren. Dieser theoretische Fall, dass irgendeine künftige Sprache sich ein anderes Zeichen ausdenkt, dürfte vermutlich erfolgreich dadurch verhindert werden, dass man ihn jetzt nicht berücksichtigt.

es gibt nur ein *one fits all* argument fuer die suche - nennen wir es
[classNames]. dieses darf sowohl [string]-value/[String]-objekt als auch
[RegExp]-objekt sein.

Implementiert irgendeine der anderen getElement-Methoden das RegExp-Objekt als Parameter? Wenn nein, dann soll es auch für Klassennamen nicht erlaubt sein.

der string-typ erlaubt es, die zu suchenden klassennamen sowohl nur
kommasepariert als auch nur *white space*-separiert als auch in einer
mischung aus beiden zu notieren.
*white space*-separierte klassennamen werden als mutiple klasse erkannt.
kommaseparierte klassennamen werden wie eine ODER liste zu suchender
klassennamen behandelt.

Du meinst: "foo bar" findet alle Elemente, die foo UND bar als Klasse haben.
"foo,bar" findet alle Elemente, die foo ODER bar haben.

Wie kriegst du hin, dass "foo,bar baz" alle Elemente findet, die baz UND (foo ODER bar) angehören. Und wenn das so hingekriegt ist, wie definierst du in deinem String dann die Suche nach foo ODER (bar UND baz)?

Zudem: Kommaseparierung ist ebenfalls in keiner anderen getElement-Methode implementiert. Es wäre wohl sicherlich nett, getElementsById("header,footer,navi") zu machen und dann drei Elemente zurückzukriegen - aber die Methode enthält nicht umsonst getElement -> "nur EIN Element, nicht mehrere".

der regulaere ausdruck wird von der methode direkt als filter eingesetzt.

Wie soll das wirken? Wirkt der RegEx auf den in HTML definierten class-String, also mit Leerzeichen? Oder wirkt er auf die separierten Klasseneinzelbezeichner? Und wie kriegst du das konsistent mit den restlichen getElement-Methoden vereinbart? Schlechte Aussichten für dein RegEx-Objekt als Parameter, würde ich sagen.

- Sven Rautenberg

--
"Love your nation - respect the others."