Avatar billede milo Nybegynder
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? :)
Avatar billede roenving Novice
23. juli 2004 - 13:14 #1
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 !-)
Avatar billede milo Nybegynder
23. juli 2004 - 13:31 #2
roenving, se samme link. Det har desværre ikke ændret så meget... :)

Ovenstående issues forekommer stadig.
Avatar billede roenving Novice
23. juli 2004 - 14:20 #3
Du har jo ikke nogen stopper på, så på et tidspunkt når størrelsen under 0px i højden !-)
Avatar billede roenving Novice
23. juli 2004 - 14:28 #4
var h = parseInt(document.getElementById("slide"+menuId).style.height);
    if (h>=300||h<3) {
      clearTimeout(id)
    }
Avatar billede milo Nybegynder
23. juli 2004 - 14:30 #5
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 ;)
Avatar billede roenving Novice
23. juli 2004 - 14:45 #6
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 ...
Avatar billede milo Nybegynder
23. juli 2004 - 14:49 #7
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 :)
Avatar billede roenving Novice
23. juli 2004 - 15:13 #8
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)
Avatar billede milo Nybegynder
23. juli 2004 - 15:16 #9
Tænkte bare det ville gå lidt hurtigere :)

Jeg har smidt den på nu.
Avatar billede roenving Novice
23. juli 2004 - 15:27 #10
Jo, men når jeg nu ikke har messenger installeret ...

Kigger !-)
Avatar billede milo Nybegynder
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? :)
Avatar billede roenving Novice
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]
Avatar billede milo Nybegynder
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å.
Avatar billede milo Nybegynder
23. juli 2004 - 15:36 #14
- og ja, ie buggen kommer ikke mere :)

Tak for det :)
Avatar billede milo Nybegynder
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 :)
Avatar billede roenving Novice
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);
  }
}
Avatar billede milo Nybegynder
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 :)
Avatar billede roenving Novice
23. juli 2004 - 17:57 #18
Det lyder mystisk-mærkeligt !-)
Avatar billede milo Nybegynder
23. juli 2004 - 17:58 #19
http://grandpa.xentive.com/~milo/mobilemusic/foo.php

De tager i det hele taget en del cpu kraft :)
Går ud fra det er derfor de ikke åbner lige hurtigt - IE bruger mest cpu kraft.
Avatar billede roenving Novice
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;
Avatar billede milo Nybegynder
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?
Avatar billede milo Nybegynder
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?
Avatar billede roenving Novice
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;
  }
}
Avatar billede roenving Novice
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>
Avatar billede roenving Novice
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;
Avatar billede milo Nybegynder
23. juli 2004 - 18:37 #26
synes ikke det har nogen ændret virkning? :)
http://grandpa.xentive.com/~milo/mobilemusic/foo.php
Avatar billede roenving Novice
23. juli 2004 - 18:42 #27
!-)
    <div class="menuHolder" onclick="doSlide(1);">Menu1</div>
Avatar billede milo Nybegynder
23. juli 2004 - 18:43 #28
...har tilføjet endnu flere points pga. jeg er så krævende ;)
Avatar billede milo Nybegynder
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
Avatar billede roenving Novice
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 =((
Avatar billede roenving Novice
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]-->
Avatar billede roenving Novice
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]-->
Avatar billede milo Nybegynder
23. juli 2004 - 19:59 #33
lækkert...tak for det :) de points er velfortjente.
Avatar billede milo Nybegynder
23. juli 2004 - 19:59 #34
lav et svar :)
Avatar billede roenving Novice
23. juli 2004 - 20:01 #35
Velbekomme '-)
Avatar billede roenving Novice
23. juli 2004 - 20:11 #36
-- og tak for point ;~}
Avatar billede milo Nybegynder
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 :)
Avatar billede roenving Novice
07. september 2004 - 22:33 #38
Er det sådan noget, som sker i denne menu, du er ude efter:

http://www.eksperten.dk/spm/485556
Avatar billede milo Nybegynder
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.
Avatar billede roenving Novice
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 !-)
Avatar billede milo Nybegynder
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.
Avatar billede milo Nybegynder
08. september 2004 - 14:55 #42
Her er reminderen ;)
Avatar billede milo Nybegynder
13. september 2004 - 10:36 #43
bum bum ? :)
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