René: Tabellenzeilen ausblenden

Hallo Gernot

Ich habe Deinen Ratschlag (http://forum.de.selfhtml.org/archiv/2005/3/t103418/) befolgt und die Variante von Cybaer, 14. 03. 2005, 13:32, umgesetzt.

Nun habe ich neue "Herausforderungen":
1. In der ersten Spalte möchte ich gerne ein + bzw - Bild einsetzen, jenachdem, ob es versteckte Zeilen hat oder eben nicht.
2. Die Init-Funktion bewirkt in IE nichts, d.h. die Unterzeilen werden trotzdem angezeigt und in Mozilla verschwindet die ganze Seite.

Herzlichen Dank für Deine Unterstützung

René

  1. Hallo René,

    Nun habe ich neue "Herausforderungen":

    1. In der ersten Spalte möchte ich gerne ein + bzw - Bild einsetzen, jenachdem, ob es versteckte Zeilen hat oder eben nicht.

    Das würde ich so machen:

      
    tbody.hide th {  
      background:url(plus.gif) no-repeat left;  
    }  
      
    tbody.show th {  
      background:url(minus.gif) no-repeat left;  
    }  
    
    
    1. Die Init-Funktion bewirkt in IE nichts, d.h. die Unterzeilen werden trotzdem angezeigt und in Mozilla verschwindet die ganze Seite.

    Dann hast du aber etwas falsch gemacht, bei mir geht das in IE6 und Mozilla 1.7.2 unter Win 98.

    Gruß Gernot

    1. Hallo Gernot

      Herzlichen Dank für den Tip

      Leider habe ich 6 Spalten und jetzt kommt jede mit dem Bild auf der linken Seite.

      tbody.hide th {
        background:url(plus.gif) no-repeat left;
      }

      Dann hast du aber etwas falsch gemacht, bei mir geht das in IE6 und Mozilla 1.7.2 unter Win 98.

      Dann werde ich mal ans Suchen gehen.

      Gruss René

      1. Hallo René,

        Leider habe ich 6 Spalten und jetzt kommt jede mit dem Bild auf der linken Seite.

        tbody.hide th {

        Man könnte hier ___^ das ganze mit einer Klasse z.B.: <th class="erste"> auf die erste Spalte beschränken.

        background:url(plus.gif) no-repeat left;
        }

        oder auch Zellen zusammenfassen

        Gruß Gernot

        1. Hallo Gernot

          Das werde ich probieren.

          Es hat sich noch etwas schwierigeres herausgestellt -
          Meine Tabelle ist innerhalb einer Seite, auf welcher zwischen einzelnen Tabs hin und her gewechselt werden kann.
          Ausserdem hat es noch andere Tabellen auf dieser Seite, d.h. Init() versteckt gleich die ganze Seite :-(.
          Kann ich der Tabelle einen Namen geben, welcher von Init verwendet werden kann?

          Gruss René

          Hallo René,

          Leider habe ich 6 Spalten und jetzt kommt jede mit dem Bild auf der linken Seite.

          tbody.hide th {
          Man könnte hier ___^ das ganze mit einer Klasse z.B.: <th class="erste"> auf die erste Spalte beschränken.
            background:url(plus.gif) no-repeat left;
          }

          oder auch Zellen zusammenfassen

          Gruß Gernot

          1. Hallo René,

            Es hat sich noch etwas schwierigeres herausgestellt -
            Meine Tabelle ist innerhalb einer Seite, auf welcher zwischen einzelnen Tabs hin und her gewechselt werden kann.
            Ausserdem hat es noch andere Tabellen auf dieser Seite, d.h. Init() versteckt gleich die ganze Seite :-(.

            Soso, du hast also ein Tabellenlayout!

            Kann ich der Tabelle einen Namen geben, welcher von Init verwendet werden kann?

            Nein, keinen Namen, sondern eine ID! Ich habe mal Version 5 gebastelt, wobei ich alles zu beherzigen versucht habe, wozu mich Cybear erst unlängst wieder ermahnt hat (immer schön erst die Methoden und Eigenschaften abfragen, bevor man darauf zurückgreift). Aber bestimmt findet der wieder was, was man besser machen sollte!

            Wie folgt kannst du die Dynamik auf die Tabelle mit der ID "dyn" beschränken:

              
            <!doctype html public "-//W3C//DTD HTML 4.0 //EN">  
            <html>  
            <head>  
            <title>Tabellenteile wegblenden - Version 5</title>  
            <meta name="author" content="Gernot Back">  
            <meta name="generator" content="Ulli Meybohms HTML EDITOR">  
            <style type="text/css">  
            [code lang=css]  
            table#dyn {  
              width:100%;  
              border-collapse:collapse;  
              border:solid 1px #000000;  
            }  
              
            table#dyn th {  
              border-top:solid 1px #000000;  
            }  
              
            table#dyn tbody.hide th {  
              background:url(plus.gif) no-repeat left;  
            }  
              
            table#dyn tbody.show th {  
              background:url(minus.gif) no-repeat left;  
            }  
              
            table#dyn tbody.hide td{  
              display:none;  
            }  
              
            table#dyn tbody.show td{  
              display:table-cell;  
              border:solid 1px #000000;  
            }  
            
            

            </style>
            <script type="text/javascript" language="JavaScript">

              
            var dynamic;  
              
            function init () {  
              if(document.all) {  
                var grupos = document.all.dyn.all.tags('tbody');  
              } else {  
                if(document.getElementById && document.getElementsByTagName) {  
                  var grupos = document.getElementById('dyn').getElementsByTagName('tbody');  
                } else {  
                  dynamic = false;  
                  return;  
                }  
              }  
              dynamic = true;  
              for (i=0; i<grupos.length; i++ ) {  
                 grupos[i].className='hide';  
              }  
            }  
              
            function einaus (was) {  
              if(dynamic) {  
                var gruppe = was.parentNode.parentNode;  
                if(gruppe.className=='hide') {  
                  gruppe.className='show';  
                } else {  
                  gruppe.className='hide';  
                }  
              }  
            }  
            
            

            </script>
            </head>
            <body>
            <table id="dyn">
            <tbody>
            <tr>
            <th colspan="2" onClick="einaus(this)">Gruppe A</th>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            </tbody>
            <tbody>
            <tr>
            <th colspan="2" onClick="einaus(this)">Gruppe B</th>
            </tr>
            <tr>
            <td>Jetzt schreib ich hier mal was rein</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            </tbody>
            <tbody>
            <tr>
            <th colspan="2"onClick="einaus(this)">Gruppe C</th>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            </tr>
            <tr>
            <td>&nbsp;</td>
            <td>... und hier auch was</td>
            </tr>
            <tr>
            <td colspan="2" style="display:none"><script type="text/javascript">init()</script></td>
            </tr>
            </tbody>
            </table>
            </body>
            </html>
            [/code]

            Gruß Gernot

            1. Hi,

              wozu mich Cybear erst unlängst wieder ermahnt hat

              Wer? Anglizismus! =;-o

              (immer schön erst die Methoden und Eigenschaften abfragen, bevor man darauf zurückgreift).

              Na ja, *immer* mache ich das auch nicht. =;-)

              Aber bestimmt findet der wieder was, was man besser machen sollte!

              Hmm, so ist es. :-o

              [code]

              [code lang=html] ;-)

              <script type="text/javascript" language="JavaScript">

              Es kann nicht schaden, das Script mit "<!--" auszukommentieren. ;-)

              OK, jetzt aber ernsthaft:

              dynamic = false;

              Das globale dynamic ist falsch ermittelt. Eigentlich ist es auch überflüssig. Denn ...

              if(document.getElementById && document.getElementsByTagName) {
                dynamic = true;

              ... Du ermittelst damit nur, daß getElement.../all existiert.

              Was Du aber wissen mußt, ist, ...

              for (i=0; i<grupos.length; i++ ) {
                   grupos[i].className='hide';

              ... ob die Eigenschaft className existiert. Dummerweise gibt es aber den Fall, daß ein Browser ersteres kennt, letzteres aber nicht! =:-o

              Ergo: dynamic raus und obige Schleife z.B. umklammern mit

              if(grupos[0] && typeof(grupos[0].className)!="undefined") {

              Analog kann man in einaus() statt ...

              if(dynamic) {

              ... auch gleich

              if(typeof(document.getElementsByTagName("body")[0].className)!="undefined") {

              schreiben. Dann hat man eine globale Variable weniger und die Funktion ist auch noch "stand-alone".

              Und wenn man schon dabei ist, dann kann man auch gleich noch abfragen, ob parentNode überhaupt existiert (bzw. der Node/die Nodes selbst), was dann ergibt:

              if(was && typeof(was.className)!="undefined" && was.parentNode && was.parentNode.parentNode) {

              </script>

              Der Vollständigkeit halber: Falls man auskommentiert, kommt hiervor natürlich noch ein "//-->". ;-)

              Gruß, Cybaer

              PS: Wer es *ganz* sauber machen will (also auch für Uralt-Browser), der muß jetzt allerdings das Script auslagern (typeof() existiert erst ab JS 1.1).

              Aber der nimmt statt &nbsp; ohnehin &#160; ... ;-)

              --
              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
              1. Hallo Cybaer,

                wozu mich Cybear erst unlängst wieder ermahnt hat

                Wer? Anglizismus! =;-o

                Entschuldige, ich tummel mich auf so vielen internationalen Bärenseiten, dass ich manchmal durcheinanderkomme. Da gibt es auch immer wieder Cy-Bären in allen Schreibweisen. ;-)

                <script type="text/javascript" language="JavaScript">

                Es kann nicht schaden, das Script mit "<!--" auszukommentieren. ;-)

                Das mach ich auch immer, nur hier aus Gründen des Syntax-Highlightings (Anglizismus für "Bunti-Bunti") nicht.

                OK, jetzt aber ernsthaft:

                Habe alle deine Anregungen übernommen, bis auf:

                if(typeof(document.getElementsByTagName("body")[0].className)!="undefined") {

                Da müsste ich doch auch noch abfragen, wie das mit dem entsprechenden all.tags('body')[0].classname aussieht.

                PS: Wer es *ganz* sauber machen will (also auch für Uralt-Browser), der muß jetzt allerdings das Script auslagern (typeof() existiert erst ab JS 1.1).

                Aber der nimmt statt &nbsp; ohnehin &#160; ... ;-)

                Das erschien mir dann auch übertrieben.

                Gruß Gernot

                1. Hallo Gernot
                  Hallo Cybaer

                  Ich möchte mich ganz herzlich für Eure Unterstützung und Euren enormen Einsatz bedanken.
                  Ich werde mich jetzt wieder ins Kämmerchen zurückziehen und versuchen zu verstehen und umzusetzen, was Ihr mich gelernt habt.

                  Danke und einen schönen Tag.
                  René

                  1. Hi,

                    Ich möchte mich ganz herzlich für Eure Unterstützung und Euren enormen Einsatz bedanken.

                    Bitte und keine Ursache und zuviel der Ehre. ;-)

                    Ich werde mich jetzt wieder ins Kämmerchen zurückziehen und versuchen zu verstehen und umzusetzen, was Ihr mich gelernt habt.

                    Du bist Westfale? Hallo Landsmann. :-)

                    Gruß, Cybaer

                    --
                    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                    1. Grüezi Cybaer

                      Du bist Westfale? Hallo Landsmann. :-)

                      Kein Westfale. Schweizer aus Zürich.

                      Gruss René

                      1. Hi,

                        Du bist Westfale? Hallo Landsmann. :-)
                        Kein Westfale. Schweizer aus Zürich.

                        LOL, OK: Gruezi.

                        und umzusetzen, was Ihr mich gelernt habt.

                        -> "was ihr mich gelehrt habt".

                        Diese Formulierung fiel im, halt ansonsten guten Deutsch, a) auf und b) ist diese Verwechslung in meiner alten Heimat absolut üblich. :-)

                        Gruß, Cybaer

                        --
                        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                        1. Hallo Cybaer

                          Danke fürs aufmerksam machen, hab ich glatt übersehen.

                          Eine kleine Auflockerung zu diesem und ähnlichen Themen:
                          http://www.spiegel.de/kultur/zwiebelfisch/0,1518,350958,00.html

                          Gruss René

                          Hi,

                          Du bist Westfale? Hallo Landsmann. :-)
                          Kein Westfale. Schweizer aus Zürich.

                          LOL, OK: Gruezi.

                          und umzusetzen, was Ihr mich gelernt habt.

                          -> "was ihr mich gelehrt habt".

                          Diese Formulierung fiel im, halt ansonsten guten Deutsch, a) auf und b) ist diese Verwechslung in meiner alten Heimat absolut üblich. :-)

                          Gruß, Cybaer

                          1. Hi,

                            Eine kleine Auflockerung zu diesem und ähnlichen Themen:
                            http://www.spiegel.de/kultur/zwiebelfisch/0,1518,350958,00.html

                            Hui, hier tut ein kleiner Tip an einen Nicht-Deutschen wohl Not: Erwähne nie Rheinländer und Westfalen in einem Atemzug! Daß sie in einem Bundesland leben, hat keinerlei (positive) Bedeutung! =;-) Aber das dürfte bei diversen Landsmannschaften in euren Kantonen ja auch nicht anders sein. ;-)

                            BTW: Lieblingskolumne - von nichts kommt nichts. ;-)

                            Gruß, Cybaer

                            --
                            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                            1. Hallo Cybaer

                              Ich werde mir den Tip zu Herzen nehmen.

                              Gruss René

                2. Hi,

                  Entschuldige, ich tummel mich auf so vielen internationalen Bärenseiten, dass ich manchmal durcheinanderkomme. Da gibt es auch immer wieder Cy-Bären in allen Schreibweisen. ;-)

                  Verkommen die Idee zu schnödem Allerwelts-Pseudo ... (schnüff) ;-)

                  Das mach ich auch immer, nur hier aus Gründen des Syntax-Highlightings (Anglizismus für "Bunti-Bunti") nicht.

                  :)

                  Da müsste ich doch auch noch abfragen, wie das mit dem entsprechenden all.tags('body')[0].classname aussieht.

                  Jo, da hascht Recht, löst aber das Problem halt nicht. OK, man kann natürlich sagen, sollen die wenigen User doch gefälligst ihre Browser wechseln/updaten ;-). Ich schlage vor:

                  function init () {
                  var grupos=false;
                  if(document.all) {
                     grupos = document.all.dyn.all.tags('tbody');
                  } else if(document.getElementById && document.getElementsByTagName) {
                     grupos = document.getElementById('dyn').getElementsByTagName('tbody');
                  }
                  if(grupos && typeof(grupos[0].className)!="undefined") {
                    for (i=0; i<grupos.length; i++ ) {
                       grupos[i].className='hide';
                    }
                  }
                  }

                  Aber auch so ließe sich noch einiges verbessern. Sehr sinnvoll fände ich z.B., "dyn" als Parameter zu übergeben. Dann könnte man dann auch noch mehrere Tabellen in einer Seite bedienen - und Universilität ist ja ohnehin nicht zu verachten ... ;-)

                  Das erschien mir dann auch übertrieben.

                  Klar ("PS" & "ich mein ja bloß"). ;-)

                  Gruß, Cybaer

                  PS: Wobei *ich* es natürlich auf *jeden* Fall vollständig abgesichert machen würde. ;-)

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                3. Hallo Gernot

                  Wäre es möglich, wenn Du die beiden Scripts an dieser Stelle darstellen könntest?

                  Danke für Deine Unterstützung.
                  Gruss René

                  1. Hallo René,

                    Wäre es möglich, wenn Du die beiden Scripts an dieser Stelle darstellen könntest?

                      
                    function init () {  
                      if(document.all && document.all.tags) {  
                        var grupos = document.all.dyn.all.tags('tbody');  
                      } else {  
                        if(document.getElementById && document.getElementsByTagName) {  
                          var grupos = document.getElementById('dyn').getElementsByTagName('tbody');  
                        } else {  
                          return;  
                        }  
                      }  
                      if(grupos[0] && typeof(grupos[0].className)!="undefined") {  
                        for (i=0; i<grupos.length; i++ ) {  
                           grupos[i].className='hide';  
                        }  
                      }  
                    }  
                      
                    function einaus (was) {  
                      
                    if(was && typeof(was.className)!="undefined" && was.parentNode && was.parentNode.parentNode) {  
                        var gruppe = was.parentNode.parentNode;  
                        if(gruppe.className=='hide') {  
                          gruppe.className='show';  
                        } else {  
                          gruppe.className='hide';  
                        }  
                      }  
                    }  
                    
                    

                    Über die von Cybaer angeregte Variante mit Parameterübergabe zum Bedienen mehrerer Tabellen auf einer Seite denke ich noch nach. Vielleicht kann man es ja auch mit getElementsByClassName() machen, da ich ungern andere Parameter als this übergebe.

                    Gruß Gernot

                    1. Hi,

                      Vielleicht kann man es ja auch mit getElementsByClassName() machen, da ich ungern andere Parameter als this übergebe.

                      =:-)

                      Du kannst auch die CSS-Regel selbst verändern. Dann brauchst Du überhaupt keinen Parameter mehr. ;-)

                      Gruß, Cybaer

                      --
                      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                      1. Hallo Cybaer,

                        Vielleicht kann man es ja auch mit getElementsByClassName() machen, da ich ungern andere Parameter als this übergebe.

                        Das habe ich gerade gebaut, funktioniert auch schon in all meinen Testbrowsern.

                        Du kannst auch die CSS-Regel selbst verändern. Dann brauchst Du überhaupt keinen Parameter mehr. ;-)

                        Klar muss ich ja sowieso, auch bei der oben angedeuteten Methode: Aus Individualselektoren (#) werden dann Klassenselektoren (.).

                        Die zu dynamisierenden Tabellen tragen jetzt den Klassennamen class="dyn" in meiner Version 6.

                        So komme ich ohne Übergabeparameter aus. Hattest du eine andere Idee?

                        Gruß Gernot

                        1. Hallo nochmal,

                          Die zu dynamisierenden Tabellen tragen jetzt den Klassennamen class="dyn" in meiner Version 6.

                          So komme ich ohne Übergabeparameter aus. Hattest du eine andere Idee?

                          bei grupos-Elementen:
                          if(parentNode.className=='dyn')
                          Ich seh schon, das ist einfacher!

                          Gruß Gernot

                        2. Hi,

                          So komme ich ohne Übergabeparameter aus. Hattest du eine andere Idee?

                          =:-)

                          Ja: Wenn Du die Regel mit JS selbst änderst, dann brauchst Du *keinerlei* Parameter!

                          Also ein Dummy-Klasse (".toggle { }"), die Zuweisung zu den betreffenen Elementen ("class='toggle'") und dann dynamisch in die Klasse reinschreiben, was Du gerade brauchst ("onClick='einaus();'"). Da ist selbst this überflüssig, da Du nicht die Objekte, sondern die Regel manipulierst.

                          Gruß, Cybaer

                          PS: Ich mein ja bloß. Das ist doch *die* Lösung für Parameterhasser! ;-)

                          --
                          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                          1. Hallo Cybaer,

                            Also ein Dummy-Klasse (".toggle { }"), die Zuweisung zu den betreffenen Elementen ("class='toggle'") und dann dynamisch in die Klasse reinschreiben, was Du gerade brauchst ("onClick='einaus();'"). Da ist selbst this überflüssig, da Du nicht die Objekte, sondern die Regel manipulierst.

                            also ich glaube, mein Ansatz ist immer noch ein anderer, ich habe es mal hochgeladen.

                            http://www.sprachlernspiele.de/selftests/klapptabelle/version6.html

                            Allerdings funktioniert das nicht unter IE6. Beide Zeilen der Funktion init(), im folgenden mit "// diese" markiert, funktionieren einzeln auch im IE6; nur nicht zusammen. In den anderen Browsern ist das kein Problem. Der IE tauscht aber in der vorliegenden Version nur die Hintergrundgrafik aus, klappt die Zeilen aber nicht mehr auf. Wenn ich statt über die className- über das style-Eigenschaft gehe, dann klappt aber auch beides zusammen. Hast du eine Erklärung dafür?

                              
                                     grupos[i].className='hide';  
                                     var j = 0;  
                                     while(grupos[i].childNodes[j].nodeName!='TR'){  
                                       j++;  
                                     }  
                                     grupos[i].childNodes[j].onclick = onOff; // diese  
                                     var k = 0;  
                                     while(grupos[i].childNodes[j].childNodes[k].nodeName!='TH'){  
                                       k++;  
                                     }  
                                     grupos[i].childNodes[j].childNodes[k].className='first'; //diese  
                            
                            

                            Ich habe versucht ein Skript zu schreiben, das man nur noch so wie es ist einbinden muss, den zu dynamisierenden Tabellen die Klasse class="dyn" verpassen, alles andere, inklusive der Eventhandler und der jeweils ersten TH-Zelle findet sich von allein.

                            Ich habe übrigens den Aufruf der Funktion init() wieder aus der Tabelle selbst herausgenommen und wieder in den onload-Eventhandler des Window-Obkektes gepackt, denn das bringt bei mehreren Tabellen ja sonst nichts.

                            Gruß Gernot

                            1. Hi,

                              also ich glaube, mein Ansatz ist immer noch ein anderer, ich habe es mal hochgeladen.

                              Ein *komplett* anderer - und, mit Verlaub, es wird ja immer komplizierter! =:-o

                              Und je komplizierter Du programmierst, desto besser gefällt mir meine Idee - zumal sie ja ganz ohne Schleifen auskommt - und ohne "parentNodes", "childNodes", "nodeNames" und "classNames". :)

                              Hast du eine Erklärung dafür?

                              Nein. :-o

                              Ich habe übrigens den Aufruf der Funktion init() wieder aus der Tabelle selbst herausgenommen und wieder in den onload-Eventhandler des Window-Obkektes gepackt, denn das bringt bei mehreren Tabellen ja sonst nichts.

                              Für mich ist die sichtbar nachträgliche (massive) Änderung des Contents ein echtes Ausschlußkriterium (und als Surfer ein echter Abtörner) - aber das muß ja jeder selbst wissen.

                              Das "Problem" wäre zu lösen, indem man dem init() einen Parameter mitgibt, damit die Funktion weiß, welche Tabelle einzuklappen ist. Alternativ könnte die Funktion aber auch einfach selbst nachschauen und die jeweils letzte passende Tabelle einklappen (zum Zeitpunkt der Ausführung ist es ja definitiv die letzte - erst danach kommt ggf. eine weitere, die es einzuklappen gilt, was dann aber vom dortigen init() gemacht wird, die die *dann* letzte passende Tabelle einklappt. 8-)

                              Gernot (streng im Ton werd! ;-)): Ein wenig mehr Programmierer-Kreativität darf schon sein! =;-))

                              Gruß, Cybaer

                              --
                              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                              1. Hallo Cybaer,

                                Und je komplizierter Du programmierst, desto besser gefällt mir meine Idee - zumal sie ja ganz ohne Schleifen auskommt - und ohne "parentNodes", "childNodes", "nodeNames" und "classNames". :)

                                Nur verstehe ich immer noch nicht, wie du das mit dem "Regel-Ändern" meinst

                                Für mich ist die sichtbar nachträgliche (massive) Änderung des Contents ein echtes Ausschlußkriterium (und als Surfer ein echter Abtörner) - aber das muß ja jeder selbst wissen.

                                Das stimmt, das finde ich auch nicht schön.

                                Das "Problem" wäre zu lösen, indem man dem init() einen Parameter mitgibt, damit die Funktion weiß, welche Tabelle einzuklappen ist.

                                Das habe ich mit init(this) versucht, aber die ParentNodes des Skriptbereichs und damit letztlich die Tabelle waren so nicht zu ermitteln: "undefined"

                                Alternativ könnte die Funktion aber auch einfach selbst nachschauen und die jeweils letzte passende Tabelle einklappen (zum Zeitpunkt der Ausführung ist es ja definitiv die letzte - erst danach kommt ggf. eine weitere, die es einzuklappen gilt, was dann aber vom dortigen init() gemacht wird, die die *dann* letzte passende Tabelle einklappt. 8-)

                                Gernot (streng im Ton werd! ;-)): Ein wenig mehr Programmierer-Kreativität darf schon sein! =;-))

                                Ich werde mal versuchen, die jeweils letzte Tabelle während des Ladevorgangs mit
                                document.all.tags('table')[document.all.tags('table').length-1]
                                bzw.
                                document.getElementsByTagName('table')[document.getElementsByTagName('table').length-1]
                                anzusprechen. Recht so?

                                Gruß Gernot

                                1. Hi,

                                  Nur verstehe ich immer noch nicht, wie du das mit dem "Regel-Ändern" meinst

                                  Hmm, das Ändern der Regel *selbst* (Objekt styleSheets) mittels cssText oder setAttribute()?!

                                  Das geht wunderbar, abgesehen vom Umstand, daß IE- und W3C-DOM die @import-Styles so unterschiedlich handhaben, daß man hier wohl keine wirklich einfache Lösung erreichen kann. Aber das muß ja auch nicht sein.

                                  Das habe ich mit init(this) versucht, aber die ParentNodes des Skriptbereichs und damit letztlich die Tabelle waren so nicht zu ermitteln: "undefined"

                                  Jo, klar.

                                  document.getElementsByTagName('table')[document.getElementsByTagName('table').length-1]
                                  anzusprechen. Recht so?

                                  *Genau* so habe ich es gemeint. :-))

                                  Ich würde allerdings nunmehr auf all komplett verzichten(!) und *nur noch* mit getElement... arbeiten! Denn der IE beherrscht ja ab 5.x auch getElement..., und der 4er hat wohl Probleme, mit dem Auslesen dieser Informationen, während die Seite noch erstellt wird.

                                  Also 4er-Nutzer müßten verzichten, dafür wird der Code sauberer und kleiner. Eine IMHO einfache Entscheidung. :-))

                                  Gruß, Cybaer

                                  --
                                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                                  1. Hallo Cybaer,

                                    Hmm, das Ändern der Regel *selbst* (Objekt styleSheets) mittels cssText oder setAttribute()?!

                                    Das geht wunderbar, abgesehen vom Umstand, daß IE- und W3C-DOM die @import-Styles so unterschiedlich handhaben, daß man hier wohl keine wirklich einfache Lösung erreichen kann. Aber das muß ja auch nicht sein.

                                    Dann ist meine Lösung vielleicht gar nicht komplizierter (38 Zeilen reiner JS-Code)!

                                    Ich habe mal Version 6 hochgeladen, damit hier nicht der Eindruck ensteht, man könne nicht auch dem IE etwas Brauchbares liefern. Die vielen If-Abfragen von Methoden und Eigenschaften erscheinen mir allerdings angesichts der Tatsache, dass ein falscher HTML-Code mit diesem Skript (z.B. fehlende TR-Elemente) böse Endlosschleifen bewirken kann mittlerweile überdimensioniert. Davor sei also gewarnt.

                                    http://www.sprachlernspiele.de/selftests/klapptabelle/version6_1.html

                                    Ich habe hier mal mit Weitenangaben für die Zellen und table-layout:fixed gearbeitet, außerdem mit einer diktengleichen Schrift in den TH-Elementen, damit nicht so viel "Zappeln beim Klappen" ist.

                                    Ich würde allerdings nunmehr auf all komplett verzichten(!) und *nur noch* mit getElement... arbeiten! Denn der IE beherrscht ja ab 5.x auch getElement..., und der 4er hat wohl Probleme, mit dem Auslesen dieser Informationen, während die Seite noch erstellt wird.

                                    Mir geht es ja auch um Opera7, der -wir hatten das Thema ja unlängst- mit document.all.tags deutlich schneller zu arbeiten scheint, als mit document.getElementsByTagName, insbesondere dann, wenn es viele entsprechende Elemente des übergebenen TagNames gibt.

                                    Gruß Gernot

              2. Hallo Cybaer

                Wo verwendet Gernot [Code] wo es [code lang=html] heissen müsste?

                Gruss
                René

                Hmm, so ist es. :-o

                [code]
                [code lang=html] ;-)

                1. Hi,

                  Wo verwendet Gernot [Code] wo es [code lang=html] heissen müsste?

                  Sieh mal in das Antwortfeld des Forums! Das sind (eigentlich unsichtbare) Steueranweisungen zur Formatierung von gepostetem Quelltext, die Du im zitieren Text sehen kannst. :-)

                  Gruß, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        2. Hallo Gernot

          Irgendwie funktioniert dies nicht:

          table#dyn tbody.hide <th class="first"> {
            background:url(/img/more.jpg) no-repeat left;
          }
                    HTP.P('<th class="first" onclick="einaus(this)" align="center"></th>');

          und
          table#dyn tbody.hide th {
            background:url(/img/more.jpg) no-repeat left;
          }
          zeigt mir wie gehabt die Bilder in allen Zellen.
          Was mache ich falsch?

          Gruss René

          tbody.hide th {
          Man könnte hier ___^ das ganze mit einer Klasse z.B.: <th class="erste"> auf die erste Spalte beschränken.
            background:url(plus.gif) no-repeat left;
          }

          1. Hallo René,

            tbody.hide th {
            Man könnte hier ___^ das ganze mit einer Klasse z.B.: <th class="erste"> auf die erste Spalte beschränken.
              background:url(plus.gif) no-repeat left;
            }

            Aber so:

              
            table#dyn tbody.hide th.first {  
              background:url(/img/more.jpg) no-repeat left;  
            }  
            
            

            Du soltest dich als nächstes aber mal gründlich mit
            http://de.selfhtml.org/css/formate/zentrale.htm
            beschäftigen, das sind die Grundlagen.

            Gruß Gernot

            1. Hallo Gernot

              Herzlichen Dank.
              So funktionierts.

              Ich nehme mir Deinen Ratschlag gerne zu Herzen.

              Noch einen schönen Tag.
              René

  2. Hi,

    1. In der ersten Spalte möchte ich gerne ein + bzw - Bild einsetzen, jenachdem, ob es versteckte Zeilen hat oder eben nicht.

    Wie soll man die 1. Spalte sehen, wenn die ganze Zeile versteckt wird?

    und die Variante von Cybaer, 14. 03. 2005, 13:32, umgesetzt

    BTW - auch wenn ich sie "verbessert" hatte: Ich bin kein "Anhänger" dieser Routine, da auch die eingeklappten Zeilen noch Platz wegnehmen (sieht IMHO unschön/ungleichmäßig aus).

    Sollte ein +/- voranstehen, dann würde ich eine Tabelle mit 2 Spalten machen:
    1. Grafik
    2. Content

    Den Content (z.B. mit <span> umschlossen) würde ich ausblenden, die Grafik in Abhängigkeit des Status' laden.

    Das bedürfte allerdins einer anderen Routine. Mit Coding: Darstellungswechsel - Un-/Sichtbare Elemente: Ein-/Ausklappen, Verstecken, Transparenz, Farbe kannst Du beliebige ELemente ausblenden, nicht nur spezifische wie in der Routine aus http://forum.de.selfhtml.org/archiv/2005/3/t103418/.

    1. Die Init-Funktion bewirkt in IE nichts, d.h. die Unterzeilen werden trotzdem angezeigt und in Mozilla verschwindet die ganze Seite.

    Ohen Source kann man da wohl nichts zu sagen. Meine Routine lief ja (deswegen hatte ich sie ja auch gepostet ;-)).

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!