Avatar billede bimmer123 Nybegynder
04. juli 2007 - 18:49 Der er 4 kommentarer og
1 løsning

Expanding/Collapsing Menu

Hej Eksperter!

Jeg har et JavaScript til en expanding menu, den er megt simple, selve menuen består af nogle div's som indeholder forskellige kategorier. Disse divs er så skjulte som standard indtil man klikker på en menu kategori og et javascript så ændre css attributen til at div boxen skal vises.

I en variable gemmes så navnet på den sidst åbnede div box således at den collapses ved åbning af en ny kategori.

Mit problem er så at scriptet ikke huske hvilken kategori der er åbnet ved reload af siden, jeg vil altså gerne have at den aktuelle kategori holdes åben ved evt. reload, navigering osv.

Det er vel i virkeligheden noget der meget simpelt kan laves ved hjælp af en cookie, men jeg forstår mig ikke på Javascript.

Mit script ser sådan ud:

var last_expanded = '';

function showHide(id)
{
var obj = document.getElementById(id);

var status = obj.className;

if (status == 'hide') {

if (last_expanded != '') {
var last_obj = document.getElementById(last_expanded);
last_obj.className = 'hide';
}

obj.className = 'show';

last_expanded = id;

} else {
obj.className = 'hide';
}
}

Der er 100 lette point til den der hurtigt kan modificeret scriptet til det jeg skal bruge, det er VIGTIGT at koden holdes lille, "ren" og simpel.

På forhånd tak :)
Avatar billede roenving Novice
05. juli 2007 - 05:08 #1
Hrm, hvis du skal huske noget sådant, skal du jo gøre det på siderne (simplest !-) eller med en cookie ...

Derfor er det så nødvendigt at kigge på, hvordan dine sider laves, har du noget serverside ?-)

-- desuden kan det tilføjes at klasseskift on-the-fly er noget af det dårligst performende, du kan finde på, du bør hellere bare ændre attributten, så det vises/skjules, og det kan gøres endnu simplere:

<script type="text/javascript">
var oldObj = null;
function showHide(id){
  if(oldObj)
    oldObj.style.display = "none";
  oldObj = document.getElementById(id);
  oldObj.style.display = oldObj.style.display != "block" ? "block" : "none";
}
</script>
Avatar billede bimmer123 Nybegynder
05. juli 2007 - 20:20 #2
jeg kan ikke bruge style attributten da det er vigtig at koden holdes xhtml 1.0 strict valid og at alt styling derfor holdes et seprat style sheet.

Jeg tænkte på om ikke det var muligt bare at gemme last_expanded i en cookie, og så bruge en onLoad i body tagget til at aktivere en function der sætter id'et til class'en show...
Avatar billede roenving Novice
07. juli 2007 - 06:31 #3
Der er ingen problemer med ovenstående og xhtml, det er faktisk den anbefalede metode til at ændre noget on-the-fly, hvis man har xhtml-dokumenter !-)

-- men hvordan serverer du dine dokumenter ?-)

-- gør du det med noget serverside, kan vi jo sætte den aktuelle ting ind i oldObj-variablen ved simpelthen at skrive det !o]
Avatar billede bimmer123 Nybegynder
07. juli 2007 - 12:54 #4
Hej roenving,

Nu har jeg lavet det med asp istedet ved simpelthen bare at tilføjet en querystring på hvert link og bruge denne til at bestemme hvilken af menu kategorierne der skal åbnes...

Det selvfølgelig ikke optimalt da det kræver en reload af siden hver gang man navigere i menu kategoriene, men det må jeg leve med... Ellers tak for din hjælp.

Nu har jeg lidt spørgsmål til nogle af de input du er kommet med...

Du skrev tidligere at det var noget af det værst performende at ændre en class on-the-fly, men eftersom det jo ville have været med JavaScript og derfor sker på brugerens egen computer er det vel ikke noget at bekymre sig om? Jeg mener at en enkelt class ændres på brugerens egen maskine uanset hvor dårligt performende kan vel ikke være så galt at en bruger overhovedet vil mærke en forringet brugeroplevelse. Og eftersom det ikke tager ressource på serveren er det vel heller ikke noget jeg skal bekymre mig om???

Nu har jeg ikke testet dit script og jeg forstår mig ikke på Javascript og derfor kan jeg heller ikke gennemskue hvad outputtet i din kode vil være, men hvis display: none; tilføjes direkte i xhtml koden som en style attribute i det eksistende tag og ikke er en ændring i det bagved liggende stylesheet så er det brud på strict standarden og vil jo derfor give invalid kode...
Avatar billede roenving Novice
10. juli 2007 - 10:05 #5
Jo, at ændre class on-the-fly er noget at bekymre sig om, for en bruger vil naturligvis være interesseret i, at simple ændringer på siden sker nærmest øjeblikkeligt ...

-- og da browseren ikke ved hvilken indflydelse ændring af et className vil have på andre elementers visning, vælger den at genberegne alle elementers visning, i komplicerede og store html-dokumenter kan en sådan beregning tage op til flere sekunder ...

-- hvilket er ligegyldigt, når siden loades, men kan få utålmodige brugere til at forlade sitet, hvis de klikker lidt frem og tilbage på lige de elementer, der udløser ændringen ...

-- og mit kodeeksempel er derfor skabt til at kunne bruges bl.a. under xhtml, da den tester om css-attributten _ikke_ er noget bestemt, og derfor vil fungere ganske udmærket med attributter sat i et (eksternt) stylesheet !-)
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