Avatar billede henan Nybegynder
14. juni 2003 - 13:15 Der er 17 kommentarer og
2 løsninger

Crossbrowser show/hide med cookies

Så er der en rigtig driller til alle JS-folkene ;-)

Jeg mangler et crossbrowser script, der skal bruges til at vise/skjule (A) en udvidet liste af muligheder i en søgning og (B) en hjælpemenu på samme side.

Scriptet skal kunne fungere fra et link til både show og hide. Desuden skal det læse/skrive en cookie, der fortæller om det pågældende lag er vist eller skjult.

Hvis man fx kommer ind på siden første gang skjules begge lag, men hvis man har vist den udvidede liste og lavet en søgning, skal den udvidede liste være udlået, når man kommer tilbage til siden efter at have set nærmere på et af resultaterne.
Avatar billede punnishment Nybegynder
14. juni 2003 - 13:32 #1
http://www.eksperten.dk/spm/363641

vi har lige haft et samme problem kørende! Lav nogle søgninger - så vil du tit finde samme problemer med en løsning!!
Avatar billede roenving Novice
14. juni 2003 - 13:44 #2
-- og vend tilbage, henan, hvis du har andre ideer !o]
Avatar billede henan Nybegynder
14. juni 2003 - 14:18 #3
Der var jeg lidt for hurtig - sådan er dét nu engang!

punnishment -> Kan du ikke samle det færdige script til mig, så er jeg 100% sikker på, at jeg får det rigtige script? Jeg synes jeg mistede overblikket efter de første 5-10 poster ;-)
Avatar billede roenving Novice
14. juni 2003 - 14:31 #4
Du kan da få det af mig -- det har jeg jo stadig:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Cookie-test</TITLE>
<META NAME="Generator" CONTENT="Stone's WebWriter 3.5">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

<SCRIPT LANGUAGE="javascript" TYPE="text/javascript">
ns4 = (document.layers)? true:false
ie4 = (document.all)? true:false
ie5 =(document.getElementById)? true:false
ns6 = (document.getElementById && !document.all)?true:false;

function ShowHide(id){
var act = "0";
var styleObj = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style;
if(styleObj.display == "none"){
styleObj.display = "";
act = "1";
}else{
styleObj.display = "none"
}
updateCookie(id,act);
}

function updateCookie(id,act){
    var found = false;
    if(document.cookie){
        var oldCook = document.cookie;
        var tmp = oldCook.split(";");
        for (i=0;tmp.length>i;i++){
            if (tmp[i].indexOf("ShowHide=")!=-1){
                newCook = tmp[i].substring(9+tmp[i].indexOf("ShowHide=")).split(":");
                found = true;
                break;
            }
        }
        var updated = false;
        if (found){
        for (i=0;newCook.length>i;i++){
            if (newCook[i].indexOf(id+"-")==0){
                newCook[i] = id+"-"+act;
                updated = true;
                break;
            }
        }
        }else{newCook = new Array();}
        if(!updated){
            newCook[newCook.length] = id+"-"+act;
        }
    }else{
        newCook = new Array();
        newCook[0] = id+"-"+act;
    }
    var exp = new Date();
    exp.setYear(exp.getFullYear()+1);//cookien gælder et år
    var txt = "ShowHide="+newCook.join(":")+"; expires="+exp.toGMTString()+"; path=/; domain=.surfersinfo.dk";
    document.cookie = txt;
}

function updateShowHide(){
    if (document.cookie){
        var tmp = document.cookie.split(";");
        var cook = false;
        for (i=0;tmp.length>i;i++){
            if (tmp[i].indexOf("ShowHide=")!=-1){
                newCook = tmp[i].substring(9+tmp[i].indexOf("ShowHide=")).split(":");
                cook = true;
                break;
            }
        }
        if(cook){
            for (i=0;newCook.length>i;i++){
                id = newCook[i].substring(0,newCook[i].indexOf("-"));
                act = newCook[i].charAt(newCook[i].length-1);
                var styleObj = null;
                if(ns4){
                    styleObj = document.layers[id];
                }else    if(ie4){
                      if (document.all[id]){styleObj = document.all[id].style;}
                  }else{
                    if (document.getElementById(id)){styleObj = document.getElementById(id).style;}
                  }
                if (styleObj){
                    if(act==0){
                        styleObj.display = "none";
                    }else{
                        styleObj.display = "";
                    }
                }
            }
        }
    }
}
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" ONLOAD="updateShowHide()">
<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
  <TR>
    <TD ONCLICK="java script:ShowHide('menu_box_1')" CLASS=menu_box_0 TITLE="vis / gem" BGCOLOR="#999999">klik
      her </TD>
  </TR>
  <TR>
    <TD ONCLICK="java script:ShowHide('menu_box_2')" CLASS=menu_box_0 TITLE="vis / gem" BGCOLOR="#999999">klik
      her (2)</TD>
  </TR>
</TABLE>
<DIV NAME="menu_box_1" ID="menu_box_1" STYLE="display:block;">
  <TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
    <TR>
      <TD BGCOLOR="#FF6600">OLAV1</TD>
    </TR>
  </TABLE>
</DIV>
<DIV NAME="menu_box_0" ID="menu_box_0" STYLE="display:block;">
  <TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
    <TR>
      <TD BGCOLOR="#FF6600">OLAV2</TD>
    </TR>
  </TABLE>
</DIV>
</BODY>
</HTML>

Som helt html-dokument ...

-- du skal selvfølgelig tilpasse navne m.m.
Avatar billede henan Nybegynder
14. juni 2003 - 14:37 #5
sorry 2 tell u men jeg får en fejl, når jeg klikker på klik her (2) -> document.all[...].style er null eller ikke et objekt

:-)
Avatar billede roenving Novice
14. juni 2003 - 14:41 #6
Det var satans -- det sidste jeg sku rette var nemlig den fejl, så mit script er lavet til at genskabe fejlen *gg*:

    <TD ONCLICK="java script:ShowHide('menu_box_0')" CLASS=menu_box_0 TITLE="vis / gem" BGCOLOR="#999999">klik
      her </TD>
  </TR>
  <TR>
    <TD ONCLICK="java script:ShowHide('menu_box_1')" CLASS=menu_box_0 TITLE="vis / gem" BGCOLOR="#999999">klik
      her (2)</TD>

hth
jes
Avatar billede henan Nybegynder
14. juni 2003 - 14:42 #7
hehe, der var fejl i navngivningen (menu_box_0/2) i onClick sætningen.

Skal CLASSen have forskellige værdier?
Avatar billede roenving Novice
14. juni 2003 - 14:45 #8
Classes er til formattering af elementerne, så det skal du finde ud af i dit stylesheet -- det har intet med småkagerne at gøre ...
Avatar billede roenving Novice
14. juni 2003 - 14:49 #9
-- og rettelsen af den fejl betød, at koden nu er indrettet så du kan lave om i designet mellem to besøg fra den samme surfer -- nok ikke uvæsentligt, nå vi som her giver cookien en løbetid på et år !o]
Avatar billede henan Nybegynder
14. juni 2003 - 15:23 #10
Ok, nu kommer så det store spørgsmål: Hvornår skriver den til cookien? Når jeg bruger scriptet og fx lukker min browser ned og åbner den igen, har den "glemt" at begge skulle være lukket...

Det gælder både i Mozilla og Explorer.
Avatar billede roenving Novice
14. juni 2003 - 15:38 #11
Den skriver cookien hver gang du trykker på et link, som aktiverer ShowHide -- hvad browserne gør er noget forskelligt ...

Et gæt kunne være, at Mozilla har arvet Netscapes måde at gøre det på: at vedligeholde en tekstfil i hukommelsen, som så rammer disken i det øjeblik browseren lukkes ...

IE vedligeholder faktisk cookies on-the-fly på disken fandt jeg ud af den anden dag -- og på min virker det upåklageligt !-)

-- har du checket dine cookie-indstillinger ?o]
Avatar billede henan Nybegynder
14. juni 2003 - 15:46 #12
Jeg kan sagtens skrive/læse andre cookies i IE. Og det samme gælder Mozilla.

Det virker heller ikke i NS6.

Hvis jeg har forstået det rigtigt så burden scriptet skrive til en cookie on-the-fly og så burde scriptet fx skjule lagene, når jeg bare opdaterer siden?

Tanke #1: Er det fordi jeg kører på min localhost?
Tanke #2: Er det fordi jeg kører med WinXP?
Tanke #3: Er det fordi Echelon er ude efter mig?
Avatar billede roenving Novice
14. juni 2003 - 16:00 #13
Sikkert det sidste ...

Jeg kører uden server, så det med test er mod min egen og jeg kører på XP også .-)

-- spørgeren i det nævnte spm har jo haft den i test over nettet, så jeg forstår ik' li'e ?o)

-- og ja, du har forstået funktionaliteten rigtigt !-)
Avatar billede henan Nybegynder
14. juni 2003 - 16:42 #14
Ok, hvis man nu antager at man under updateCookie-funktionen burde skifte surfersinfo.dk ud med den host man nu bruger, så ville det måske virke ;-)

Altså undtagen hvis jeg bruger localhost. Hvis man bruger en lokal server skal man bruge ip-addyen (fx 127.0.0.1).

Hvis nogen har idéer til at løse den med localhost, hører jeg meget gerne om det ;-)
Avatar billede roenving Novice
14. juni 2003 - 16:46 #15
-- selvfølgelig cookien dur kun overfor det domain=.xxx.xx som er skrevet ind i ...

-- du fik jo den ellers tilrettede udgave af scriptet, for det var der jeg lavede tilføjelsen med domain ...

Faktisk kan du til de allerfleste formål fjerne den del af det, da cookien vil tilhøre domænet alligevel ...
Avatar billede henan Nybegynder
14. juni 2003 - 16:49 #16
Du er sørme guld værd!

Drop et svar og der er points til dig - med mange tak for hjælpen!
Avatar billede roenving Novice
14. juni 2003 - 16:54 #17
Velbekomme '-)

-- og glem ikke punnishment, som kom med linket ...
Avatar billede henan Nybegynder
14. juni 2003 - 16:57 #18
Er det fair med en 20-40? Ellers må I brokke jer! :-)
Avatar billede roenving Novice
14. juni 2003 - 16:58 #19
-- takker for points ;~}
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