Avatar billede ildraev Nybegynder
30. maj 2005 - 13:05 Der er 7 kommentarer og
1 løsning

window.onresize husker bredden?

Jeg har lavet en funktion til IE for at emulere min-width og max-width. Når brugeren resizer vinduet kalder den en funktion der med document.body.clientWidth resizer et div. Problemet er at når vinduet har været i fuld størrelse, er det som om IE6 husker bredden, og derfor bruger den fulde bredde i funktionen, istedet for at bruge den nye, smallere bredde. Problemet opstår ikke den anden vej!

Her er mit script:

var d = document;

function resize()
    {
    minwidth = d.body.clientWidth < 760? "760px":"auto";
    maxwidth = d.body.clientWidth > 980? "980px":"auto";
    d.getElementById("outercontainer").style.width=minwidth;
    d.getElementById("innercontainer").style.width=maxwidth;
    }
   
    if(typeof(document.createComment)=='object') window.onresize = resize;
Avatar billede ildraev Nybegynder
30. maj 2005 - 13:31 #1
En hurtig update: Det er åbenbart fordi IE crasher (surprise) når man kører funktionen, og ikke fordi den husker bredden. Jeg har oplevet både soft crashes (den bliver ved med at fungere, men lukker af for al JS) og hard crashes (farvel)..

En løsning jeg fandt via google var denne: jeg har indsat "<!---->" (altså en tom kommentar) i toppen af html-dokumenten - inden doctypen - og så opstår der ingen problemer.. det er dog et grimt hack jeg gerne ville undgå..

er der nogen af de kloge hoveder derude der kan forstå hvad der går galt?
Avatar billede olebole Juniormester
30. maj 2005 - 20:20 #2
<ole>

Brugen af den tomme kommentar disable'er samtidig en stor del af CSS i IE. Der må _intet_ stå før DTD'en ... ellers går IE i 'quirks-mode' og kan bl.a. ikke bruge CSS' box-model. Det er et yderst uklogt 'hack'  :)

Årsagen til FF ikke crasher er, at den først fyrer event'en af, når du stopper din resize-handling ... IE fyrer den af kontinuerligt under handlingen. Det betyder, du kan lave real-time resize i IE, hvorimod FF skodder fælt på dette punkt ... det er simpelthen umuligt  :[

Da siden crash'er for dig, kunne det dog tyde på, du har skrevet noget uhensigtsmæssig og/eller tung kode på siden ... det bør ikke være et problem - og plejer ikke at være det.

Der er en enkelt ting i den kode, du viser, der bør laves om. Der er ingen grund til, at du kontinuerligt skal hente en ny reference til de to containere. Dem bør du oprette en fast reference til på onload - og så bruge de to referencer, når du vil have fat i elementerne. Det vil afgjort hjælpe en hel del.
Hvad du derudover bør lave om, er ikke til at sige udfra det oplyste.

Hvorfor i øvrigt det lidt sære browser-check? Hvilke browsere vil du fange med den - og hvorfor overhovedet gøre forskel?

/mvh
</bole>
Avatar billede ildraev Nybegynder
31. maj 2005 - 09:50 #3
Hey Olebole,

Som sagt vil jeg meget gerne undgå hack'et, men jeg kan ikke rigtig finde andre metoder at få det til at virke på.

Der er intet uhensigtsmæssig eller tung kode på siden - faktisk er der ikke andet javascript, og ikke mere end 6-7 divs ialt.

Jeg har lavet det lidt om mht. de to containere:

<kode>
var d = document;
    var el1 = d.getElementById("outercontainer");
    var el2 = d.getElementById("innercontainer")
   
    function doit()
    {
        window.status=d.body.clientWidth;
        minwidth = d.body.clientWidth < 760? "760px":"auto";
        maxwidth = d.body.clientWidth > 980? "980px":"auto";
        el1.style.width=minwidth;
        el2.style.width=maxwidth;
    }
   
    if(typeof(document.createComment)=='object') window.onresize = doit;
</kode>

Det sære browsercheck er lavet for kun at fange IE6. Jeg behøver ikke funktionen til Firefox da den understøtter min-width og max-width, og den jeg laver siden for vil kun understøtte de to browsere da det er noget intranet-gejl.
Avatar billede ildraev Nybegynder
31. maj 2005 - 09:59 #4
ups, det gik galt, så jeg lavede det lidt om:

<kode>
var d = document;
   
    function init()
    {
        el1 = d.getElementById("outercontainer");
        el2 = d.getElementById("innercontainer");
    }
   
    function doit()
    {
        minwidth = d.body.clientWidth < 760? "760px":"auto";
        maxwidth = d.body.clientWidth > 980? "980px":"auto";
        window.status=d.body.clientWidth + "|"+minwidth+"|"+maxwidth;
        el1.style.width=minwidth;
        el2.style.width=maxwidth;
    }
   
    if(typeof(document.createComment)=='object') window.onresize = doit;
    window.onload = init;
</kode>

Problemet opstår dog stadig, eftersom at IE bliver ved med at kalde funktionen efter at man er færdig med at resize vinduet - det kan jeg se i min statuslinje (min meget primitive bugfinder).
Avatar billede olebole Juniormester
31. maj 2005 - 10:11 #5
Nej, det gør den nu ikke ... den er bare ikke blevet færdig med køen af kald  :)
Du kan komme udenom med denne her:

var d = document;
var el1,el2,timer;
window.onload = function () {
    el1 = d.getElementById("outercontainer");
    el2 = d.getElementById("innercontainer")
}
   
function doit() {
    window.status=d.body.clientWidth;
    minwidth = d.body.clientWidth < 760? "760px":"auto";
    maxwidth = d.body.clientWidth > 980? "980px":"auto";
    el1.style.width=minwidth;
    el2.style.width=maxwidth;
}
function doit2() {
    clearTimeout(timer);
    timer = setTimeout("doit()", 200);   
}
if(typeof(document.createComment)=='object') window.onresize = doit2;
Avatar billede ildraev Nybegynder
31. maj 2005 - 10:59 #6
Det gør ingen forskel - nu kalder den bare funktionen med 200ms mellemrum - efter resize.. se her: http://kimblim.dk/resize/
Avatar billede ildraev Nybegynder
06. juni 2005 - 14:26 #7
Jeg lukker, da ingen har kunne hjælpe.. surt.
Avatar billede olebole Juniormester
06. juni 2005 - 15:41 #8
Hvis du gør, som jeg skriver, er der ingen problemer. Det virker helt fint  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester