Drop Down Menue - Frage

Aquafresh

Registered User
Hallo,

ich arbeite derzeit mit meinen Freunden & Kollegen an der neuen Webseite (Update). Da werden wir nun ein Drop Down Menue benutzen, ich hoffe ihr wisst welches ich meine;P Das ist dieses Menue wo man auf eine Katigorie klickt, und dieses fährt dann alle Panels/Links herunter, wobei ich dazu vielleicht eine Frage hätte:P

Das ganze läuft ja über js, wenn man im Menue ein neuen Link anklickt, sind alle Menues wieder zu, weiß vielleicht jemand wie ich das hinrkriege, dass das Menue trotzdem aufbleibt? Sorry, "js" ist nicht so mein Ding, wenn mir einer helfen könnte, würde ich natürlich die Daten zum Script bzw. den Ordner mal dabei tun.

Würde auch einen Teamspeak-Server sponsorn:)

Ich würde mich tierisch freuen, wenn mir da vielleicht einer unter die Armen greifen könnte :P
 
Moin!

Sorry, dass ich erst so spät antworte, aber ich hab das gleiche Problem auf meiner Page heute noch lösen müssen und das war eher geringer Priorität. Genug Geschwafel, auf zur (vllt. etwas umständlichen, aber funktionierenden) Lösung:

Fangen wir mit der Funktion an, die für das Ein- und Ausblenden der DIVs verantwortlich ist. Ich habe leider den Urheber nicht mehr in meiner Linksammlung. Ergo, dies ist nicht auf meinem Mist gewachsen, aber ich finde sehr brauchbar:
HTML:
function toggleLayer( whichLayer )
{
  var elem, vis;
  if( document.getElementById ) // this is the way the standards work
    elem = document.getElementById( whichLayer );
  else if( document.all ) // this is the way old msie versions work
      elem = document.all[whichLayer];
  else if( document.layers ) // this is the way nn4 works
    elem = document.layers[whichLayer];
  vis = elem.style;
  // if the style.display value is blank we try to figure it out here
  if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
    vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
  vis.display = (vis.display==''||vis.display=='block')?'none':'block';
}
Ich hoffe, dies bedarf keiner weiteren Erläuterung, ansonsten einfach fragen.

Die jeweilige Linkgruppe schlummert in einem DIV (in diesem Fall mit der ID "links_news") welches über die JS-Funktion toggleLayer(ID) ein- und ausgeblendet wird und jeweils mit einer Überschrift (<p>-Tag) versehen. Beim Klick auf die Überschrift wird das dadrunter liegende DIV geöffnet. Standardmäßig sind alle DIVs mit dem Style display:none; versehen.
Der HTML-Quellcode für eine Linksektion sieht folgendermaßen aus.
HTML:
<p class="menutitle" onclick="toggleLayer('links_news');">News</p>
<div id="links_news" class="menubody">
  <a class="menu" href="index.php?p=news">&raquo; &Uuml;bersicht</a><br />
  <a class="menu" href="index.php?p=form_news">&raquo; Schreiben</a><br />
</div>

Die clientseitige Vorbereitung (HTML/JS) ist nun abgeschlossen. Das Problem ist nun, dass JavaScript ja gar nicht weiß, in welcher Linksection sich der User gerade befindet. Es findet nämlich keine Zuordnung zwischen Seite (Bsp. news.php) und der Linksection (hier dann: "links_news") statt.

Um dieses Problem zu beheben, habe ich die gesamten Seiten der Präsenz in einem PHP-Array namens $sitemap abgebildet. Dies sieht dann folgendermaßen aus:
PHP:
$sitemap = array("links_news" => array("news","form_news"),
                       "links_spielplan" => array("spielplan","form_spielplan"),
                       "links_gegner" => array("gegner","form_gegner"),
                       "links_forum" => array(),
                       "links_links" => array(),
                       "links_statistiken" => array(),
                       "links_einstellungen" => array("form_saison"));
Hier werden auf einfache Art und Weise die ganzen Seiten den jeweiligen Linksections zugeordnet. Die leeren Arrays bedeuten einfach, dass ich die Seiten noch nicht ausprogrammiert habe.

So... die Vorarbeit ist nun fertig. Sowohl das Auf- und Zuklappen der Layer funktioniert als auch eine Zuordnung der einzelnen Seiten zu den Linksections wurde vorgenommen.

An beliebiger Stelle (aber nachdem alle Link-DIVs erzeugt wurden) muss nun der folgende PHP-Snippet eingefügt werden:
PHP:
<?php
  foreach ($sitemap as $linksection => $links) {
    if (preg_match("/\d+/",array_search($_GET['p'], $links))) {
      echo '<script language="javascript">';
      echo 'if (document.getElementById(\''.$linksection.'\').style != \'block\')   {';
      echo '  toggleLayer(\''.$linksection.'\');';
      echo '}';
      echo '</script>';
    }
  }
?>
Selbiger durchläuft das Array $sitemap und sucht nach der gerade aufgerufenen Seite ("gespeichert" in _$GET['p']). Findet array_search() das Element wird die Funktion toggleLayer() aufgerufen, sofern das DIV noch nicht sichtbar ist, um es einzublenden.
Ich musste preg_match() nutzen, weil die Rückgabe von array_search() sonst zuviel Probleme gemacht hat (s. auch PHP Doku).

Bei Fragen, fragen!

HTH!
 
Last edited by a moderator:
hm, bei dir ist das natürlich alles selber gemacht, ich glaube, solch eine js Navigation, zieht doch auch viel Ladezeit, oder? Gibt es sowas nicht als CSS, wobei da die Browser wieder Probleme haben werden. :D

PS: Benutze das Script -> script.aculo.us - web 2.0 javascript
 
Last edited by a moderator:
LoL... Du erzählst mir was von Ladezeit und kommst dann mit einer ganzen JS-Scriptbibliothek á la scriptaculous. Ich würde sagen meine paar Byte an Code sind da dann doch deutlich performanter.

Wenn man allerdings auf die ganzen Slideeffekte etc. zurückgreifen möchte, dann ist scriptaculous natürlich eine gute Wahl.
 
Kleiner Tipp am Rande (weil ich es im JS-Script gesehen hatte):
Das Gegenteil von style.display='none' ist style.display=null.
Im Script wird display auf 'block' gesetzt, was aber bedeutet, dass man ein Verhalten vorgibt.
Der Default ist aber, dass sich das Element neutral verhält - also null (keine Angabe).

Edit: Mit neutral verhalten meine ich den Default des jew. Elements - weil irgendwie verhält es sich ja immer inline oder block. Aber eben nicht per CSS enforced.
 
Last edited by a moderator:
Back
Top