Jeg har desværre ikke helt styr på cookies, så jeg føler ikke jeg kan give dig en vandtæt løsning. Jeg er da enig med dig i at det ville være den bedste løsning.
Jeg lavede på et tidspunkt dette ifm. et andet spørgsmål, men jeg synes det er noget kompliceret og så er jeg ikke sikker på at det fungerer hvis du f.eks. har andre cookies på samme site (det er jo ikke særlig smart). Det er en træstruktur som kan huske hvilke noder der er foldet ud på alle niveauer, men som sagt det er lidt svært at overskue, dels fordi det ikke er smukt sat sammen, dels fordi cookies er lidt besværlige (efter min mening):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<title>Demoside til treekontrol</title>
<script type="text/javascript">
var valueSeparator = ",";
var mNodes = "";
// Cookie funktioner til at gemme informationer om hvilke grene
// i træet der er åbne...
function getCookieValue() {
return document.cookie;
}
function setCookieValue(value) {
mNodes = value;
document.cookie = value;
}
function getCookieString(value) {
var tmpTme = new Date();
var expTme = new Date(tmpTme.getTime() + 300000);
return "tree=" + value + "; expires=" + expTme + ";";
}
function createCookie(aCookies, value) {
setCookieValue(getCookieString(value));
showCookieValues();
return true;
}
function getOpenNodes() {
var cookies = getCookieValue();
var aCookies = cookies.split(";");
for(var i = 0; i < aCookies.length; i++) {
var aParts = aCookies[i].split("=");
if(aParts[0].indexOf("tree") > -1) {
return aParts[1];
}
}
return "";
}
function setOpenNode(id) {
var cookies = getCookieValue();
var aCookies = cookies.split(";");
for(var i = 0; i < aCookies.length; i++) {
var aParts = aCookies[i].split("=");
if(aParts[0].indexOf("tree") > -1) {
var nodes = valueSeparator + aParts[1] + valueSeparator;
if(nodes.indexOf(valueSeparator + id + valueSeparator) == -1) {
// så skal den åbnes, dvs. id'et skal tilføjes cookien...
nodes += id;
setCookieValue(getCookieString(nodes.substr(1)));
showCookieValues();
}
return true;
}
}
createCookie(aCookies, id);
}
function setCloseNode(id) {
var cookies = getCookieValue();
var aCookies = cookies.split(";");
for(var i = 0; i < aCookies.length; i++) {
var aParts = aCookies[i].split("=");
if(aParts[0].indexOf("tree") > -1) {
var aItem = aParts[1].split(valueSeparator);
for(var itmIdx = 0; itmIdx < aItem.length; itmIdx++) {
if(aItem[itmIdx] == id) {
aItem.splice(itmIdx,1);
setCookieValue(getCookieString(aItem.join(valueSeparator)));
showCookieValues();
break;
}
}
return true;
}
}
createCookie(aCookies, id);
}
function showCookieValues() {
document.getElementById("cookieValues").innerHTML = "Open nodes: " + getOpenNodes() + "<br>Cookie: " + getCookieValue();
}
// Funktion til at sætte træet op ved load af dokumentet...
window.onload = function() {
var uls = document.getElementsByTagName("UL");
var openNodes = valueSeparator + getOpenNodes() + valueSeparator;
showCookieValues();
for(var obj in uls) {
if(uls[obj].className) {
var lnks = uls[obj].getElementsByTagName("A");
for(var i = 0; i < lnks.length; i++) {
if(lnks[i].className == "toggle") {
lnks[i].onclick = function() { toggleNode(this); this.blur(); return false; }
if(openNodes.indexOf(valueSeparator + lnks[i].parentNode.id + valueSeparator) > -1) {
lnks[i].childNodes[0].src = "minus.gif";
lnks[i].parentNode.getElementsByTagName("UL")[0].style.display = "block";
}
else {
lnks[i].childNodes[0].src = "plus.gif";
lnks[i].parentNode.getElementsByTagName("UL")[0].style.display = "none";
}
}
}
var imgs = uls[obj].getElementsByTagName("IMG");
for(var i = 0; i < imgs.length; i++) {
if(imgs[i].className == "indicator" && imgs[i].parentNode.tagName != "A") {
imgs[i].src = "leaf.gif";
}
}
}
}
}
function toggleNode(obj) {
var objParent = obj.parentNode;
if(objParent) {
for(var i = 0; i < objParent.childNodes.length; i++) {
var objChild = objParent.childNodes[i];
if(objChild.tagName) {
if(objChild.tagName.toLowerCase() == "ul") {
if(objChild.style.display != "none"){
objChild.style.display = "none";
obj.childNodes[0].src = "plus.gif";
setCloseNode(objParent.id);
}
else {
objChild.style.display = "block";
obj.childNodes[0].src = "minus.gif";
setOpenNode(objParent.id);
}
return true;
}
}
}
}
}
function firstParentTagName(obj, findTagName) {
if(obj) {
if(obj.tagName == findTagName)
return obj;
else
return firstParentTagName(obj.parentNode, findTagName);
}
else
return null;
}
</script>
<style type="text/css">
ul { margin:0 0 0 15px; padding:0; list-style-type:none; }
img.indicator { border:none; width:10px; height:10px; }
</style>
</head>
<body>
<div id="cookieValues"> </div>
<a href="testCookie2.asp">Til server</a><br><br>
<ul class="treemenu">
<li id="m1">
<a href="#" class="toggle"><img class="indicator" src=""></a> <a href="#">Test 1</a>
<ul>
<li id="m1_1"><img class="indicator" src=""> <a href="#">Test 1.1</a></li>
<li id="m1_2"><img class="indicator" src=""> <a href="#">Test 1.2</a></li>
<li id="m1_3"><img class="indicator" src=""> <a href="#">Test 1.3</a></li>
</ul>
</li>
<li id="m2">
<a href="#" class="toggle"><img class="indicator" src=""></a> <a href="#">Test 2</a>
<ul>
<li id="m2_1">
<a href="#" class="toggle"><img class="indicator" src=""></a> <a href="#">Test 2.1</a>
<ul>
<li id="m2_1_1"><img class="indicator" src=""> <a href="#">Test 2.1.1</a></li>
<li id="m2_1_2"><img class="indicator" src=""> <a href="#">Test 2.1.2</a></li>
<li id="m2_1_3"><img class="indicator" src=""> <a href="#">Test 2.1.3</a></li>
</ul>
</li>
<li id="m2_2"><img class="indicator" src=""> <a href="#">Test 2.2</a></li>
<li id="m2_3"><img class="indicator" src=""> <a href="#">Test 2.3</a></li>
</ul>
</li>
</ul>
</body>
</html>