peterS.: Zusammenfassung, Gedanken und Lösungsansatz für Interessierte.

Beitrag lesen

gruss Markus, hallo Lesende,

document.getElementById('xxx').getElementsByTagName('a');

... der TagName bringt mich nur in keinster weise weiter, da ich ALLE entsprechenden Felder innerhalb von tr Tags habe.

Ich weiß zwar nicht warum es geht aber ich habe es jetzt so gelöst und das klappt: ... ... Ich gebe es als ID an und Frage es über Name ab. Sei es nun konform oder nicht. Es geht.

<q class="altvaeterlich">
   das mag Dir jetzt helfen, aber die haltung dahinter zeugt nicht vom
   wunsch nach wirklichem verstaendnis der materie.
  </q>

schade, dass Du so schnell aufgegeben hast. Struppi haette Dir auf alle   faelle weiter beigestanden und Dir haeppchenweise die informationen   verabreicht, die Dir bei der erarbeitung einer sauberen loesung von   nutzen gewesen waeren.

@alle interessierten:

molily hat seit ende letzten jahrens im und ueber das weblog von SELFHTML   in mehreren artikeln das thema JavaScript breit aufgefaechert und meiner   meinung nach hinreichen genug ausgeleuchtet. wenn ich mir den von molily   gesponnenen roten faden so betrachte, warte ich eigentlich nur noch auf   einen direkt an den letzten artikel (saubere namensraeume) anknuepfenden   beitrag ueber objektorientiertes programmieren und die vielen moeglichen   vererbungsarten in JavaScript. dieser koennte dann auch den vorlaeufigen   abschluss des fast ein jahr waehrenden reviews bilden.

ich finde Markus' beispiel steht fuer einen guten mittelwert hinsichlich   loesungskomplexitaet und anforderungen an das DOM-Scripting, so wie es   heute von der breiten masse an neulingen, fortgeschrittenen und profis   betrieben wird.

hat man sich nun im letzten jahr nur durch folgende beitraege von molily   gearbeitet ...

- Der sinnvolle Einsatz von JavaScript vom 17.12.2005,   - DHTML ist tot vom 01.04.2006,   - JavaScript und Webstandards vom 19.04.2006 und   - Neuer Artikel: Organisation von JavaScripten vom 25.08.2006 bzw. direkt:   - Organisation von JavaScripten

... koennte eine der moeglichen loesungen fuer die vom OP   vorgegebene aufgabe so aussehen (viel kommentierter quael-code):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

  <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
    <meta http-equiv="content-script-type" content="text/javascript" />
    <meta http-equiv="content-style-type" content="text/css" />

    <title>hide-and-show-table-rows.html</title>

    <script type="text/javascript">

      
/*
        das [TableRowController]-Singleton ist eine
        sich selbst initialisierende kontrollstruktur
        fuer tabellenzwischenueberschriften und deren
        zugeordneten tabellenzeilen.

        jede tabelle die einem dem beispiel entsprechenden
        aufbau folgt, wird von diesem controller erfasst.

        dabei bedarf es keiner verrenkungen ueber
        html-attribute wie "name", "id" oder "class".

        das singleton-muster wurde gewaehlt, um die kapselung
        privater und oeffentlicher eigenschaften und methoden
        auf genau einem objekt zu gewaehrleisten.
      */
      var TableRowController = new function () { /* der new-operator erzeugt im zusammenspiel
                                                    mit der ihm folgenden anonymen funktion
                                                    ein objekt. die referenz auf diesen
                                                    anonymen objekt-konstruktor muss dann
                                                    innerhalb desselben maskiert werden.
                                                 */
        this.constructor = Object; /* verhindert, dass ein anderes controller-objekt erzeugt
                                      werden kann -
                                      var otherController = new TableRowController.constructor();
                                      fuehrt nicht mehr zum gewuenschten ergebnis.
                                   */
        var isOnDisplay = function (obj) { // private hilfsmethode.
          var display = "";
          if (document.defaultView && document.defaultView.getComputedStyle) {
            display = document.defaultView.getComputedStyle(obj, "").getPropertyValue("display");
          } else if (obj.currentStyle) {
            display = obj.currentStyle["display"];
          }
          return ((display == "none") ? (false) : (true));
        };

        this.toggleRows = function (obj) { /* oeffentliche methode, die zuvor durch den
                                              prozess "TableRowController.initialize"
                                              fuer jeden passenden tabellenheader-knoten
                                              dessem "onclick"-handler zugewiesen wurde;
                                              steuert das aus- und einklappen der zu diesem
                                              header gehoerenden tabellenzeilen.
                                           */
          var i, rows = [], node = obj.parentNode.nextSibling;
          while (node) {
            if ((node.nodeType == 1) && (node.nodeName.toLowerCase() == "tr")) {

              if (node.getElementsByTagName("th").length === 0) {
                rows.push(node);
              } else {
                break;
              }
            }
            node = node.nextSibling;
          }
          for (i=0; i<rows.length; ++i) {

            node = rows[i];

            if (isOnDisplay(node)) {
              node.style.display = "none";
            } else {
              node.style.display = ((window.attachEvent && !window.addEventListener) ? ("block") : ("table-row"));
            }
          }
        };
        this.initialize = function () { /* oeffentliche methode, die auf den "onload"-
                                           event-handler des browserfensters angemeldet
                                           wurde; parst die DOM-struktur, um fuer die
                                           steuerung passende tabellenheader-knoten
                                           zu finden.
                                        */
          var i, obj, isSubHeader, thCollection = document.getElementsByTagName("th");
          for (i = 0; i<thCollection.length; ++i) {

            obj = thCollection[i].parentNode;
            isSubHeader = true;

            while (obj && (obj.nodeName.toLowerCase() != "table")) {

              if (obj.nodeName.toLowerCase() == "thead") {
                isSubHeader = false;
              }
              obj = obj.parentNode;
            }
            if (isSubHeader) {

              thCollection[i].onclick = function () {
                TableRowController.toggleRows(this);
              };
            }
          }
        };
      }(); // call-operator; fuehrt den anonymen konstruktor gleich nach dessen initialsierung aus.

      if (window.addEventListener) { // initialisierung des controllers anmelden.
        window.addEventListener("load", TableRowController.initialize, true);
      } else if (window.attachEvent) {
        window.attachEvent("onload", TableRowController.initialize);
      }
    
</script>
    <style type="text/css">
      
* {
        margin: 0;
        padding: 0;
        border: none;
      }
      body {
        font-size: 80%;
        font-family: Verdana, Geneva, Helvetica, Arial, sans-serif;
        background-color: #fafafa;
        color: #000;
      }
      table {
        margin: 10px;
        border: 1px solid #000;
        border-collapse: collapse;
      }
      tr, td, th {
        padding: 10px;
        border: 1px solid #000;
      }
      tbody th:hover {
        cursor: pointer;
      }
    
</style>
  </head>

  <body>
    <table>
      <thead>
        <tr>
          <th colspan="3">hide and show table rows</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th colspan="3">sub header 01</th>
        </tr>
        <tr>
          <td>content 01-a-01</td>
          <td>content 01-a-02</td>
          <td>content 01-a-03</td>
        </tr>
        <tr>
          <td>content 01-b-01</td>
          <td>content 01-b-02</td>
          <td>content 01-b-03</td>
        </tr>
        <tr>
          <th colspan="3">sub header 02</th>
        </tr>
        <tr>
          <td>content 02-a-01</td>
          <td>content 02-a-02</td>
          <td>content 02-a-03</td>
        </tr>
        <tr>
          <td>content 02-b-01</td>
          <td>content 02-b-02</td>
          <td>content 02-b-03</td>
        </tr>
        <tr>
          <td>content 02-c-01</td>
          <td>content 02-c-02</td>
          <td>content 02-c-03</td>
        </tr>
        <tr>
          <th colspan="3">sub header 03</th>
        </tr>
        <tr>
          <td>content 03-a-01</td>
          <td>content 03-a-02</td>
          <td>content 03-a-03</td>
        </tr>
      </tbody>
    </table>
  </body>

</html>

aehm ... ja. - 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:]