a6e-intruder: dhtml-menue

hallo zusammen,

jetzt bin ich langsam am Verzweifeln. Ich habe vor einiger Zeit mal einen Kurs zum Thema Webdesign gemacht. Davon habe ich noch ein Javascript, das ich verstehe. Damit habe ich ein Menü "kreiert", dass allerdings nicht mehr verschwindet.
Ich habe mehrere Probleme mit der Seite. Ich habe versucht, das mit div's zu layouten, aber der spätere Eigentümer will dass jedes Mal eine freie Seite da ist, wenn man das Menue betätigt, das kann ich machen, allerdings ist das Menue dann nicht ausgeklappt! Seit mehreren Tagen mache ich am Menue rum und an den Seiten und komme nicht so recht weiter.
Wenn mir jemand helfen könnte, wäre das super.

Javascript:
var isNN = false;
var isIE = false;
var isGecko = false;

if (document.layers) {
        isNN = true;
        alert("Sie verwenden einen älteren Webbrowser. Dies kann zu Fehlern in der Darstellung führen. Ab Netscape 6 wird alles korrekt dargestellt!");
}
if (document.getElementById) {
    isGecko = true;
}
if (document.all) {
    isIE = true;
}
function setObj(lay){
 if (isNN == true) {
  theObj = eval ("document."+lay);
 } if (isIE == true){
  theObj = eval ("document.all."+lay+".style");
 } if (isGecko == true){
  theObj = eval ("document.getElementById('"+lay+"').style");
 } return(theObj);
  merker = eval (lay)
   return(merker);
}
function show(lay){
  setObj(lay);
  theObj.visibility="visible";

}
function hide(lay){
   setObj(lay);
   theObj.visibility="hidden";

}

Ich habe das schon mal mit <div class="bla" onmouseout"javascript:hide()">
versucht, leider kann ich im Menue nur auf den ersten Punkt gehen und  dann verschwindet das gleich.

die Seite ist zu sehen auf http://www.masterdigital.de/binninger/blank.html

  1. Hallöchen,

    habe mir Script und Seite mal angesehen :

    1. in Zeile 60 ist ein Tippfehler :
    id=prod, im MouseOver fehlt ein "t" in Javascript; der schiesst

    Jetzt muss ich nochmal nachfragen, ob ich dich richtig verstanden habe. Nach Klick auf Menu soll eine komplett neue HTML-Seite aufgerufen werden, das richtige Menu aber weiterhin aufgeklappt sein ? Oder habe ich Dich falsch verstanden ?!

    Schreib mal kurz

    Gruß
    Stephan

    1. Oder habe ich Dich falsch verstanden ?!
      nein, Du hast das schon richtig verstanden!
      die hintergrundseite soll durch eine freie seite ersetzt werden..

      1. die hintergrundseite soll durch eine freie seite ersetzt werden..

        dann kann das aber nicht funktionieren ... !!

        durch das Nachladen einer neuen Seite vergisst der Browser alle seine Variablen und lädt diese mit Standartwerten neu ein.

        Ich löse so etwas mit 2 Methoden, je nachdem, was gerade passt:

        A. Arbeiten in einem 2-teiligen Frame
        In einem Framefenster 1 oder mehrere versteckte Felder unterbringen;
        beim klicken auf ein Objekt per Javascript in diese(s) Feld(er) einen entsprechenden Wert schreiben; in den 2. Frame nun die neue Seite laden und mit onload den Wert aus den versteckten feldern des 1. Frames auslesen und verarbeiten.
        In diesem wird nämlich nur Frame 2 aktualisiert, Frame 1 behält seine Werte permanent

        B. Arbeiten mit URL-String
        Als Link nicht angeben "http://..../seite.html" sondern ergänzt
        "http://..../seite.html?menunr=1" (bzw 2, 3 usw)

        beim onload und location.search kann man jetzt die Werte hinter dem ?-Zeichen auslesen.
        komplett sähe das so aus

        <script type="text/Javascript">
        var zeigemenu=location.search.split("=")[1]
        // liefert im o.g. Beispiel eine 1
        </script>

        Jetzt kannst du die Variable "zeigemenu" in deinem Script auslesen und das entsprechende Menu direkt öffnen lassen.

        Ich würde es mal mit Variante B versuchen, die sollte eigentlich Erfolg versprechen

        Gruß
        Stephan

  2. Also, dann ergänze ich das Thema hier noch einmal.
    Ich habe mir auf einer anderen Seite angeschaut, wie dieser Mensch das gemacht hat.

    <div id="men1sub" style="position:absolute; left:33px; top:216px; width:140px; z-index:111; visibility: hidden" onMouseOver="MM_showHideLayers('men1sub','','show')" onMouseOut="MM_showHideLayers('men1sub','','hide')">

    war seine lösung.

    ich habe die CSS-Definitionen in eine extra Datei.
    Deshalb schaut das bei mir so aus..
    <div class="leiste" id="leiste" onMouseOut="javascript:hide('leiste')">

    Nur bei mir kann ich nur in das Erste Feld gehen und wenn ich in das 2. gehen will, verschwindet das Menue.

    intruder

    1. Hi,

      <div class="leiste" id="leiste"

      wozu gibst Du eine Klasse und eine gleichlautende ID an?
      Kann es sein, daß Du diese ID gar mehrfach verwendest?

      freundliche Grüße
      Ingo

  3. hi,

    Javascript:

    Zumindest ist der prinzipielle Ansatz deines Scripts richtig. Die Auswahl der Variablennamen ist jedoch inkonsequent:

    if (document.getElementById) {
        isGecko = true;
    }

    Das versteht auch der IE 6, und der ist beileibe kein Gecko  -  und auch andere Browser, wie z.B. Konqueror, kommen damit gut klar. In vieen anderen Scripts hat sich für dieselbe Aufgabe der Variablennamen isDOM durchgesetzt, der trifft es auch besser.

    if (isNN == true) {
      theObj = eval ("document."+lay);

    Warum nimmt du "eval"?

    theObj.visibility="visible";

    Das Anzeigen bzw. Verbergen über "visibility" zu regeln, ist richtig.

    die Seite ist zu sehen auf http://www.masterdigital.de/binninger/blank.html

    Du hattest inzwischen genügend Zeit, um in der Forums-FAQ nachzulesen, wie hier Links gesetzt werden. Du meinst also http://www.masterdigital.de/binninger/blank.html

    Das größere Problem bei deiner Fehlerbeschreibung ist aber, daß du das Macromedia-Script, das für deinen Scriptablauf viel entscheidender ist, hier noch unterschlagen hast. Mit diesen "MM_..."-Scripts gibt es immer wieder Schwierigkeiten  -  in der Regel sind sie in der Form, in der sie von dem benutzten Programm erstellt wurden, gar nicht nötig, und das scheint auch bei dir der Fall zu sein. Dazu kommt, daß du deine EventHandler nicht konsequent formulierst, was zu sehr merkwürdigen Ergebnissen führt: bei manchen Menüpunkten erscheint dein Submenü erst bei Mausklick, bei anderen bei Mausberührung, und manchmal verschwinden sie von selbst, manchmal auch erst wieder, wenn man mit der Maus irgendwo geklickt hat. Das _kann_ (muß aber nicht) damit zusammenhängen, daß du alle drei EventHandler (onmouseover, onmouseout und onclick) in einen link sperrst, die aber auf identische Funktionsteile zugreifen. Solche Notationen wie
      onmouseover="MM_nbGroup('over','img/leiste_r9_c1','img/leiste_r9_c1_f2.gif',
      'img/leiste_r9_c1_f3.gif',1); javascript:hide('mutze'); javascript:hide('schals');
      javascript:hide('fahne')"
    sind darüberhinaus etwas ungeschickt. Das vorangestellte "javascript:" ist schlicht überflüssig, und dreimal dieselbe Funktion, wenn auch mit unterschiedlichen Parametern, aufzurufen, ist jedenfalls eine verbesserungswürdige Konstruktion.
    Du fährst wahrscheinlich wesentlich besser, wenn du deine "hidden" und "visible"-Anweisungen oben im Script nochmals in eine Funktion mit neuem Namen zusammenfaßt, schematisch in ungefähr dieser Form:
      function click(param){
        if (...) hide(...);
        if (...) show(...);
      }
    und dann diese Funktion an einen EventHandler übergibst, beispielsweise in der Form
      onclick="click(param)"
    Die jeweils benötigten Parameter kannst du ja wieder über Variablen festlegen.

    Du solltest also dein Macromedia-Script vollständig streichen und an dessen Stellen den prinzipiell richtigen Ansatz, den du bereits hast, ausbauen. Wenn du allerdings bereits so weit bist:

    Ich habe mir auf einer anderen Seite angeschaut, wie dieser Mensch das gemacht hat.

    sollte es dir nicht allzu schwer fallen, das, was bei dir von einer funktionierenden Lösung abweicht, zu korrigieren. Ob du deine "Layer" über "class" oder "id" ansprichst, ist letzten Endes egal (ich würde allerdings "id" bevorzugen).

    Im übrigen gibt es zum Themenkomplex "zeigen und verbergen von DIVs" mehrere aussagekräftige Threads im Forums-Archiv.

    Grüße aus Berlin

    Christoph S.

  4. Hallo,

    jetzt bin ich langsam am Verzweifeln. Ich habe vor einiger Zeit mal

    was habe ich dir gesagt? Nun sind einige aufgewacht. ;-)

    Mit freundlichen Grüßen

    André