19. maj 2006 - 16:08Der er
19 kommentarer og 1 løsning
Hastighedsproblem med IE
Hej eksperter,
jeg har noget javascript på min side hvis formål er at sætte brugeren i stand til at besvare en række radiobuttons med de numeriske taster (1-4 eller 1-5).
Som det fremgår af koden har jeg i den første del hentet inspiration på nettet.
Dette script kører rigtig godt i Firefox, og det virker også i IE. MEN! Det kører utrolig sløvt i IE ift. Firefox. Er der noget jeg ikke ved om IE og som jeg evt. kunne optimere?
Koden: <script type="text/javascript"> function textsizer(e){ var evtobj=window.event? event : e //distinguish between IE's explicit event object (window.event) and Firefox's implicit. var unicode=evtobj.charCode? evtobj.charCode : evtobj.keyCode var actualkey=String.fromCharCode(unicode); var CurrentSpm = findCurrentSpm(); var radioName = 'r' + CurrentSpm; if(document.forms[0].elements[radioName][actualkey-1]!=null) { document.forms[0].elements[radioName][actualkey-1].checked=true; document.forms[0].elements[radioName][actualkey-1].focus(); window.scrollBy(0, 25); if(document.getElementById('spm'+CurrentSpm)!=null) { document.getElementById('spm'+CurrentSpm).style.color=''; document.getElementById('spm'+CurrentSpm).style.textDecoration=''; } if(document.getElementById('spm'+(CurrentSpm+1))!=null) { document.getElementById('spm'+(CurrentSpm+1)).style.color='blue'; document.getElementById('spm'+(CurrentSpm+1)).style.textDecoration='underline'; } } } document.onkeypress = textsizer;
function findCurrentSpm() { var CurrentSpm = 1; for(var i=0;i<document.forms[0].elements.length;i++) { if(document.getElementById('spm'+i)!=null) { if(document.getElementById('spm'+i).style.color=='blue') CurrentSpm=i;} } return CurrentSpm; }
Det er jo svært at vide, om det er mest optimalt at klippe dig med en brodersaks, en trimmer, en hækkesaks eller en flammekaster, når man ikke kender dit hår :)
Det er det, jeg mener ... vi kender ikke koden, den skal 'gennemrode' :)
Derudover er der ikke noget så demotiverende, som et script uden nogen somhelst form for indrykning. Det tager 10 gange så lang tid at sætte sig ind i - og det er helt unødvendigt. Skriv din kode ordentligt. Så er det lettere for dig selv at overskue den - og folk gider gå langt for at hjælpe ;o)
Okay, så forstår jeg :o) Scriptet bliver skrevet ind fra noget asp.net code-behind, men det er selvfølgelig ingen undskyldning for manglende indrykning, kun dovenskab. Selve siden bliver også renderet via asp.net i code-behind, og det er ret omfattende, men outputtet (som vel er det interessante når vi taler om client-side scripting). Siden kommer derved til at indeholde en tabel med 92 rækker med spørgsmål, som: (...) <tr id="spm11" class="boollist" > <td align="left" valign="top" style="font-size:10px;font-weight:bold;">11.</td> <td align="left" valign="top" style="font-size:10px;">spørgsmålstekst</td>
Mon ikke, du kunne oprette et array eller object, hvis elementer får sat en værdi, alt efter hvilken radio, der er klikket på? Det giver vist en meget mindre søgning.
Desuden skal du tænke på, at du i et udtryk som dette:
PS: netop den konstruktion, jeg refererede til ovenfor, indeholder hele tre array-kald i hver objekt-reference. Dvs, at JS/DOM først skal ned i 'dokument.forms' - derefter ned i 'FORM.elements' - og til sidst ned i radio-gruppen - for at finde elementet. Det gør du tre gange, hvor du kunne nøjes med én :)
Godt foreslag.. jeg har prøvet at ændre det nu således det bliver: var spmTD = document.getElementById('spm'+CurrentSpm);
Desværre gav det næsten ikke noget i IE. Det må være noget andet der er krævende, jeg har set cpu belastningen i IE peaker på 100% med scriptet. Jeg har læst lidt rundt på nettet, kan det passe at IE ikke er glad for arbejde med style på objekter?
Jeg har lavet et lidt tidstagning og arbejdet mig ned til at problemet ligger i mine "getElementById", dette tager mere end 10x så lang tid i IE som i FF. Når det så ovenikøbet ligger i en løkke - ja, gæt resten.
Jeg har lavet lidt flere optimeringer, men ovenstående er stadigvæk flaskehalsen.
Forslag er velkomne.. (så noget her må da værre en pine ved ajax)
hvor jeg dog bare hader når man lige har skrevet en masse og så trykker på et link og springer væk fra siden.. gab..
nå, men jeg har optimeret lidt mere og taget nogle målinger. Det der virkelig rykkede var at indsætte nogle breaks i mine løkker. Det burde jo så kun hjælpe på de første spørgsmål og så blive værre og værre. Men! Det gjorde det ikke, slet ikke endda. JEg har lavet en flot lille graf her: http://www.broze.dk/javascript.png Min forklaring er at mine TD's må ligge først i "elements" hvis length iøvrigt er 569 (gab!).
hehe, idéen med det er at man skal kunne bruge det numeriske tastetur til hurtigt at svare på nogle spørgsmål. Der er f.eks. 5 svarmuligheder, og når man så trykker 1-5 afkrydses muligheden og der springes videre til næste.
dit forslag om at lave et array kan jeg ikke helt gennemskue. Det skulle man så gøre første gang, gemme det på en-eller-anden måde og så bruge det til søgning næste gang?
iøvrigt har jeg også leget lidt med document.all som alternativ, dog med værre resultat.
Det er jo meget smart.. man glemmer hurtigt at et "server-hit" ikke er nødvendigt i client-side, så man sagtens kan arbejde med lokale variable. De 91 er dog ikke fast, så en enkelt count må nok ind, men det kunne jo foregå i forbindelse med asp.net renderingen istedet hvor jeg alligevel har det.
Scroll-by giver dog stadigvæk lidt problemer. Tror måske jeg laver en focus og så scroller ekstra bagefter.
Tusind tak for hjælpen! Smid et svar, så skal du få points :o)
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.