Toon posts:

[JS] Synchroniseren van 2 tables en hun cellen op width

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een snippet die het mogelijk moet maken om een table te krijgen met een vaste header en een scrollende body. Het geheel is opgebouwd uit 2 tables, waarbij de 1ste table de header is, en de 2de table de scrollbare body is.

In de 1ste table, geef ik doormiddel van een attribuut "datatable" in de table tag aan, welke table moet fungeren als de body.

Op window.onload doe ik een aanroep van de functie initResize(). Deze zet initieel widths voor zowel de body als de header. De body is momenteel leidend, een brede cell, betekend een evenzo brede head cell. Dit wordt in de toekomst nog beperkt, omdat een head ook een minimale breedte moet krijgen, nl zijn offsetWidth.

Bij het zetten van de widths op de cellen, wordt eerst berekend wat het verschil in offsetWidth tussen de head table, en de body table is. Dit omdat in de body table minder breedte beschikbaar kan zijn door een scrollbar van de <div> eromheen.

Bij het toekennen van de width van de laatste cell in de head wordt dit verschil erbij geteld.

Ik heb tevens een trace gemaakt van wat de uiteindelijk waardes na het toekennen nou zijn geworden. Het valt me op dat deze initieel verschillen tussen de thead en de tbody, maar ik snap nou niet echt waarom, ik vermoed dat het te maken heeft met het on the fly renderen van de browser?

Hieronder de code, het is nog niet getest op browsers anders dan MSIE 6

PHP:
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
    <style>
    td{
        font:icon;
    }
    
    thead td {
        background:buttonface;
        border:1px outset;
        height:20px;
    
    }

    tbody td {
        overflow:hidden;
        border:1px outset;
    }
    </style>
    <script type="text/javascript">
    function initResize(){
        theadCollection = document.getElementsByTagName('THEAD');
        
        // loop through all theads
        for(rows=0;rows<theadCollection.length;rows++){
        
            // get table tag
            thisTable = theadCollection[rows];
            while (thisTable.tagName != "TABLE"){
                thisTable = thisTable.parentElement;
            }
            dataTable = document.getElementById(thisTable.datatable);
            
            // get tbody in connected table
            for(i=0;i<dataTable.children.length;i++){
                if(dataTable.children(i).tagName == "TBODY"){
                    thisTbody = dataTable.children(i);
                }
            }
            
            // get difference between thead and tbody width (scrollbar)
            difference = theadCollection[rows].offsetWidth - thisTbody.offsetWidth;
            
            for(columns=0;columns<theadCollection[rows].rows[0].cells.length;columns++){
                // set initial tbody width values
                thisTbody.rows[0].cells[columns].style.width = thisTbody.rows[0].cells[columns].offsetWidth;
                
                // last thead cell gets difference extra
                if(theadCollection[rows].rows[0].cells.length-1 == columns){
                    theadCollection[rows].rows[0].cells[columns].style.width =  thisTbody.rows[0].cells[columns].offsetWidth + difference;
                }else{
                    theadCollection[rows].rows[0].cells[columns].style.width =  thisTbody.rows[0].cells[columns].offsetWidth;
                }
            }
                        
            debuginfo = '';
            for(i=0;i<theadCollection[rows].rows[0].cells.length;i++){
                debuginfo += 'cellIndex:'+i+' head:'+theadCollection[rows].rows[0].cells[i].style.width+' body:'+thisTbody.children[0].children[i].style.width+'<br>';
            }   
            document.getElementById('trace').innerHTML = debuginfo;
        }
        
    }
    
    window.onload = initResize;
    </script>
</head>

<body>
<div id="trace" style="position:absolute;bottom:450;right:10;"></div>


<table cellspacing="0" cellpadding="0" datatable="body" width="100%">
    <thead>
        <tr>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Gender</td>
            <td>Mustage</td>
            <td>Smells</td>
            <td>Tijd</td>
        </tr>
    </thead>
</table>
<div style="width:100%;height:50;overflow:scroll;">
<table cellspacing="0" cellpadding="0" id="body" width="100%">
    <tbody>
        <tr>
            <td>a</td>
            <td>Schumacher</td>
            <td>Ferrari</td>
            <td>Ferrari</td>
            <td>650 kb</td>
            <td>1.15.872</td>
        </tr>
        <tr>
            <td>b</td>
            <td>Schumacher</td>
            <td>Ferrari</td>
            <td>Ferrari</td>
            <td>650 kb</td>
            <td>1.15.872</td>
        </tr>
        <tr>
            <td>c</td>
            <td>Schumacher</td>
            <td>Ferrari</td>
            <td>Ferrari</td>
            <td>650 kb</td>
            <td>1.15.872</td>
        </tr>       
    </tbody>
</table>
</div>


</body>
</html>

Verwijderd

Topicstarter
^ iemand toevallig al een idee hierover :)

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Verwijderd schreef op 12 juni 2003 @ 23:33:
[snip]
Bij het toekennen van de width van de laatste cell in de head wordt dit verschil erbij geteld.

Ik heb tevens een trace gemaakt van wat de uiteindelijk waardes na het toekennen nou zijn geworden. Het valt me op dat deze initieel verschillen tussen de thead en de tbody, maar ik snap nou niet echt waarom, ik vermoed dat het te maken heeft met het on the fly renderen van de browser?

[snip]
Als ik je pagina run, dan krijg ik de volgende output:

code:
1
2
3
4
5
6
cellIndex:0 head:34px body:32px
cellIndex:1 head:240px body:238px
cellIndex:2 head:136px body:134px
cellIndex:3 head:136px body:134px
cellIndex:4 head:135px body:133px
cellIndex:5 head:196px body:178px

Heb je het dan over die 1 a 2 pixels verschil of over de laatste (in mijn geval 18px verschil)?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
BtM909 schreef op 13 June 2003 @ 10:41:
[...]

Als ik je pagina run, dan krijg ik de volgende output:

code:
1
2
3
4
5
6
cellIndex:0 head:34px body:32px
cellIndex:1 head:240px body:238px
cellIndex:2 head:136px body:134px
cellIndex:3 head:136px body:134px
cellIndex:4 head:135px body:133px
cellIndex:5 head:196px body:178px

Heb je het dan over die 1 a 2 pixels verschil of over de laatste (in mijn geval 18px verschil)?
Ja in totaal dus. De cellindex geeft inderdaad de column aan, head geeft de breedte van de thead column aan, en body geeft de breedte van de tbody column aan.

Deze behoren gewoon identiek te zijn.

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Volgens mij zit het verschil in het feit dat offsetWidth en style.width niet dezelfde waarde teruggeven.

Verwijderd

Topicstarter
McVirusS schreef op 13 June 2003 @ 13:41:
Volgens mij zit het verschil in het feit dat offsetWidth en style.width niet dezelfde waarde teruggeven.
Dat zou volgens het boxmodel van Msie niet het geval moeten zijn. Borders worden zegmaar aan de binnenkant geplaatst, en zouden in dit geval dus geen invloed hebben op offset of width.

Verwijderd

ik heb niet helemaal alles gelezen (lui zeg), maar wat is er mis met de tbody gewoon een overflow: scroll geven?

(dus gewoon 1 tabel, daar is de thead namelijk voor)

heb je hier wat aan? http://lists.w3.org/Archi...ww-html/2001Dec/0069.html (eerste google hit btw)

[ Voor 45% gewijzigd door Verwijderd op 13-06-2003 16:17 ]


Verwijderd

Topicstarter
In MSIE werkt een overflow op de tbody niet goed. Resultaat is dat je scrollende tablerows krijgt, vandaar de aparte benadering via tables.

[ Voor 50% gewijzigd door Verwijderd op 13-06-2003 19:24 ]


Verwijderd

Topicstarter
Ik heb zelfs de borders even op 1 solid gezet, en zelfs bij toekennen van de width +2 gedaan (+ 1 linkerborder + 1 rechtborder) maar dat maakt niet uit.

^ laatste kick iemand idee?
Pagina: 1