Gunnar Bittersmann: document.getElementsByName

Beitrag lesen

@@blumentopf:

nuqneH

Ich benutze document.getElementsByName um mehrere Objekte, die alle den gleichen Namen haben,  auf einmal anzusprechen. Leider "muss stets mit Array-Syntax auf die Elemente zugegriffen werden".

Nö, muss nicht. Sollte man nicht.

Wie man mit Array und Schleife umgeht, wurde dir ja schon gesagt; nicht aber, wie man das ohne macht:

Du gibst, wenn all diese Elemente mit @name="foo" ausgeblendet werden sollen, per JavaScript einem gemeinsamen Vorfahrenelement von diesen (das kann ein Element mit @id="bar" sein oder auch body) eine Klasse "compact":
  document.getElementById("bar").className = "compact";
bzw.
  document.body.className = "compact";

Die Regel zum Ausblenden steht im Stylesheet:
  .compact [name="foo"] { display: none }

Wenn du wieder einblenden willst, nimmst du die Klasse "compact" wieder weg:
  document.getElementById("bar").className = null;
bzw.
  document.body.className = null;

(Wenn das Element noch andere Klassenzugehörigkeiten hätte, wäre das Wegnehmen etwas komplizierter.)

Wenn das Ganze auch in Uralt-Browsern funktionieren soll, die den Attributselektor noch nicht kennen, gibst du allen Elementen mit @name="foo" zusätzlich noch @class="baz" und verwendest den Klassenselektor:
  .compact .baz { display: none }

Derartiges Aus- und Einblenden sollte im Browser schneller sein, denn es müssen nicht erst alle betreffendenden Elemente per getElementsByName() aus dem DOM rausgesucht werden.

Außerdem ist es sowieso kein guter Stil, Stile per JavaScript zu manipulieren. Was, wenn später mal nicht versteckt, sondern auf andere Art dargestellt werden soll? Eine kleine Änderung im Stylesheet (ja im Stylesheet, wo man Darstellungsangaben macht!):
  .compact [name="foo"] { opacity: 0.3 }

Das JavaScript ändert sich nicht. (Die Programmlogik bleibt ja auch dieselbe.)

Qapla'

--
Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
(Mark Twain)