peterS.: Standardisierung von [getElementsByClassName(s)]

Beitrag lesen

gruss Sven

Ich habe nur 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.

das sind auch die meinen - und damit meine ich, dass man die
konditionierten erwartungshaltungen der nutzer treffen sollte.

ich glaube, man kann sowohl diesen *default* als auch zusaetzliche
funktionalitaet in einunddieselbe methode einbauen, ohne das deren
handhabung wegen *overengineering* aus dem ruder laeuft.

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.

wie sind voellig einer meinung, so hab ich das ja ebenfalls
beschrieben.

Und ich glaube, dass ich nichts davon halte, ein Array als
Parameter zu erlauben. Keine andere getElement-Funktion erlaubt
so etwas bisher ...

der derzeit aktuelle working draft beruecksichtigt dieses von vielen
gebrachte argument und stellt die *string only* variante in aussicht.

... die Frage wäre also zu beantworten, welchen Zusatznutzen
man davon hätte.

genau keinen.

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.

warum eigentlich nicht - bisher wird der erwartungshorizont des oben
fiktiv eingefuehrten konditionierten benutzers doch getroffen. warum
sollte man anwendern, die flexibler sind, nicht auch das werkzeug fuer
mehr flexibilitaet in die hand geben.

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.

richtig.

Wie kriegst du hin, dass "foo,bar baz" alle Elemente findet,
die baz UND (foo ODER bar) angehören.

ein schoenes beispiel fuer unterschiedliche erwartungen - ich
interpretiere "foo, bar baz" folgendermassen: finde alle elemente,
deren [className] "bar" UND "baz" aufweist UND/ODER alle elemente,
deren [className] "foo" aufweist.

der kern ist fuer mich immer der _klassen_name_ (einzahl) ob nun
wirklich alleinstehend oder *white space*-separiert als mutipler
_klassen_name_ ... das ist wurscht.
kommata signalisieren aufzaehlung, also eine liste - die wird dann
als ODER verstanden.

pseudo-code auf dem weg zur ODER liste:

classNames.trim().replace((/\s+/g), " "/*shrink*/).split(",");

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".

es gibt doch aber [getElement*s*ByName] und [getElement*s*ByTagName].

und der methoden-name sollte im zukuenftigen standard auch nicht
[getElementsByClassName] sondern [getElementsByClassName*s*] lauten.

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?

nein, ganz einfach so - pseudocode: elm.className.test(regX);

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.

ich bin da optimistisch - siehe meine anmerkungen dazu weiter oben.

danke fuer die rueckmeldung - so long - peterS. - pseliger@gmx.net

--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]