11. juni 2003 - 19:58Der er
110 kommentarer og 1 løsning
Udvidelse af javascript
Hej.
Dette er en udfordring til den, der kan og vil. Folk, der fnyser, finder bare et andet spørgsmål :-)
Nedenstående script aktiverer/ deaktiverer et layer og virker i øvrigt fint.
Imidlertid kunne jeg godt tænke mig at gemme instillingerne i en cookie, således at de aktiverede/ deaktiverede layers gemmes til næste besøg en anden dag.
Det kunne være fedt, hvis oplysningerne kunne gemmes i 1 variabel i cookien.
Derudover skal scriptet naturligvis virke i flest browsere som muligt.
function updateCookie(id,act){ 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(":"); break; } } var updated = false; for (i=0;newCook.length>i;i++){ if (newCook[i].indexOf(id+"-")==0){ newCook[i] = id+"-"+act; updated = true; break; } } if(!updated){ newCook[newCook.length] = id+"-"+act; } var exp = new Date(); exp.setYear(exp.getFullYear()+1);//cookien gælder et år document.cookie = "ShowHide="+newCook.join(":")+"; expires="+exp.toGMTString(); }
function updateShowHide(){ 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 = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style; if(act=="0")styleObj.display == "none"; else styleObj.display = ""; } }
}
-- og så skal der selvfølgelig en onload="updateShowHide();" på body-taggen
-- jeg kom i tvivl om det er nødvendigt at checke if(document.cookie) ?o)
-returnerer den, at browseren understøtter cookies, eller at der er en cookie ?-)
Jeg kunne ikke finde på noget, som ikke var noget i nærheden af en kopi af hvad du skal bruge det på -- du kunne måske hive noget ud af din kode, så vil jeg gerne efterprøve og eftergå !o)
Ja, det burde også virke -- jeg havde lavet en tavetosse -- en af dem, som er svære at se, når man ikke på et kvalificeret grundlag kan dissekere koden ;-(
-- der var to == i en tildeling ;o| -- nu kører den op mod to forskellige divs -- stresstesten kommer du til at stå for ,o)
function updateCookie(id,act){ 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(":"); break; } } var updated = false; for (i=0;newCook.length>i;i++){ if (newCook[i].indexOf(id+"-")==0){ newCook[i] = id+"-"+act; updated = true; break; } } 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(); 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 = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style; if(act==0)styleObj.display = "none"; else styleObj.display = ""; } } } } </SCRIPT>
function updateCookie(id,act){ 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(":"); break; } } var updated = false; for (i=0;newCook.length>i;i++){ if (newCook[i].indexOf(id+"-")==0){ newCook[i] = id+"-"+act; updated = true; break; } } 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(); 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 = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style; if(act==0)styleObj.display = "none"; else styleObj.display = ""; } } } } </SCRIPT> </head>
Der er bare de normale navngivningskonventioner for javascript-variable: A-Z, a-z, 0-9 og _ -- og de må ikke starte med et tal -- ellers er der frit slag ...
Det nærmeste vi kommer problemer med browsere er parallelt til det, som dit oprindelige script har taget højde for ...
Som jeg umiddelbart kan se, er de metoder osv., som bruges gyldige fra NN3 og IE4 -- bortset fra style, som først kan bruges fra NN4, så den burde glide rent ned for 99.998 % af dagens browsere ...
Stress-testen er 77 divs/layers, som du fjerner i forskellige kombinationer, lukker browseren en gang imellem osv.
Det der med at lukke browseren er en nødvendighed, for at vi kan teste, at småkagerne slipper ordentlig fra en tur på disk, for de rammer ikke harddisken før browseren lukkes !O)
Scriptet virker ikke helt efter hensigten, når man putter det på nettet: www.surfersinfo.dk/Cool/cookie_menu.php Jeg ved ikke om det er fordi den konflikter med en anden cookie?
Jeg kan zq ik' følge med -- 1 ud af de sidste 100 gange jeg har bedt om at få vist kilde har jeg fået den vist ... ret håbløst at forfølge fejl på den måde -- hvis jeg forsøger med at downloade siden mangler der jo li'som noget ...
function updateCookie(id,act){ 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(":"); break; } } var updated = false; for (i=0;newCook.length>i;i++){ if (newCook[i].indexOf(id+"-")==0){ newCook[i] = id+"-"+act; updated = true; break; } } 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(); 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 = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style; if(act==0)styleObj.display = "none"; else styleObj.display = ""; } } } } </SCRIPT> </head>
Yes, prøv at udskifte det her -- tror det er pga. cookiernes natur -- det'r zq lige før man skal formattere harddisken for at teste sådan noget ordentligt ,-)
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(); document.cookie = txt; }
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(); 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 = (ns4)? document.layers[id] : (ie4)? document.all[id].style : document.getElementById(id).style; if(act==0)styleObj.display = "none"; else styleObj.display = ""; } } } } </SCRIPT>
Nej, fejlen kom sig af, at cookien ikke indeholdt nogen værdi vi kunne genkende, så den variabel, som vi bruger for at vedligeholde de forskellige tilstande var ikke opstået endnu -- det sørgede jeg så for, at den var ...
-- og jeg kan bekræfte, at den virker -- da jeg sidst var inde på den i nat efterlod jeg alle sammenklappede, hvilket var præcis hvad de blev til nu, bingo !O]
Næh, ikke specielt, men hvis numrene een gang har været med, vil den jo forsøge at finde en div med det id -- og det var det, som gik galt hos mig -- den forsøgte at finde document.all['menu_box_2') og det kunne den selvfølgelig ikke ...
Hvis vi omskriver de meget korte betingelses-statements kan vi også teste for det -- det vil jeg kigge på senere i dag, jeg skal til et møde snart ...
Jeg tror problemet ligger i, at cookiesystemet i /Cool/ skal finde ud af at køre i samhørighed med andre cookieværdier fra /Cool/cookie_menu.php eller som i min kammerats tilfælde: andre cookieværdier fra vores brugersystem ?
Det tog lige lidt længere tid at komme gennem dagen end jeg havde regnet med, men her er den skrevet om, så du kan tillade dig at tilføje og fjerne objekter, som ellers er berørt af cookien:
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(); 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>
Bemærk, at den et-linjes betingelsessætning nu fylder 12 - 13 linjer !-)
I øvrigt burde Mozilla faktisk æde den, for den skulle kende getElementById ...
Orv, det var et godt spm ... men hvis du bruger XP eller 2000 eller har flerbrugermulighed i 9x bliver den jo nødt til at følge styresystemet, og så kan du jo søge på nyeste filer under documents and setting\lademan
meningen er, at den menu som du har lavet skal bruges på hele sitet surfersinfo.dk
jeg kan se, at cookien gemmes under mappen (der nu hedder www.surfersinfo.dk/1/) - kunne den ikke gemmes, så den virker på hele sitet, dvs i roden og de forskellige mapper?
-- måske har det noget med den der path, men løsningen på path er simpel:
I den sidste del af updateCookie:
var exp = new Date(); exp.setYear(exp.getFullYear()+1);//cookien gælder et år var txt = "ShowHide="+newCook.join(":")+"; expires="+exp.toGMTString()+"; path=/"; document.cookie = txt; }
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.