23. juli 2004 - 13:07
Der er
42 kommentarer og 1 løsning
buggy menu
http://grandpa.xentive.com/~milo/mobilemusic/foo.php Er igang med denne menu...men:
1) får en fejl i IE, jeg ikke kan gennemskue hvorfor jeg får.
2) menuen opfører sig højst mærkværdigt i != IE :)
Hvis I kigger på den i IE, kan I (trods fejlen) nok gennemskue hvad det er den skal kunne...
Nogen der gider hjælpe med at rette de to issues? :)
Annonceindlæg fra SuperOffice
Brug denne i stedet: document.getElementById("slide"+menuId).style.height = document.getElementById("slide"+menuId).offsetHeight + (3 * doScale) + "px"; -- en .style.noget har kun en værdi, hvis den er sat som property i selve elementets tag, eller er tildelt via javascript !-)
roenving, se samme link. Det har desværre ikke ændret så meget... :) Ovenstående issues forekommer stadig.
Du har jo ikke nogen stopper på, så på et tidspunkt når størrelsen under 0px i højden !-)
var h = parseInt(document.getElementById("slide"+menuId).style.height); if (h>=300||h<3) { clearTimeout(id) }
ah ja, det gjorde den en _del_ bedre i firefox :) - tak. Har du også en løsning på #1 ? Giver gerne rigeligt ud af points, skal bare have det her gejl færdigt inden kl 17 ;)
Prøv at sætte det ind i en try-catch-blok: try{ //scriptet }catch(e){ alert(e) } -- måske har det nu noget med at offsetHeight jo bliver nul, men det skulle ikke betyde noget ... I hvert fald kan jeg se, at der nu kun er een ugyldigt argument-fejl, og kun når hiver fat anden gang, hvor der før var 2 fejl, hvilket præcis svarede til at der var 2 elementer, som fik en negativ udstrækning ...
se siden nu :) jeg har i øvrigt tiføjet dig på msn - ved godt det er ufattelig dårlig skik, men kunne ikke lade være :)
Det hjælper nu ikke så meget med msn ... -- så har vi fundet ud af, at fejlen forekommer ved første gennemløb, så prøv at alerte sådan: alert(e.message+"\n"+menuId+"\n"+document.getElementById("slide"+menuId).offsetHeight+"\n"+document.getElementById("slide"+menuId).tagName)
Tænkte bare det ville gå lidt hurtigere :) Jeg har smidt den på nu.
23. juli 2004 - 15:27
#10
Jo, men når jeg nu ikke har messenger installeret ... Kigger !-)
23. juli 2004 - 15:28
#11
:-) En andenting - vil det være en stor ting at gøre så bunden ikke står og "hopper" når divs scroller? :)
23. juli 2004 - 15:34
#12
Det er helt umuligt, at få det til at stå helt stille, fordi funktionen kaldes som tre selvstændige, og derfor vil være en anelse asynkrone ... var doScale = (scale == "open") ? 1 : (document.getElementById("slide"+menuId).offsetHeight<3)? 0 : -1; -- skulle klare problemet !-) Kigger lige på en udgave, som kaldes som en funktion !o]
23. juli 2004 - 15:34
#13
...og gøre så et div ikke udvidder sig 3px pr. yderligere klik, efter det er udviddet :) Har smidt 30 points mere på.
23. juli 2004 - 15:36
#14
- og ja, ie buggen kommer ikke mere :) Tak for det :)
23. juli 2004 - 15:38
#15
Mht. én funktion skal det jo nok være noget, der tjekker hvilke divs der er åbne og lukker dem, i stedet for at lukke de åbne manuelt vha. funktionskald :)
23. juli 2004 - 16:42
#16
function slide(menuId) { var doScale, h, scale = false,res = ""; var numMenus = 3; var maxHeight = 300; for(i=1;numMenus>=i;i++){ if(i==menuId) doScale = 1; else doScale = -1; h = document.getElementById("slide"+i).offsetHeight + (3 * doScale); res += h; h = (h>maxHeight)?maxHeight:(0>=h)?1:h; res += h; if(h>=0)document.getElementById("slide"+i).style.height = h + "px"; scale = scale || (h>1 && maxHeight>h); } if (scale) { window.setTimeout("slide("+menuId+");",10); } }
23. juli 2004 - 17:54
#17
Så er jeg tilbage. Ahh, den virker jo glimrende. Dog er den *ret* langsom om at folde sig ud, i IE, i forhold til firefox/opera. På den gamle menu var det lige omvendt :)
23. juli 2004 - 17:57
#18
Det lyder mystisk-mærkeligt !-)
23. juli 2004 - 17:59
#20
Jeg undredes forøvrigt også over, at du ikke synkroniserer udfoldningen, så den der foldes ud udfoldes ligeså meget som dem der foldes ind !-) -- altså hver gang en ting foldes ud, skal den udfoldes ligeså meget som alle dem, der foldes ud, tilsammen ændres ... f.eks. doScale = numMenus-1;
23. juli 2004 - 18:03
#21
du snakker om den gamle kode nu, ik ? :) Din virker jo glimrende, bortset fra som sagt at den er ret langsom i IE :) Er det noget der kan gøres noget ved?
23. juli 2004 - 18:05
#22
og, hvis man klikker på nogen menupunkter imens en scroll allerede foretages, fucker den en del :) og tager mere cpukraft og bliver derved langsommere...kan man ikke lave således, at klik ikke registreres før et udfold er gennemført?
23. juli 2004 - 18:07
#23
Det fatter jeg ikke en meter af !-) Men jeg kan godt se det ... var opened = false; function slide(menuId) { var doScale, h, scale = false,res = ""; var numMenus = 3; var maxHeight = 300; for(i=1;numMenus>=i;i++){ if(i==menuId) doScale = (opened)?1:2; else doScale = -1; h = document.getElementById("slide"+i).offsetHeight + (3 * doScale); h = (h>maxHeight)?maxHeight:(0>=h)?1:h; if(h>=0)document.getElementById("slide"+i).style.height = h + "px"; scale = scale || (h>1 && maxHeight>h); } if (scale) { window.setTimeout("slide("+menuId+");",10); }else{ opened = true; } }
23. juli 2004 - 18:13
#24
-- og med at forhindre den, skal vi en lille omvej: var opened = false,sliding = false; function doSlide(menuId){ if(sliding)return; slide(menuId); } function slide(menuId) { sliding = true; var doScale, h, scale = false,res = ""; var numMenus = 3; var maxHeight = 300; for(i=1;numMenus>=i;i++){ if(i==menuId) doScale = (opened)?1:2; else doScale = -1; h = document.getElementById("slide"+i).offsetHeight + (3 * doScale); h = (h>maxHeight)?maxHeight:(0>=h)?1:h; if(h>=0)document.getElementById("slide"+i).style.height = h + "px"; scale = scale || (h>1 && maxHeight>h); } if (scale) { window.setTimeout("slide("+menuId+");",10); }else{ opened = true; sliding = false; } } </script> <div class="menuHolder" onclick="doSlide(1);">Menu1</div>
23. juli 2004 - 18:14
#25
og doScale skal selvfølgelig sættes til antallet af menu-punkter minus 1, når der skal udfoldes første gang: if(i==menuId) doScale = (opened)?1:numMenus-1;
23. juli 2004 - 18:37
#26
23. juli 2004 - 18:42
#27
!-) <div class="menuHolder" onclick="doSlide(1);">Menu1</div>
23. juli 2004 - 18:43
#28
...har tilføjet endnu flere points pga. jeg er så krævende ;)
23. juli 2004 - 18:45
#29
ah ja, nu kan man ikke klikke på 2 på en gang, perfekt. Dog er den stadig ustyrligt langsom i IE :/ Er det ikke muligt at gøre så den "renderer" lige hurtigt i IE/firefox/opera? :) Lige nu er den _perfekt_ i !=IE
23. juli 2004 - 19:00
#30
Vi kan jo checke om det er en IE og så lave den hurtigere: Indsæt dette i koden udenfor scriptet: <script type="text/javascript"> var ie = false; <!--[if IE]> ie = true; <![endif]--> </script> -- og ændr denne linje: window.setTimeout("slide("+menuId+");",(ie)?5:10); -- hvis 5 stadig er for langsom kan du sætte den yderligere ned !-) Næh, det kan man ikke ,-( Den bliver kun en anelse hurtigere, så omkring 8 eller 9 er det hurtigste man kan opnå med IE =((
23. juli 2004 - 19:02
#31
Hov, jeg fik smidt mit første udkast og ikke den rigtige: var opened = false,sliding = false,ie=false; -- og: <!--[if IE]> <script type="text/javascript"> ie = true; </script> <![endif]-->
23. juli 2004 - 19:15
#32
Hrm, det virker kun med at sætte afstanden op: <script type="text/javascript"> <!-- var opened = false,sliding = false,ie=false; function doSlide(menuId){ if(sliding)return; slide(menuId); //alert(ie); } function slide(menuId) { sliding = true; var doScale, h, scale = false,res = ""; var numMenus = 3; var maxHeight = 300; for(i=1;numMenus>=i;i++){ if(i==menuId) doScale = (opened)?1:numMenus-1; else doScale = -1; h = document.getElementById("slide"+i).offsetHeight + (((ie)?7:3) * doScale); h = (h>maxHeight)?maxHeight:(0>=h)?1:h; if(h>=0)document.getElementById("slide"+i).style.height = h + "px"; scale = scale || (h>1 && maxHeight>h); } if (scale) { window.setTimeout("slide("+menuId+");",10); }else{ opened = true; sliding = false; } } --> </script> <!--[if IE]> <script type="text/javascript"> ie = true; </script> <![endif]-->
23. juli 2004 - 19:59
#33
lækkert...tak for det :) de points er velfortjente.
23. juli 2004 - 19:59
#34
lav et svar :)
23. juli 2004 - 20:01
#35
Velbekomme '-)
23. juli 2004 - 20:11
#36
-- og tak for point ;~}
03. september 2004 - 13:25
#37
Hej roenvig, har du lyst til at modificere menuen, hvis jeg opretter et nyt spg. med 60 points? :) Har prøvet selv, uden held, at få den til at scrolle tilbage til startpositionerne, hvis man trykker på en menu som er åben...altså, så man har lukke og åbne funktion, på hver menu. På forhånd tak :)
07. september 2004 - 23:14
#39
jeps...lige præcis :) de skal dog ikke alle lukke helt sammen når man trykker på menuen der er åben, men i stedet for skal de blot scrolle tilbage til startpositionerne hvor de alle har en xxx defineret højde.
07. september 2004 - 23:22
#40
Den skal jeg tygge lidt på, for umiddelbart ser det ud til, at jeg får brug for en ekstra parameter på objekterne og et par ekstra kontrol-strukturer, men jeg lurer på det, send f.eks. en reminder i løbet af imorgen i spørgsmålet her !-)
08. september 2004 - 09:19
#41
Ok sender en reminder senere ;) - Det skal siges at det ikke gør noget du omskriver det hele...pågældene ser nemlig ud til at køre MEGET dårligt på lidt langsommere computere, samt i firefox og opera... :) I firefox tager det 100% cpu når en scroll-process er igang.
08. september 2004 - 14:55
#42
Her er reminderen ;)
13. september 2004 - 10:36
#43
bum bum ? :)
Vi tilbyder markedets bedste kurser inden for webudvikling