30. august 2005 - 16:49 Der er 17 kommentarer og
1 løsning

Send information videre

Hej,

Jeg har dette script som, når man klikker på et link, viser/skjuler en <div>.

Det er dog sådan at når man skifter side er <div>'en på ny skjult. Så man ved hvert sideskift skal klikke Vis.
Er der en måde så når <div>'en en gang er blevet vist, så forbliver den vist?

På forhånd mange tak!

Her er koden:

<script>
imgout=new Image(9,9);
imgin=new Image(9,9);

/////////////////BEGIN USER EDITABLE///////////////////////////////
    imgout.src="pic/add2.gif";
    imgin.src="pic/remove2.gif";
///////////////END USER EDITABLE///////////////////////////////////

//this switches expand collapse icons
function filter(imagename,objectsrc){
    if (document.images){
        document.images[imagename].src=eval(objectsrc+".src");
    }
}

//show OR hide funtion depends on if element is shown or hidden
function shoh(id) {
   
    if (document.getElementById) { // DOM3 = IE5, NS6
        if (document.getElementById(id).style.display == "none"){
            document.getElementById(id).style.display = 'block';
            filter(("img"+id),'imgin');           
        } else {
            filter(("img"+id),'imgout');
            document.getElementById(id).style.display = 'none';           
        }   
    } else {
        if (document.layers) {   
            if (document.id.display == "none"){
                document.id.display = 'block';
                filter(("img"+id),'imgin');
            } else {
                filter(("img"+id),'imgout');   
                document.id.display = 'none';
            }
        } else {
            if (document.all.id.style.visibility == "none"){
                document.all.id.style.display = 'block';
            } else {
                filter(("img"+id),'imgout');
                document.all.id.style.display = 'none';
            }
        }
    }
}

</script>

<img src="pic/add2.gif" name="imgfirst" width="9" height="9" border="0" ><a  href="#first" onClick="shoh('first');" >Skjul/Vis</a>

<div style=\"display: none;\" id=\"first\" >
Nu er jeg vist!</div>
Avatar billede softspot Forsker
31. august 2005 - 02:12 #1
Hvis du ikke har mulighed for at klare et på serveren, kan du skrive til en cookie i det øjeblik div'ens synlighed skifter status. Denne cookie skal du så læse igen når siden vises...
31. august 2005 - 16:08 #2
Det kan godt være jeg har mulighed for at "klare det på serveren". Hvordan gør man?
Avatar billede softspot Forsker
31. august 2005 - 16:30 #3
Hmm... ja, det kan godt være jeg var lidt for hurtig med den kommentar, for du poster jo ikke nødvendigvis dine sider og så er et skjult felt jo ikke nødvendigvis sagen, for det havde da være en mulig løsning. Jeg tror faktisk du kommer længst med cookie-løsningen. Jeg har desværre ikke så meget erfaring med clientside cookie-håndtering, men det må være noget i stil med dette:


//show OR hide funtion depends on if element is shown or hidden
function shoh(id) {
    var dt = new Date();
    dt.setDay(dt.getDay()+1);
   
    if (document.getElementById) { // DOM3 = IE5, NS6
        if (document.getElementById(id).style.display == "none"){
            document.getElementById(id).style.display = 'block';
            filter(("img"+id),'imgin');           
        } else {
            filter(("img"+id),'imgout');
            document.getElementById(id).style.display = 'none';           
        }   
        document.cookies = "divstatus=" + document.getElementById(id).style.display + "; Expires=" + dt.toGMTString();
    } else {
        if (document.layers) {   
            if (document.id.display == "none"){
                document.id.display = 'block';
                filter(("img"+id),'imgin');
            } else {
                filter(("img"+id),'imgout');   
                document.id.display = 'none';
            }
            document.cookies = "divstatus=" + document.id.display + "; Expires=" + dt.toGMTString();
        } else {
            if (document.all.id.style.visibility == "none"){
                document.all.id.style.display = 'block';
            } else {
                filter(("img"+id),'imgout');
                document.all.id.style.display = 'none';
            }
            document.cookies = "divstatus=" + document.all.id.style.display + "; Expires=" + dt.toGMTString();
        }
    }
}

</script>
Avatar billede softspot Forsker
31. august 2005 - 16:43 #4
Så kan du på window.onload kalde en rutine der aflæser cookien og sætter status på div'en igen.

Det kan gøres nogenlunde således:

var pos = document.cookies.indexOf("divstatus=");
if(pos != -1) {
  var pos2 = document.cookies.indexOf(";",pos);
  var cval = document.cookies.substring(pos+10, pos2-1);

  if (document.getElementById) // DOM3 = IE5, NS6
    document.getElementById("divstatus").style.display = cval; 
  else if(document.layers)
    document.divstatus.display = cval;
  else
    document.all.divstatus.style.display = cval;
}
Avatar billede softspot Forsker
31. august 2005 - 16:44 #5
Jeg ved det ikke er helt konsistent, men du kan muligvis se idéen i hvad der skal gøres...(?)
04. september 2005 - 23:59 #6
Jeg er ikke særlig god til kodning. Er det muligt for dig at hjælpe mig lidt mere.

På forhånd tak og mange tak for den hjælp du allerede har givet!
Avatar billede softspot Forsker
05. september 2005 - 00:03 #7
Jeg håber det er OK, hvis jeg først vender tilbage imorgen og kigger på det...
12. september 2005 - 18:08 #8
Ja da, tag din tid!
Avatar billede softspot Forsker
12. september 2005 - 19:29 #9
Tiden den flyver og spørgsmål bliver væk...

Jeg har selv haft lidt udfordringer ifht. cookies, specielt at de er meget pernittengryn mht. formatet udløbsdato, samt indholdet i en cookie. Det er lidt anderledes at have en idé og rent faktisk have noget der fungere.

Ud over det så har jeg også andre ting der fylder min hverdag end dette spørgsmål, men jeg er naturligvis ked af hvis du føler dig forbigået (jeg vil undlade at tolke dit udråb som et udtryk for fornærmelse - for det kan men vel ikke være over at skulle vente på gratis hjælp... :)).
Avatar billede roenving Novice
13. september 2005 - 00:26 #10
Jeg ved, at jeg havde fat i en surfer- (wind-surfer !-) side for 1 eller 1½ år siden, hvor jeg rimeligt intenst kiggede på den slags bruger-visningen bestemt af cookies, men den kan jeg selvfølgelig ikke lige finde ...
Avatar billede softspot Forsker
13. september 2005 - 01:18 #11
Har lige fedtet med det et par timer eller tre og er kommet frem til nedenstående knap så skønne løsning (som er en testside). Du kan evt. klippe de to funktioner der hedder IDList og IDValueList ud og lægge dem i sin egen js-fil og inkludere dem i siden i stedet - det vil gøre tingene lidt mere overskuelige. Anyway! Here goes:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<script>
function IDList(idList) {
    this.separator = ",";
    if(arguments.length > 1) this.separator = arguments[1];
    if(idList.length > 0)
        this.list = idList.split(this.separator);
    else
        this.list = new Array();
   
    IDList.prototype.findIDIndex = function(id) {
        for(var i = 0; i < this.list.length; i++) {
            if(this.list[i] == id)
                return i;
        }
        return -1;
    }
   
    IDList.prototype.addID = function(id) {
        var idIdx = this.findIDIndex(id);
        if(idIdx < 0)
            this.list[this.list.length] = id;
    }
   
    IDList.prototype.deleteID = function(id) {
        var idIdx = this.findIDIndex(id);
        if(idIdx > -1)
            this.list.splice(idIdx,1);
    }
   
    IDList.prototype.toString = function() {
        return this.list.join(this.separator);
    }
}

function IDValueList(idValueList) {
    function IDValue(id, value) {
        this.id = id;
        this.value = value;
        this.separator = "=";
        if(arguments.length > 2) this.separator = arguments[2];
       
        IDValue.prototype.toString = function() {
            return this.id + this.separator + this.value;
        }
    }
   
    this.listseparator = ",";
    this.idvalueseparator = "=";
    if(arguments.length > 1) this.listseparator = arguments[1];
    if(arguments.length > 2) this.idvalueseparator = arguments[2];
    this.list = new Array();

    var tmpLst = idValueList.split(this.listseparator);
    for(var i = 0; i < tmpLst.length; i++) {
        var tmpIV = tmpLst[i].split(this.idvalueseparator);
        var tmpIVstr = (tmpIV[1] ? tmpIV[1] : "");
        this.list[this.list.length] = new IDValue(tmpIV[0], tmpIVstr, this.idvalueseparator);
    }
   

    IDValueList.prototype.findIDIndex = function(id) {
        for(var i = 0; i < this.list.length; i++) {
            if(this.list[i].id.indexOf(id) > -1)
                return i;
        }
        return -1;
    }
   
    IDValueList.prototype.addValue = function(id, value) {
        var idx = this.findIDIndex(id);
        if(idx < 0)
            this.list[this.list.length] = new IDValue(id, value, this.idvalueseparator);
        else
            this.list[idx].value = value;
    }
   
    IDValueList.prototype.deleteValue = function(id) {
        var idx = this.findIDIndex(id);
        if(idx > -1)
            this.list.splice(idx, 1);
    }
   
    IDValueList.prototype.getValue = function(id) {
        var idx = this.findIDIndex(id);
        if(idx > -1)
            return this.list[idx].value;
        return null;
    }

    IDValueList.prototype.getIDValue = function(id) {
        var idx = this.findIDIndex(id);
        if(idx > -1)
            return this.list[idx];
        return null;
    }

    IDValueList.prototype.toString = function() {
        var sep = this.listseparator;
        if(arguments.length > 0) sep = arguments[0];
        return this.list.join(sep);
    }
}


imgout=new Image(9,9);
imgin=new Image(9,9);

/////////////////BEGIN USER EDITABLE///////////////////////////////
    imgout.src="pic/add2.gif";
    imgin.src="pic/remove2.gif";
///////////////END USER EDITABLE///////////////////////////////////

//this switches expand collapse icons
function filter(imagename,objectsrc){
    if (document.images){
        document.images[imagename].src=eval(objectsrc+".src");
    }
}

//show OR hide funtion depends on if element is shown or hidden
function shoh(id) {
    var objCH = new IDValueList(document.cookie, ";");
    var ids = objCH.getValue("layers");
    if(!ids) ids = "";
    var objSelIds = new IDList(ids);
   
    if (document.getElementById) { // DOM3 = IE5, NS6
        if (document.getElementById(id).style.display == "none"){
            document.getElementById(id).style.display = 'block';
            filter(("img"+id),'imgin');           
            objSelIds.addID(id);
        } else {
            filter(("img"+id),'imgout');
            document.getElementById(id).style.display = 'none';           
            objSelIds.deleteID(id);
        }   
    } else {
        if (document.layers) {   
            if (document.id.display == "none"){
                document.id.display = 'block';
                filter(("img"+id),'imgin');
                objSelIds.addID(id);
            } else {
                filter(("img"+id),'imgout');   
                document.id.display = 'none';
                objSelIds.deleteID(id);
            }
        } else {
            if (document.all.id.style.visibility == "none"){
                document.all.id.style.display = 'block';
                objSelIds.addID(id);
            } else {
                filter(("img"+id),'imgout');
                document.all.id.style.display = 'none';
                objSelIds.deleteID(id);
            }
        }
    }
    var dt = new Date();
    dt = new Date(dt.getTime() + 3600000);
    objCH.addValue("layers", objSelIds.toString() + "; expires=" + dt);
    document.cookie = objCH.getIDValue("layers");
}

window.onload = function() {
    var objCH = new IDValueList(document.cookie, ";");
    var ids = objCH.getValue("layers");
    if(!ids) ids = "";
    var lstIds = ids.split(",");

    for(var i = 0; i < lstIds.length; i++) {
        if(lstIds[i] != "") {
            var elm = document.getElementById(lstIds[i]);
            if(elm) elm.style.display = "block";
        }
    }
}
</script>
</head>
<body>

<img src="pic/add2.gif" name="imgfirst" width="9" height="9" border="0">
<a href="java script:void()" onClick="shoh('first');" >Skjul/Vis</a>

<img src="pic/add2.gif" name="imgsecond" width="9" height="9" border="0">
<a href="java script:void()" onClick="shoh('second');" >Skjul/Vis</a>

<img src="pic/add2.gif" name="imgthird" width="9" height="9" border="0">
<a href="java script:void()" onClick="shoh('third');" >Skjul/Vis</a>

<img src="pic/add2.gif" name="imgfourth" width="9" height="9" border="0">
<a href="java script:void()" onClick="shoh('fourth');" >Skjul/Vis</a>

<div style="display: none;" id="first" >1. Nu er jeg vist!</div>
<div style="display: none;" id="second" >2. Nu er jeg vist!</div>
<div style="display: none;" id="third" >3. Nu er jeg vist!</div>
<div style="display: none;" id="fourth" >4. Nu er jeg vist!</div>


</body>
</html>
Avatar billede softspot Forsker
13. september 2005 - 01:24 #12
I bund og grund gør jeg det at jeg gemme hvilke lag der er åbne i en times tid, hvilket skulle være nok til at indstillingerne kan huskes indtil siden vender tilbage fra serveren. Det kan sættes op ved at forøge værdien i denne linie:

    dt = new Date(dt.getTime() + 3600000);

tallet angiver antal millisekunder som cookien skal leve, dvs. i dette tilfælde
1000 * 60 * 60 = 3600000

Vil du have den til at leve et døgn, ganger du naturligvis bare det tal med 24, altså
1000 * 60 * 60 * 24 = 86400000

Håber det også fungerer for dig. Jeg er lidt usikker på måden hvorpå jeg håndterer cookies, da der på denne måde vist nok kun kan eksistere een cookie (nemlig den der hedder layers) ad gangen - den overskriver alle andre. Men hvis du ikke har brug for flere, så er det måske ok...?
17. september 2005 - 18:14 #13
Det må jeg nok sige! Du har godt nok lavet et flot stykke arbejde! Tusind tak!
Der er dog en lille ting jeg godt kunne ønske. Er det muligt at billederne ikke "nulstiller" når man skifter side (scriptet går tilbage til pic/add2.gif hver gang selvom div'en er åben).

(Sætter lige pointene op til 150)
Avatar billede softspot Forsker
17. september 2005 - 23:34 #14
Jeg vil tro flg. ændrede window.onload kan løse denne udfordring:

window.onload = function() {
    var objCH = new IDValueList(document.cookie, ";");
    var ids = objCH.getValue("layers");
    if(!ids) ids = "";
    var lstIds = ids.split(",");

    for(var i = 0; i < lstIds.length; i++) {
        if(lstIds[i] != "") {
            var elm = document.getElementById(lstIds[i]);
            if(elm) {
                filter(("img"+lstIds[i]),'imgin');
                elm.style.display = "block";
            }
        }
    }
}
22. september 2005 - 19:37 #15
Tusind tak! Vil du være venlig at lægge et svar?
Avatar billede softspot Forsker
22. september 2005 - 19:41 #16
Ja da! :)

...og velbekomme.
Avatar billede softspot Forsker
24. september 2005 - 00:25 #17
Tak for point :)
13. oktober 2005 - 22:32 #18
Hej igen softspot. Vil bare gøre dig opmærksom på, at jeg har oprettet et nyt spørgsmål vdr. dette script. Det er blot en mindre ændring af det, så hvis du har lyst til at kigge på det, ville det være herligt, da jeg var meget glad for din hjælp sidste gang!
http://www.eksperten.dk/spm/655896
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