[Javascript] doorlopende randen in dynamische tabel

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
(Edit - meer uitleg toegevoegd)

Ik ben bij een (grote) klant bezig met het maken van een lay-out voor een portal. De specs zijn vastgelegd in een use-case waarin de onderstaande voorwaarden staan.

Mijn taak is om een lay-out te bouwen, op basis van html en indien nodig javascript, die in de portal geplaatst kan worden zodat de portlet-bouwers de gegevens die door een query worden teruggegeven uit de database hierin kunnen plaatsen.

Hiervoor ben ik bezig om een dynamische tabel te bouwen met javascript volgens het DOM model.
(LET OP: interactie met database wordt gemaakt door portlet-bouwers, rijen en kolommen zijn for testing vastgezet op 5)


Daarvoor gelden de volgende eisen:
- De bovenste rij moet de naam van de tabel bevatten. Het aantal cellen kan wisselen (in voorbeeld vastgezet op 5) en de naam wordt uit de database uitgelezen
- De volgende rijen moeten gegevens uit de database bevatten. Het aantal cellen is gelijk aan dat van de bovenste regel.

Layout:
- De tabel mag geen buitenranden hebben
- Alle verticale randen tussen de rijen moeten oranje zijn (#FF6600)
- De rand onder de bovenste rij moet oranje zijn (#FF6600)
- De randen onder alle tussenrijen moeten grijs zijn (#999999)


Ik heb de volgende aanpak gehanteerd: De kolom wordt per rij opgebouwd - daarna worden de cellen ingevuld.

Eerst wordt de bovenste rij opgebouwd - hier wordt via een switch eerst bij de linker cel alleen de onderborder oranje getekend. De volgende cellen krijgen zowel de linker- als de onderborder oranje getekend.

Dan worden de volgende rijen per rij opgebouwd, er wordt ook weer via een switch-statement eerst de linker cel met alleen een grijze onderrand en daarna de volgende cellen met een oranje linkerrand en een grijze onderrand getekend.

De randen worden dus per cel ingetekend. Nergens wordt de bovenste en de rechter rand getekend. Hierdoor ontstaan er kleine onderbrekingen in de borders tussen de cellen.

Ik wil niet nog meer switch-statements gaan maken, de projectleider wil de lijnen doorlopend getekend hebben.

Wat is hier een oplossing voor!??

Alvast dank voor jullie hulp!

Hieronder de code:
=============

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
    content="text/javascript; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript">
    function start() {
        //get the reference for the body
        var mybody = document.getElementsByTagName("body")[0];
        
        //creates <table> and <tbody> elements
        mytable     = document.createElement("table");
        mytablebody = document.createElement("tbody");
        
        // ** TODO **
        //variable rowtotal has to be linked to database.getRows() to display all the rows in the query. For testing this value is now set to 5.
        var rowtotal = 5;

        // ** TODO **   
        //variable celltotal has to be linked to database.getCells() to display all the cells in a row. For testing this value is now set to 5.
        var celltotal = 5;

        for(var j = 0; j < rowtotal; j++)
        {
        
            switch(j)
            {
                case 0:
                    //creates a <tr> element
                    mycurrent_row = document.createElement("tr");
                    
                    //creating all cells
                    for (var h = 0; h < celltotal; h++)
                    {
                        switch (h)
                        {
                            // this cell only has a bottom border in orange
                            case 0:
                                //creates a <td> element
                                mycurrent_cell = document.createElement("td");
                                //creates a Text Node
                                currenttext = document.createTextNode("This is column" + (h+1));
                                //appends the Text Node we created into the cell <td>
                                mycurrent_cell.appendChild(currenttext);
                                //appends the cell <td> into the row <tr>
                                mycurrent_row.appendChild(mycurrent_cell);
                                mycurrent_cell.setAttribute("align","center");
                                //sets the css properties for each cell -- border line and color, no horizontal scroll, bold font
                                var cssStringTop = 'font-weight:bold;overflow-x:hidden;border-bottom:thin solid #ff6600';
                                mycurrent_cell.style.cssText = cssStringTop;
                                mycurrent_cell.setAttribute('style',cssStringTop);
                            //these cells have both a left and a bottom border in orange
                            default:    
                                //creates a <td> element
                                mycurrent_cell = document.createElement("td");
                                //creates a Text Node
                                currenttext = document.createTextNode("This is column" + (h+1));
                                //appends the Text Node we created into the cell <td>
                                mycurrent_cell.appendChild(currenttext);
                                //appends the cell <td> into the row <tr>
                                mycurrent_row.appendChild(mycurrent_cell);
                                mycurrent_cell.setAttribute("align","center");
                                //sets the css properties for each cell -- border line and color, no horizontal scroll, bold font 
                                var cssStringTop2 = 'font-weight:bold;overflow-x:hidden;border-left:thin solid #ff6600;border-bottom:thin solid #ff6600';
                                mycurrent_cell.style.cssText = cssStringTop2;
                                mycurrent_cell.setAttribute('style',cssStringTop2);
                        }
                    }
                //appends the row <tr> into <tbody>
                mytablebody.appendChild(mycurrent_row);
                    
                default:
                
                    //creates a <tr> element
                    mycurrent_row = document.createElement("tr");
                    
                    //creating all cells
                    for (var i = 0; i < celltotal; i++)
                    {
                    switch (i)
                        {
                        //this cell only has a bottom border in gray
                        case 0:
                            //creates a <td> element
                            mycurrent_cell = document.createElement("td");
                            //creates a Text Node
                            currenttext = document.createTextNode("cell is row " + (j+1) + ", column " + (i+1));
                            //appends the Text Node we created into the cell <td>
                            mycurrent_cell.appendChild(currenttext);
                            //appends the cell <td> into the row <tr>
                            mycurrent_row.appendChild(mycurrent_cell);
                            //sets the css properties for each cell -- border line and colors, no horizontal scroll, padding
                            var cssString = 'padding-top:2px;padding-left:10px;padding-right:10px;overflow-x:hidden;border-bottom:thin solid #999999';
                            mycurrent_cell.style.cssText = cssString;
                            mycurrent_cell.setAttribute('style',cssString);
                        //these cells have a bottom border in gray and a left border in orange
                        default:
                            //creates a <td> element
                            mycurrent_cell = document.createElement("td");
                            //creates a Text Node
                            currenttext = document.createTextNode("cell is row " + (j+1) + ", column " + (i+1));
                            //appends the Text Node we created into the cell <td>
                            mycurrent_cell.appendChild(currenttext);
                            //appends the cell <td> into the row <tr>
                            mycurrent_row.appendChild(mycurrent_cell);
                            //sets the css properties for each cell -- border line and colors, no horizontal scroll, padding
                            var cssString2 = 'padding-top:2px;padding-left:10px;padding-right:10px;overflow-x:hidden;border-left:thin solid #ff6600;border-bottom:thin solid #999999';
                            mycurrent_cell.style.cssText = cssString2;
                            mycurrent_cell.setAttribute('style',cssString2);
                        }
                    }
                //appends the row <tr> into <tbody>
                mytablebody.appendChild(mycurrent_row);
            }
        }
        
        //appends <tbody> into <table>
        mytable.appendChild(mytablebody);
        //appends <table> into <body>
        mybody.appendChild(mytable);
        //sets the border attribute of mytable to 2
        //mytable.setAttribute("border","1");
        mytable.setAttribute("width","940 px");
    }
</script>
</head>
<body onload="start()">
</body>
</html>

[ Voor 3% gewijzigd door C3La op 03-04-2009 15:52 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Waarom render je dit in javascript?

Waarom gebruik je wel tbody, maar geen thead?


Los daarvan. Je eisen zijn simpel te bewerkstelligen met heel simpele css. Gewoon elke cell een aparte borders geven. Als er randen tussen zitten zul je even moeten kijken naar de border-colapse property.

[ Voor 9% gewijzigd door Janoz op 03-04-2009 14:47 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
document.getElementsByTagName("body")[0]
Daar stopte ik met lezen :X

-edit-
Toch even doorgelezen maar ik snap ook niet wat in hemelsnaam het doel is van het script. Of vind je het gewoon leuk om wat javascript ervaring op te doen?

[ Voor 51% gewijzigd door mcDavid op 03-04-2009 15:05 ]


Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
Het doel van het script is het volgende:

We hebben een portalserver draaien. In een portlet wordt een query in een database gedaan. Op basis van deze query krijg je een aantal kolommen info terug, varierend van 1 tot 8.

Daaronder hangen 1 of meer rijen informatie.

Deze moeten volgens de usecase in een andere portlet worden weergegeven, in een html-tabel. Deze tabel moet automatisch uitlijnen over de breedte van de portlet (max 940 px) en er mag geen horizontale scrolling optreden.

Via dit script probeer ik met de variabelen rowtotal en celltotal (die worden gelinkt aan het aantal kolommen en het aantal rijen van de query) een dynamische tabel te bouwen.

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
Ik zie niet in waarom dat niet gewoon met plain HTML kan?

En wat is er precies "dynamisch" aan de tabel? Ik zie nergens interactie met een user of een server of wat dan ook!

[ Voor 51% gewijzigd door mcDavid op 03-04-2009 15:21 ]


Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
Ik zie niet hoe ik dit in "plain" html moet doen - hoe kan ik daar de grootte aanpassen op basis van twee integer values die uit een query komen?
(aantal columns en aantal rows)

[ Voor 10% gewijzigd door C3La op 03-04-2009 15:30 ]


Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
Door je server html-code uit te laten tuffen in plaats van twee integers?

Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
mcDavid schreef op vrijdag 03 april 2009 @ 15:37:
Door je server html-code uit te laten tuffen in plaats van twee integers?
Ik heb wat meer info over de situatie toegevoegd in de OP...

Helaas. De output van de server staat vast, dat wordt geen html.

In de use-case specs staat het volgende:

Er wordt een aparte portlet gebouwd die de data van de zoekquery vanuit de database (oud, bestaand systeem) moet weergeven.
De portlet moet een html-opmaak gaan bevatten, waarin de portlet-bouwers de gegevens kunnen plaatsen / weergeven.

[ Voor 7% gewijzigd door C3La op 03-04-2009 15:53 ]


Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
misschien ben ik gek, maar hoe ziet die output van het script dat die query uitvoert er dan wél uit?
En hoe wou je die dan in je (client-side-) script zien te krijgen?

[ Voor 4% gewijzigd door mcDavid op 03-04-2009 15:54 ]


Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
Nee, je bent niet gek, zie edit in mijn OP.

Het is niet mijn taak om de queries te maken, alleen om een html (+ evt javascript) - vormgeving te bouwen die in een portlet kan worden gezet. Daarin moeten de gegevens worden weergegeven.

Acties:
  • 0 Henk 'm!

  • HendrikN
  • Registratie: Februari 2007
  • Laatst online: 23:28
Even voor alle duidelijkheid, je mag/kan geen gebruik maken van een programmeertaal als bijv. PHP?

Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
Nogmaals de vraag:

Zie OP voor mijn code - de bedoeling staat daar ook uitgelegd.

Op basis van de teruggegeven aantal rijen en cellen per rij, moet er een tabel worden gemaakt die voldoet aan de volgende eisen:

- De bovenste rij moet de naam van de kolommen bevatten. Het aantal cellen kan wisselen (1 tot 8 ).
- De volgende rijen (minstens 1 rij, max. aantal is onbeperkt) moeten gegevens uit de database bevatten. Het aantal cellen is gelijk aan dat van de bovenste regel.

Layout:
- De tabel mag geen buitenranden hebben
- Alle verticale randen tussen de rijen moeten oranje zijn (#FF6600)
- De rand onder de bovenste rij moet oranje zijn (#FF6600)
- De randen onder alle tussenrijen moeten grijs zijn (#999999)

Hoe kan ik in html (+ evt. javascript) een layout maken waarin de randen doorlopen tussen de cellen, en waarin de borders + kleuren ononderbroken worden weergegeven?

(Geen buitenrand, onder bovenste rij een oranje lijn, tussen alle kolommen in oranje lijnen, tussen alle overige rijen in lichtgrijze lijnen)

Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
HendrikN schreef op vrijdag 03 april 2009 @ 15:58:
Even voor alle duidelijkheid, je mag/kan geen gebruik maken van een programmeertaal als bijv. PHP?
Klopt, dat gaat niet samen met de servlets... :-(

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
En je weet héél zeker dat het niet gewoon de bedoeling is dat jij een layout maakt, die de heren/dames Server-Side-Scripters als template kunnen gebruiken om hun gegevens in te plaatsen?

wat me bijvoorbeeld ook nog niet duidelijk is, is hoe de gegevens in de tabel terecht gaan komen. Ik neem aan dat er op een gegeven moment toch iets anders in de cellen zal moeten staan dan "this is column x" of iets dergelijks...

[ Voor 39% gewijzigd door mcDavid op 03-04-2009 16:12 ]


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 22-09 15:43

NetForce1

(inspiratie == 0) -> true

java portlets hebben ook een server-kant dus als je op java zit (wat ik natuurlijk niet zeker weet) kun je gewoon html opsturen.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
mcDavid schreef op vrijdag 03 april 2009 @ 16:10:
En je weet héél zeker dat het niet gewoon de bedoeling is dat jij een layout maakt, die de heren/dames Server-Side-Scripters als template kunnen gebruiken om hun gegevens in te plaatsen?

wat me bijvoorbeeld ook nog niet duidelijk is, is hoe de gegevens in de tabel terecht gaan komen. Ik neem aan dat er op een gegeven moment toch iets anders in de cellen zal moeten staan dan "this is column x" of iets dergelijks...
Ja, de inhoud van de cellen is gewoon voor de vulling nu, dat gaat veranderen!

En ik wil best een layout bouwen die vast staat.
Alleen is mijn probleem nu (en ik weet niet of ik mezelf blind staar op het probleem), dat als ik een html-tabel van 5x5 cellen maak, dat er bijvoorbeeld 26 rijen met 8 cellen teruggegeven worden.

Dan heb je dus niets aan mijn tabel.

Of zie ik iets niet!?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

php gaat niet samen met servlets. JSP en JSF daarintegen werken super. Ik blijf niet begrijpen waarom jij denkt dat de transformatie van query resultaat naar html code perse op de client moet gebeuren. Dat is niet alleen heel erg ingewikkeld, maar ook nog eens foutgevoelig en een usability/accesability nightmare. En dan ben ik nog niet eens begonnen over SEO........

Edit: Ja, je mist inderdaad iets...

[ Voor 5% gewijzigd door Janoz op 03-04-2009 16:29 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

mcDavid schreef op vrijdag 03 april 2009 @ 15:00:

document.getElementsByTagName("body")[0]
[...]
Daar stopte ik met lezen :X
Ik gebruik dit zelf ook in een script van mij en zou graag willen weten wat daar mis mee is en wat is het alternatief?

Acties:
  • 0 Henk 'm!

  • C3La
  • Registratie: Januari 2001
  • Laatst online: 04-02-2021
Janoz schreef op vrijdag 03 april 2009 @ 16:28:
php gaat niet samen met servlets. JSP en JSF daarintegen werken super. Ik blijf niet begrijpen waarom jij denkt dat de transformatie van query resultaat naar html code perse op de client moet gebeuren. Dat is niet alleen heel erg ingewikkeld, maar ook nog eens foutgevoelig en een usability/accesability nightmare. En dan ben ik nog niet eens begonnen over SEO........

Edit: Ja, je mist inderdaad iets...
Goede vraag...

Het enige dat ik kan zeggen is - er is voor zover ik nu weet, bepaald dat de portlet-bouwers dat niet willen doen en dat het dus op deze wijze apart opgelost moet worden.

Heb net ff gepraat en we gaan ma. kijken of het niet alsnog bij de portlet ingebakken kan worden... :)

Acties:
  • 0 Henk 'm!

Verwijderd

Als er toch al connectie is met de database, kan de server net zo goed zelf de HTML genereren.

Hoe je het ook wendt of keert, er moet iets van server -> client. Of het nou 2 getalletjes zijn, of een lap HTML-code...

Acties:
  • 0 Henk 'm!

  • HendrikN
  • Registratie: Februari 2007
  • Laatst online: 23:28
Verwijderd schreef op vrijdag 03 april 2009 @ 16:31:
[...]

Ik gebruik dit zelf ook in een script van mij en zou graag willen weten wat daar mis mee is en wat is het alternatief?
document.body

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 20:16
Verwijderd schreef op vrijdag 03 april 2009 @ 16:44:
Als er toch al connectie is met de database, kan de server net zo goed zelf de HTML genereren.

Hoe je het ook wendt of keert, er moet iets van server -> client. Of het nou 2 getalletjes zijn, of een lap HTML-code...
Precies. En als de cellen vulling krijgen, wordt dat dus een gigantische lijst met strings. Of je die strings nou verpakt in een array of in <td></td> maakt dan ook geen ruk meer uit.
Pagina: 1