Look: Validator mag Tabelle nicht

Hy,

bei der nachfolgenden Tabelle meldet der Validator, dass das "head"-Endtag und "table"-Endtag nicht geschlossen ist.

http://www.fairtradeshop.de/Tabelle.html

Die Tabelle soll/wird per Script mit Zellen gefüllt, eventuell mag er das nicht, dann versteh ich aber trotzdem die Meldung nicht.

Weiss jemand, was dem zugrunde liegt ?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1">
</head>
<body>
<div id="ebene01"><table></table></div>
</body>
</html>

Mfg Look

  1. Moin Look,

    Die Tabelle soll/wird per Script mit Zellen gefüllt, eventuell mag er das nicht, dann versteh ich aber trotzdem die Meldung nicht.

    Dein HEAD ist unvollständig, es fehlt <title></title>, auch dein Tabelle ist nicht vollständig.

    Grüsse
    Mike

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. Moin Mike,

      Dein HEAD ist unvollständig, es fehlt <title></title>, auch dein Tabelle ist nicht vollständig.

      Ok, mit der Minimalausstattung einer Tabelle (1 x Tagpaar tr + 1 x Tagpaar td) sowie dem title-tag ist der Code valide, aber wie gesagt:

      Die Tabelle wird per Script insertRow(x) und insertCell(x) mit Zellen gefüllt - jetzt muss ich anscheinend doch eine "reale" Reihe mit einer Zelle einfügen, damit das Konstrukt valide ist ... ?!

      Mfg Look

      1. Moin Look,

        Die Tabelle wird per Script insertRow(x) und insertCell(x) mit Zellen gefüllt - jetzt muss ich anscheinend doch eine "reale" Reihe mit einer Zelle einfügen, damit das Konstrukt valide ist ... ?!

        Die Ausgabe deines Scriptes sollte dann valide sein, dein Gerüst ist es aber nicht.

        Grüsse
        Mike

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
      2. Tachchen!

        Die Tabelle wird per Script insertRow(x) und insertCell(x) mit Zellen gefüllt - jetzt muss ich anscheinend doch eine "reale" Reihe mit einer Zelle einfügen, damit das Konstrukt valide ist ... ?!

        Also ist deine später erscheinende Tabelle valide.
        Den Validator stört es genau gar nicht, woher der Code kommt.

        Gruß

        Die schwarze Piste

        --
        ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
        http://www.smartbytes.de
        1. Hallo,

          Also ist deine später erscheinende Tabelle valide.
          Den Validator stört es genau gar nicht, woher der Code kommt.

          Der Validator parst das Quelldokument, sieht aber nicht den via JavaScript manipulierten DOM-Baum. Wenn die Tabelleninhalte komplett vom Script erzeugt werden, dann liegt es nahe, auch die Elemente table (und wichtig!) tbody mittels createElement() / appendChild() anzulegen.

          MfG, Thomas

          1. Hallo Thomas,

            dann liegt es nahe, auch die Elemente table (und wichtig!) tbody mittels createElement() / appendChild() anzulegen ...

            ... das hab ich schon vermutet ... :-|
            Warum ist "tdbody" hier so wichtig ?

            Mfg Look

            1. Hallo,

              ... das hab ich schon vermutet ... :-|
              Warum ist "tdbody" hier so wichtig ?

              Das table-Element besitzt lt. DTD mindestens ein tbody-Kindelement:

              <!ELEMENT TABLE - -
                   (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>

              Seine Tags sind jedoch optional, genauer sagt es http://www.w3.org/TR/html4/struct/tables.html#edef-TBODY:

              "The TBODY start tag is always required except when the table contains only one table body and no table head or foot sections. The TBODY end tag may always be safely omitted."

              Die Browser erzeugen tbody implizit im DOM.

              Beispiel:

              ...
              <body>
              <table id="tab"><tr><td>bla</td></tr></table>
              <script language="JavaScript" type="text/javascript">
              <!--
              alert(document.getElementById("tab").innerHTML); // <tbody><tr><td>bla</td></tr></tbody>
              //-->
              </script>
              </body>
              ...

              Baut man Tabellen via DOM auf, muss auch tbody erzeugt werden.

              MfG, Thomas

            2. Hallo,

              dann liegt es nahe, auch die Elemente table (und wichtig!) tbody mittels createElement() / appendChild() anzulegen ...

              ... das hab ich schon vermutet ... :-|

              Bezogen auf das Ausgangsbeispiel koennte das so aussehen:

              <div id="ebene01"></div>

              und im Script:

              document.getElementById("ebene01").appendChild(document.createElement("table")).appendChild(document.createElement("tbody"));

              Danach sieht es im DOM so aus:

              <div id="ebene01"><table><tbody></tbody></table></div>

              MfG, Thomas

              1. Hallo Thomas,
                vielen Dank für die ausführliche Antwort;

                ich habe mich bemüht und das Grundgerüst jetzt via createElement / appendChild erstellt:

                ///////////////////////////////////////////////////////

                ebene = document.getElementById('ebene01');
                tabelle = document.createElement('table');
                body = document.createElement('tbody');

                ebene.appendChild(tabelle);
                tabelle.appendChild(body);

                ///////////////////////////////////////////////////////

                Ich bin mir noch nicht ganz sicher, ob ich die mit "insertRow" dynamisch erstellten Reihen nun in die Tabelle

                reihen = tabelle.insertRow(i);

                oder in den Tabellenbody "einhängen" soll

                reihen = body.insertRow(i);

                Zum besseren Verständnis das vollständige und funktionierende Script,
                das als Ergebnis aus meinem Tread https://forum.selfhtml.org/?t=87975&m=523784 entstanden und dort auch beschrieben ist.

                /////////////////////////////////////////////////

                <html>
                <head>
                <script type="text/javascript">
                <!--

                var reihe = new Array();
                //

                reihe[0] = new Array("1","2","3","4","5","6");
                reihe[1] = new Array("1","2","3");
                reihe[2] = new Array("1","2","3","4","5","6");
                reihe[3] = new Array("1","2","3","4","5","6");
                reihe[4] = new Array("1","2","3","4","5","6");
                //

                var maximal = 0;

                for (i = 0; i < reihe.length; i++)
                {
                maximal = Math.max(maximal,reihe[i].length);
                }

                function erstelle_tabelle()
                {

                ebene = document.getElementById('ebene01');
                tabelle = document.createElement('table');
                body = document.createElement('tbody');

                ebene.appendChild(tabelle);
                tabelle.appendChild(body);

                for (i = 0; i < reihe.length; i++)
                {

                reihen = tabelle.insertRow(i);

                for (n = 0; n < maximal; n++)
                {

                zellen = reihen.insertCell(n);

                if(n < reihe[i].length)
                zellen.innerHTML = reihe[i][n];
                else
                zellen.innerHTML = "-";

                tabelle.style.border = "1px solid black";

                if (i < 1)
                zellen.style.border = "1px solid red";
                else
                zellen.style.border = "1px solid green";

                }

                }

                }

                //-->
                </script>
                </head>
                <body onload="erstelle_tabelle()">
                <center>
                <div id="ebene01"></div>
                </center>
                </body>
                </html>

                /////////////////////////////////////////////////

                Vielleicht erbarmst Du dich nochmal in puncto:wo einfügen von dynamisch erzeugten Reihen ... in "tabelle" oder "body".

                Mit freundlichen Grüßen

                Look

                1. Hi,

                  Ich bin mir noch nicht ganz sicher, ob ich die mit "insertRow" dynamisch erstellten Reihen nun in die Tabelle
                  oder in den Tabellenbody "einhängen" soll

                  Natürlich in den tbody.

                  Denn table enthält in HTML 4.01 keine tr.
                  tr müssen in thead, tfoot oder tbody untergebracht sein.

                  Das hat Thomas Dir doch bereits erklärt - siehe https://forum.selfhtml.org/?t=88125&m=525085

                  cu,
                  Andreas

                  --
                  MudGuard? Siehe http://www.Mud-Guard.de/
                  Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                  1. Denn table enthält in HTML 4.01 keine tr.
                    tr müssen in thead, tfoot oder tbody untergebracht sein.

                    Das hat Thomas Dir doch bereits erklärt - siehe https://forum.selfhtml.org/?t=88125&m=525085

                    Hi Andreas,

                    tut mir leid, wenn ich mehr als einmal Frage. Wenn man sich in verschiedenen Quellen informiert, kann es schon mal Unklarheiten geben ...

                    1.)Die folgende Quelle sagt mir zum Beispiel, dass ich "tr" nicht zwangsläufig in thead, tfoot oder tbody unterbringen MUSS, sondern KANN - so verstehe ich das Wort optional.

                    http://de.selfhtml.org/html/referenz/elemente.htm#table

                    (table) ... darf folgende anderen HTML-Elemente (in dieser Reihenfolge) enthalten:
                    caption (optional), col oder colgroup (optional), thead (optional), tfoot (optional), tbody (ein oder mehrere - wenn nur einmal benötigt, darf tbody auch entfallen, weshalb die herkömmliche Konstruktion, wonach table direkt aus tr-Elementen besteht, ebenfalls zulässig ist)

                    2.)Die folgende Quelle sagt mir zum Beispiel, dass ich tbody nur in Verbindung mit thead und tfoot verwenden darf. Warum brauche ich dann für meine Zwecke nur tbody mit createElement() zu erstellen, nicht aber die beiden anderen Tags ...

                    http://de.selfhtml.org/html/tabellen/aufbau.htm#kopf_koerper_fuss

                    "Wenn Sie mit den Elementen thead, tfoot und tbody arbeiten, müssen Sie immer alle drei Elemente verwenden, und zwar immer in der Reihenfolge thead->tfoot->tbody. Die Elemente thead und tfoot dürfen pro Tabelle nur einmal vorkommen, das tbody-Element einmal oder beliebig oft."

                    Wie gesagt; hier gibt es halt - für mich - Ungereimtheiten, die ich gerne - für mich - klar und deutlich ausräumen möchte. Und deswegen Frage ich - notfalls 2x.

                    Mit freundlichen Grüßen

                    Look

                    1. Hi,

                      1.)Die folgende Quelle sagt mir zum Beispiel, dass ich "tr" nicht zwangsläufig in thead, tfoot oder tbody unterbringen MUSS, sondern KANN - so verstehe ich das Wort optional.

                      Nur weil die tags optional sind, ist das Element noch lange nicht optional.

                      "Wenn Sie mit den Elementen thead, tfoot und tbody arbeiten, müssen Sie immer alle drei Elemente verwenden,

                      Schlicht und einfach falsch - mindestens einmal gemeldet, aber immer noch nicht korrigiert.

                      Im Zweifelsfall einfach in den Standard gucken. SelfHTML ist nur eine Sekundärquelle und damit irrelevant.

                      cu,
                      Andreas

                      --
                      MudGuard? Siehe http://www.Mud-Guard.de/
                      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                      1. Hi,

                        Nur weil die tags optional sind, ist das Element noch lange nicht optional.

                        Versteh ich nicht, tut mir leid ...

                        Im Zweifelsfall einfach in den Standard gucken. SelfHTML ist nur eine Sekundärquelle und damit irrelevant.

                        Harte Sache das, wenn SelfHTML irrelevant ist ... wollte nur verdeutlichen, dass es eben Gründe gibt nachzufragen und Zweifel hatte ich nicht, weil SelfHTML und dieses Forum (bis jetzt ? ) meine Primärquelle war.

                        Mit freundlichen Grüßen

                        look

                        1. Hallo.

                          Hi,

                          Nur weil die tags optional sind, ist das Element noch lange nicht optional.

                          Versteh ich nicht, tut mir leid ...

                          Eine Analogie: In anderen Versionen von HTML ist das Setzen schließender Tags bei bestimmten Elementen nicht notwendig. Das heißt aber nicht, dass die Elemente nicht geschlossen werden. Hier wie dort kannst du also etwas weglassen, aber es wird ohne dein Zutun ergänzt, weil sonst trotz der Validität des Codes das Modell nicht mehr stimmte.
                          MfG, at

                2. Hallo,

                  Ich bin mir noch nicht ganz sicher, ob ich die mit "insertRow" dynamisch erstellten Reihen nun in die Tabelle

                  reihen = tabelle.insertRow(i);

                  oder in den Tabellenbody "einhängen" soll

                  reihen = body.insertRow(i);

                  In den tbody, wobei sich in Deinem Code die Objektvariable tabelle

                  wegen tabelle.appendChild(body);

                  bereits auf den tbody bezieht,

                  was auch alert(tabelle.innerHTML); zeigt: <tbody></tbody>

                  reihen = tabelle.insertRow(i); ist also ok.

                  Fuege mal am Ende der Funktion testweise ein:
                  alert(document.getElementById("ebene01").innerHTML);

                  Ergebnis: table --> tbody --> tr --> td ...

                  MfG, Thomas

                  1. Hallo Thomas,

                    herzlichen Dank, dass Du mir immer noch antwortest - auch wenn meine Fragerei bereits zu nerven scheint (siehe Antwort - und neue Ungereimtheiten zum Thema "table" und "tbody" -  auf MudGuard)

                    Fuege mal am Ende der Funktion testweise ein:
                    alert(document.getElementById("ebene01").innerHTML);

                    Ergebnis: table --> tbody --> tr --> td ...

                    Das habe ich natürlich gemacht, nur bekomme ich IMMER eine entsprechende Antwort in der Form

                    table --> tbody --> tr --> td ...

                    leider aber auch dann, wenn ich mit createElement() gar kein "tbody" erzeugt habe - es scheint also "automatisch" erstellt zu werden, wenn ich "table" erstelle, oder die Alert-Angaben des IE 5.5 sind hier nicht korrekt.

                    Darum die Iritationen, auch in Bezug auf das MUSS bei "tbody" (siehe auch hier Antwort auf MudGard).

                    In diesem Sinne und in der Hoffnung auf die klärende Antwort einen schönen Donnerstag Abend

                    mfg Look