O.k., no problem.
De opgeschoonde scriptloze versie was alleen om een gezonde basis te leggen.
1. Het script er aan toegevoegd
De speciale IE-regels in het begin kunnen nog komen te vervallen, als de #tabbladContainer ook een {overflow:hidden} krijgt, en de padding-bottom van de #tabbladContainer verplaatst wordt naar de #content.
Met het script er bij wordt het dan deze:
- Test tabs-nw-12.htm.
- Resultaat: Chrome en ook Safari blijft nog steeds hangen, de rest doet het goed.
=====
2. Diagnose-pagina
Dan gaan we maar eens een diagnose-pagina maken die aangeeft wat er met Chrome gebeurt, volgens de beproefde
alert-methode: in het script een alert() zetten, en kijken waar het mis gaat.
We beginnen met meteen aan het begin op te vragen wat de gemeten hoogtes zijn van de 3 tabbladen:
[JS]// bij start hoogte tabbladen opmeten en onthouden:
var h1= document.getElementById('tabblad1').offsetHeight;
var h2= document.getElementById('tabblad2').offsetHeight;
var h3= document.getElementById('tabblad3').offsetHeight;
alert('Gemeten hoogte tabblad-1: '+h1);
alert('Gemeten hoogte tabblad-2: '+h2);
alert('Gemeten hoogte tabblad-3: '+h3);[/JS]
- De test: tabs-nw-13.htm.
- Het resultaat: raak, het gaat meteen al mis met Chrome en Safari!

=====
3. Tijdrekening
De door Chrome en Safari opgemeten hoogte bedraagt 72px voor alle tabbladen, net iets meer dan het opschrift van een tabblad. Maar hoe lang duurt het voordat ze de goede hoogte kunnen bepalen?
We zetten ergens een <div id="diagnose"></div> op de pagina, die we laten vullen door het script:
[JS]var tijd=0;
h1= document.getElementById('tabblad1').offsetHeight;
h2= document.getElementById('tabblad2').offsetHeight;
h3= document.getElementById('tabblad3').offsetHeight;
var diag=document.getElementById('diagnose');
diag.innerHTML ='[ hoogte tabblad-1: <span>'+h1+'px</span> ] ';
diag.innerHTML+='[ hoogte tabblad-2: <span>'+h2+'px</span> ] ';
diag.innerHTML+='[ hoogte tabblad-3: <span>'+h3+'px</span> ]';
diag.innerHTML+='<br />verstreken tijd: <span>'+tijd+'ms</span>';[/JS]
Dat is dan de gemeten hoogte op tijdstip nul: het moment van bereiken van dit script.
Nu kunnen de goed presterende browsers verder.
Vervolgens laat je om de 10 millisec. hetzelfde gebeuren, net zo lang tot alle drie de tabbladen een opgemeten hoogte hebben die groter is dan de 72px, zeg voor het gemak 100px. Dan stopt de tijdmachine, en kan je aflezen hoe lang een browser er over gedaan heeft:
[JS]function diagnose(){
if (h1<100 || h2<100 || h3<100){
tijd=tijd+10;
h1= document.getElementById('tabblad1').offsetHeight;
h2= document.getElementById('tabblad2').offsetHeight;
h3= document.getElementById('tabblad3').offsetHeight;
diag.innerHTML ='[ hoogte tabblad-1: <span>'+h1+'px</span> ] ';
diag.innerHTML+='[ hoogte tabblad-2: <span>'+h2+'px</span> ] ';
diag.innerHTML+='[ hoogte tabblad-3: <span>'+h3+'px</span> ]';
diag.innerHTML+='<br />verstreken tijd: <span>'+tijd+'ms</span>';
setTimeout(diagnose, 10);
}
}
setTimeout(diagnose, 10);
[/JS]
Dat zetten we om in:
Meetresultaten
Enkele metingen in Chrome (tussentijds steeds de browser-cache/tijdelijke bestanden wissen!):
70ms, 80ms, 70ms, 50ms, 90ms, 60ms, 60ms, 90ms, 50ms, 60ms, 80ms ...
Wisselvallig dus, en schommelend tussen de 50 en de 100ms.
Serie 2: als de pagina al binnen is, de cache niet geleegd wordt, en op refresh geklikt wordt:
20ms, 20ms. 30ms, 60ms, 40ms, 10ms, 20ms, 10ms, 60ms, 10ms, 250ms, 40ms, 50ms, 10ms ...
Ook geen peil op te trekken!

=====
4. Andere scripts in de weg?
Om daar achter te komen, halen we alle andere scripts uit de pagina.
Met cache-legen:
0, 0, 20ms, 10ms, 0, 260ms, 10ms, 0, 20ms ...
Met refresh:
0, 20, 0, 0, 0, 10ms, 30ms, 10ms, 0, 0, 60ms, 20ms ...
Dat helpt dus niet afdoende.
=====
5. Rest van de pagina in de weg?
We slopen ook de header en de footer er uit, zodat alleen het content-gedeelte en de images daarvan opgehaald hoeven te worden.
In plaats van [Total HTTP Requests: 86; Total Size: 1.189.190 bytes] in versie 12 heeft de pagina nu
maar (!) [Total HTTP Requests: 63; Total Size: 762.259 bytes]: wel een stuk sneller, maar allemaal kleine (css-background) images die stuk voor stuk worden opgehaald. - Met css-sprites kan er een enorme tijdwinst geboekt worden, want al die http-requests vreten tijd!
Maar wat is het resultaat?
Met cache-legen:
20ms, 20ms, 20ms, 20ms, 20ms, 900ms, 20ms, 20ms, 20ms, 20ms ...
Met refresh:
20ms, 20ms, 20ms, 20ms, 10ms, 20ms, 20ms, 20ms, 20ms ...
Ook dat is het dus niet (en bovendien moeten in de echte versie de andere scripts + header en footer er natuurlijk gewoon bij).
=====
6. Wat nu? :shocked:
Een workaround!

Als Chrome zo'n haast heeft met een voortijdige executie van het script, dan moet daar een rem op gezet worden. Oftewel: de tijdmachine moet in het script ingebouwd worden.
Probleempunt is dan wel, dat Chrome & Safari het eerste tabblad ook niet in volle glorie kunnen laten zien terwijl de tijdmachinerie nog wacht op het sein "veilig".
Maar ... voor elk probleempunt is ook weer een oplossingspunt, als je het handig aanpakt.

=====
7. Eerste tabblad gewoon altijd op volle hoogte tonen
Dat kan alleen als tabblad1 géén absolute maar een relatieve posities heeft: dan wordt het opgenomen in de
normal flow, en dan is de volle hoogte meteen beschikbaar.
Resultaat, zoals te voorzien: ook Chrome en Safari tonen in het begin het eerste tabblad op de goede hoogte.
Nu moet het diagnose-mechaniek omgebouwd worden tot tijdmachine, en moet de relatieve positie van tabblad1 via de tijdmachine omgezet worden in een absolute positie, zodat bij wisseling van tabbladen ook tabblad1 onder de andere kan komen (want nu staat ie altijd bovenop, ook als de andere aangezet worden).
Wordt vervolgd!
Met vriendelijke groet,
CSShunter