Klapp-Menü soll bei ReLoad aufgeklappt bleiben

gocyla

Grünschnabel
Hi Leute,
ich weiß, dass dieses Problem schon öfters in diesem Forum behandelt wurde, allerdings habe ich bisher keine genügsame Lösung für mein Problem gefunden. :(

Ich habe den folgenden Code in meiner Seite:
PHP:
function switchlayer(Layer_Name) //Öffnet+schließt die Unterbereiche
{
	 var GECKO = document.getElementById? 1:0 ;
	 var NS = document.layers? 1:0 ;
	 var IE = document.all? 1:0 ;
	 if (GECKO)
	 {
		document.getElementById(Layer_Name).style.display=(document.getElementById(Layer_Name).style.display=='block') ? 'none' : 'block';
	 }
	 else if (NS)
	 {
		document.layers[Layer_Name].display=(document.layers[Layer_Name].display=='block') ? 'none' : 'block';
	 }
	 else if (IE)
	 {
		document.all[Layer_Name].style.display=(document.all[Layer_Name].style.display=='block') ? 'none' : 'block';
	 } 
}
Diese Funktion wird auf einer PHP-Seite durch anklicken bestimmter Links aufgerufen.
HTML:
<a class='navactive' onclick='javascript:switchlayer("bereich54"); return false;'>blabla</a>
Dadurch wird eine bestimmte Tabelle mit Unterbereichen sichtbar bzw. unsichtbar. Die gesamte Seite wird per PHP erzeugt und die Bereiche aus einer Datenbank ausgelesen. Damit kann die Anzahl der Bereiche, die aufgeklappt werden können, von mal zu mal variieren.

Sobald eine Aktion durchgeführt wird, die ein reload der Seite verursacht, wird die Struktur neu geladen und das Menü ist natürlich zugeklappt. :p

Durch meine Sprachdefizite in JavaScript und PHP war es mir soweit nicht möglich das Problem selbst zu lösen. Ich habe jedoch 2 Vorschläge, die vielleicht jemand von euch umsetzen kann:

1. Man könnte vor dem Senden der Seite ein JavaScript aufrufen, das alle aufgeklappten Bereiche durchzählt, zwischenspeichert mit Trennzeichen und mitsendet. Anschließend könnte ein PHP-Script den String auftrennen und auswerten, welche Bereiche aufgeklappt sein sollen.

2. Bei jedem Klick wird in einem Cookie (per JavaScript) mitgespeichert, welcher Bereich angeklickt wurde. Sobald die Seite gesendet und neu geladen wird, kann...
a) ...ein weiteres JavaScript den Cookie auswerten und die Bereiche aufklappen
b) ...das PHP-Script die aus dem Cookie mitgesendeten Daten auswerten und ein aufgeklapptes Menü verschicken

Ich hoffe die Vorschläge sind eindeutig erklärt, ansonsten könnt ihr mich gerne Fragen. Bitte schreibt mir nicht, ich soll kein JavaScript benutzen oder auf eine andere Weise ausweichen.

Vielen Dank und nette Grüße
gocyla
 
Hi Sven,
danke für die Antwort. Es geht eindeutig in die Richtung. Die Infos sind mir jedoch schon zum Teil bekannt.
Ich suche nach einer eleganten Möglichkeit die einzelnen Werte zwischenzuspeichern: Am besten in einem Cookie alle Werte in einem Array (geht das?).
Oder die Werte nacheinander dem vorhandenen Cookie anhängen (als String).
Anschließend könnte ich es mit der Methode 2. a) oder b) lösen.
 
Wozu willst du viele Werte speichern, es reicht doch einer, nämlich der Parameter, mit dem die Funktion switchlayer() zuletzt aufgerufen wurde.

Nachdem die nächste Seite geladen wurde, rufst du die Funktion mit dem selben Parameter wieder auf... fertig:)
 
Es geht aber darum, dass es mehrere Bereiche gibt, die aufgeklappt werden können. Diese können auch Unterbereiche beinhalten, die wiederum aufgeklappt werden können.
D.h. jeder aufgeklappte Bereich soll bei einem Neuladen der Seite weiterhin aufgeklappt bleiben.

Bedeutet also -> Jeder Parameter, der an die Funktion "switchlayer" weitergegeben wird, muss auch zwischengespeichert und ausgewertet werden. Da dies sehr viele sein können, würde ich lieber nur einen Cookie verwenden.
 
Ahso... na dann eben so, wie du vorgeschlagen hast, alle Parameter im Cookie speichern(4kb werden schon ausreichen:-))

Ich nehme mal an, du willst, sofern ein Layer wieder ausgeblendet wird, diesen Parameter nicht im Cookie haben.

Du könntest bspw. einen assoziativen Array verwenden, dessen Elemente haben als Schlüssel jeweils die ID, die der Funktion übergeben werden.

Als Wert bekommen die Elemente jeweils etwas, woran man den Zustand erkennt (block/none) ... am Einfachsten 1/0.

Diesen Array füllst du nun in der Funktion mit den Werten.
Beim onunload der Seite durchläufst du diesen "Array"(welcher ansich garkein echter ist.... aber das sei nur der Vollständigkeit halber erwähnt)
....und erstellst daraus einen String, in dem du die Arrayschlüssel der Elemente speicherst, die den Zustand 'block' haben.... das ganze jeweils getrennt durch irgendein Zeichen(was in den ID's nicht vorkommt).
Diese Zeichenkette speicherst du dann im Cookie.... auf der nächsten Seite kannst du den Cookie dann anhand des Trennzeichens splitten, und hast die ID's der einzelnen Elemente.
 
Danke für die Ansätze Sven!
Hab es geschafft das Problem endlich zu lösen.
Hier mein Quelltext (alles in JavaScript):

PHP:
<SCRIPT LANGUAGE="JavaScript">
var openBereich = new Array(); //Array zum Speichern der geöffneten Bereiche
 
function switchlayer(Layer_Name) //Öffnet+schließt die Unterbereiche
{
	 var GECKO = document.getElementById? 1:0 ;
	 var NS = document.layers? 1:0 ;
	 var IE = document.all? 1:0 ;
	 var i = -1;
	 if (GECKO)
	 {
		document.getElementById(Layer_Name).style.display=(document.getElementById(Layer_Name).style.display=='block') ? 'none' : 'block';
	 }
	 else if (NS)
	 {
		document.layers[Layer_Name].display=(document.layers[Layer_Name].display=='block') ? 'none' : 'block';
	 }
	 else if (IE)
	 {
		document.all[Layer_Name].style.display=(document.all[Layer_Name].style.display=='block') ? 'none' : 'block';
	 }
	 for (j=0;j<openBereich.length;j++)
	 {
		if (Layer_Name==openBereich[j]) //Prüfung, ob Element bereits im Array vorhanden
		{
		 i=j;
		}
	 }
	 if (i>-1)
		openBereich.splice(i,1); //Wenn vorhanden, wird das Element gelöscht
	 else
		openBereich.push(Layer_Name); //Sonst wird es an das Ende angehängt
} //--> Ende Funktion "switchlayer"
 
function getcookie(cookieName)
{
	strValue = false;
	if( strCookie = document.cookie )
	 {
		if( arrCookie = strCookie.match( new RegExp( cookieName + '=([^;]*)', 'g')))
		{
		 strValue = RegExp.$1.split(",");
		 for (i=0;i<strValue.length;i++)
			switchlayer(strValue[i]); //Bereiche aus Cookie werden geöffnet
		}
	 }
} //--> Ende Funktion "getcookie"
 
function setcookie(bereiche)
{
	document.cookie = "offen="+bereiche; 
} //--> Ende Funktion "setcookie"
</SCRIPT>

Vor dem Absenden der Seite wird eine Funktion aufgerufen, die die Funktion setcookie aufruft.
Beim Laden der Seite wird im Body onLoad die Funktion getcookie aufgerufen.
 
hallo Leute,
ich habe die javascript-funktionen benutzt, aber ich weiß nicht was es mir noch fehlt. mein html-code:
HTML:
<body onLoad="getcookie()">
      
       <h1 onclick="javascript:setcookie();">
	   <a href="#" onclick="javascript:switchlayer('openBereich[0]'); document.getElementById('community').style.display='none'; return false;"> Menu1</a></h1>
      
       <ul id="openBereich[0]" class="menu" type="circle" style="display:none;">      
         <li><a href="index.php?ac=neu">untermenu1.1</a></li>
         <li><a href="index.php?ac=del">untermenu1.2</a></li>
       </ul>
       
       <h1 onclick="javascript:setcookie();">
	   <a href="#" onclick="javascript:switchlayer('openBereich[1]'); document.getElementById('community').style.display='none'; return false;"> Menu2</a></h1>
      
       <ul id="openBereich[1]" class="menu" type="circle" style="display:none;">      
         <li><a href="index.php?ac=..">untermenu2.1</a></li>
         <li><a href="index.php?ac=..">untermenu2.2</a></li>
       </ul>
       

	</body>
vielen Dank
 
Hi.

Vielleicht das dazugehörige Javascript, in dem die einzelnen JS-Funktionen definiert sind? Oder was funktioniert nicht wie gewünscht?

Hallo, vielen Dank für die Antwort.
das Auf- und Zu-klappen funktionniert ganz normal.
Das Problem ist: bei reload der Seite klappen die Menüs wieder zu. ich will aber das während der Navigation die schon aufgemachten Menüs aufgeklappt bleiben.
 

Neue Beiträge

Zurück