richard: hilfe! liegts am rückgabewert?

Hallo Forumler!

ich ärgere mich jetzt schon stunden mit diesem problem herum und komme auf keinen grünen zweig.

kurz gesagt handelt es sich um ein menü, unter dessen menüpunke sich div-layer mit dem submenü ein und ausblenden.

von der struktur her siehts so aus:

<script language="JavaScript" type="text/JavaScript">
function getLayerRef(id){
//ermittelt die 'browserübergreifende' referenz des gesuchten Layers.
}
function setLayerDisp(id, anzeige){
//setzt .visibility und .display des entsprechenden Layers
}
function hideAll(){
//versteckt alle Layer/Submenüs
//(verwendet setLayerDisp() )
}
</script>

im body steht:

<a href="subseite.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>
<div id="Layer1" style="position:relative; z-index:1; visibility: hidden; display:none;">...</div>

soweit so gut. funktioniert auch. allerdings soll einiges mehr auf diesen klick passieren weshalb ich alle funktionsaufrufe nicht in den eventhandler stecken möchte sondern in eine eigene funktion namens
subMenue('choice'){
hideAll();
setLayerDisp(choice,true);
}
die ich dann mit onClick="subMenu('Layer1');" aufrufen kann.

und genau dann funktioniert überhaubt nichts mehr. egal, was ich versuche.
ich bin noch ziemlich unerfahren mit javascript aber es bringt mich jedesmal zur verzweiflung.

hier mein code im genauen:

/* ebenen referenzieren //IE4+, NC4+, Moz u. Deriv., Op5.2+ */
function getLayerRef ( id, document) {
  if (!document) document = window.document;
  if (document.layers) { for (var l = 0; l < document.layers.length; l++) { if (document.layers[l].id == id) return document.layers[l]; }
          for (var l = 0; l < document.layers.length; l++) { var result = getLayerRef(id, document.layers[l].document); if (result) return result; }
  return null; }
  else if (document.all) { return document.all[id]; }
  else if (document.getElementById) { return document.getElementById(id); }
}

function hideAll(){
setLayerDisp('Layer1', false);
setLayerDisp('Layer2', false);
setLayerDisp('Layer3', false);
}

function setLayerDisp(option, action){
objLayer = getLayerRef(option);
if(document.layers){
  objLayer.visibility = (action == true) ? 'show' : 'hide';
  objLayer.display = (action == true) ? 'block' : 'none';
} else {
  objLayer.style.visibility = (action == true) ? 'visible' : 'hidden';
  objLayer.style.display = (action == true) ? 'block' : 'none';
   }
}

bin für jeden verbesserungsvorschlag dankbar
danke im voraus,

richard

  1. eines hab ich noch vergessen, wenn ich diese sammelfunktion subMenue() reinschreibe, bekomme ich eine fehlermeldung die angeblich von der datei kommt die im mainFrame angezeigt wird (zeile1, zeichen1). und in dieser steht nicht eine einzige zeile javascript-code
    ??:(

    richard

  2. hallo Richard,

    kurz gesagt handelt es sich um ein menü, unter dessen menüpunke sich div-layer mit dem submenü ein und ausblenden.

    Kurz gesagt handelt es sich um unvollständige Angaben. Deine Javascript-Sachen mögen zwar funktionieren, aber sie sollen irgendwelche "Layer" bewegen, und die sind einfach nicht vorhanden. Du mußt also einfach deine benötigten Layer (positioniert mit CSS) in deinen HTML-Code schreiben. Was du machen möchtest, ist eine geradezu "klassische" Mischung aus Javascript und CSS.

    Grüße aus Berlin

    Christoph S.

    1. hallo christoph,

      Kurz gesagt handelt es sich um unvollständige Angaben. Deine Javascript-Sachen mögen zwar funktionieren, aber sie sollen irgendwelche "Layer" bewegen, und die sind einfach nicht vorhanden. Du mußt also einfach deine benötigten Layer (positioniert mit CSS) in deinen HTML-Code schreiben. Was du machen möchtest, ist eine geradezu "klassische" Mischung aus Javascript und CSS.

      haha...
      link#2 und#3 sehen genauso aus wie #1. das posting wäre nicht notwendig gewesen.

      aber gerne hier _nochmal_ was im body steht:

      im body steht:

      <a href="subseite.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>
      <div id="Layer1" style="position:relative; z-index:1; visibility: hidden; display:none;">submenue</div>

      <a href="subseite2.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>
      <div id="Layer2" style="position:relative; z-index:2; visibility: hidden; display:none;">submenue</div>

      <a href="subseite3.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>
      <div id="Layer3" style="position:relative; z-index:3; visibility: hidden; display:none;">submenue</div>

      positionierung ist egal.
      ich weiß, dass diese lösung klassisch ist aber ich finde nichts in selfhtml, das mir weiterhilft und über google hab ich vieles gefunden, ausprobiert, ohne erfolg.

      lg
      richard

      1. hallo Richard,

        link#2 und#3 sehen genauso aus wie #1. das posting wäre nicht notwendig gewesen.

        Welches posting?

        <a href="subseite.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>

        So weit lesen konnte ich auch. Aber was soll das "target" bewirken? Doch wahrscheinlich, daß in einem _anderen_ Frame etwas passiert. Und stehen in der Seite, die du _dort_ öffnest, auch deine Layer drin, und werden sie von deiner Javascript-Konstruktion überhaupt irgendwie angesprochen?

        positionierung ist egal.

        In diesem Fall nicht. Insbesonder würde ich "position:absolute" nehmen  - da deine Layer ja nicht immer sichtbar sein müssen, sondern nur bei bestimmten Anlässen. Außerdem sollten si eine bestimmte Größe haben, mozilla zeigt "leere" DIV#S nicht unbedingt an.

        ich weiß, dass diese lösung klassisch ist aber ich finde nichts in selfhtml, das mir weiterhilft und über google hab ich vieles gefunden, ausprobiert, ohne erfolg.

        Grüße aus Berlin

        Christoph S.

        1. ach christoph
          danke für dein posting.

          <a href="subseite.htm" target="mainFrame" onClick="hideAll();setLayerDisp('Layer1', true);return false;">erstes submenü öffnen</a>
          So weit lesen konnte ich auch. Aber was soll das "target" bewirken? Doch wahrscheinlich, daß in einem _anderen_ Frame etwas passiert.

          naja, ich dachte das wäre offensichtlich. natürlich gibt es ein frameset. wofür würde ich sonst ein target angeben? und dass das Frame "mainFrame" heißt ist zusammen mit dem "Menü" doch ein deutlicher hinweis auf die klassische Menü-/MainFrame-Struktur, oder?
          egal.

          Und stehen in der Seite, die du _dort_ öffnest, auch deine Layer drin, und werden sie von deiner Javascript-Konstruktion überhaupt irgendwie angesprochen?

          nein, in dieser darstellung ist davon keine rede. deswegen hab ich ja auch nichts davon geschrieben. ist ja niemand hellseher hier. im weiteren verlauf wird es zwar dazu kommen, aber bevor ich die funktionen selbst im eigenen frame nicht zum laufen bringe interessiert mich das zweite frame überhaupt nicht.

          positionierung ist egal.
          In diesem Fall nicht. Insbesonder würde ich "position:absolute" nehmen  - da deine Layer ja nicht immer sichtbar sein müssen, sondern nur bei bestimmten Anlässen.

          doch, auch in diesem Fall. ich habe bewusst nicht position:absolute genommen, damit die weiteren und vorhergehenden menüpunkten nachrücken bzw aufschließen können.

          Außerdem sollten si eine bestimmte Größe haben, mozilla zeigt "leere" DIV#S nicht unbedingt an.

          ist ok, danke aber warum so viel text über diese div's?!

          mein problem ist wirklich nur das javascript. das ist weder ausgefallen, noch sonstwie was besonderes. ich kenne mich zwar mit html, php und css recht gut aus, aber js ist für mich noch absolut undurchsehbar. gerade was die fehlermeldungen betrifft und solche dinge wie ein von zeit zu zeit notwendiges 'return false;' im eventhandler.

          hauptsächlich geht es darum dass folgendes geht:
          (sehr reduziert)
          <a onClick="erste_funktion();zweite_funktion();">
          <script>
          function erste_funktion(){}
          function zweite_funktion(){}
          </script>

          aber das nicht funktioniert:
          <a onClick="sammelfunktion();">
          <script>
          function erste_funktion(){}
          function zweite_funktion(){}
          function sammelfunktion(){
            erste_funktion();
            zweite_funktion();
          }
          </script>

          oder ist das zu kurzsichtig von mir betrachtet?

          lg richard

          1. hallo richard,

            Aber was soll das "target" bewirken? Doch wahrscheinlich, daß in einem _anderen_ Frame etwas passiert.
            naja, ich dachte das wäre offensichtlich.

            Ja, das war es. Daher habe ich auch geschrieben, daß deine "Layer" schlichtweg nicht vorhanden sind  -  ich hätte allerdings dazusetzen müssen, daß sie _in der aufgerufenen Seite_ nicht vorhanden sind.

            Und stehen in der Seite, die du _dort_ öffnest, auch deine Layer drin, und werden sie von deiner Javascript-Konstruktion überhaupt irgendwie angesprochen?
            nein, in dieser darstellung ist davon keine rede.

            Dann hast du ein Problem ;-)

            Es ist nicht ganz einfach, in einem Frameset Javascript-Code, der in _einem_ Frame notiert ist, im _anderen_ Frame ausführen zu lassen. Ganz unmöglich ist es nicht, alle Seiten, die in das Frameset geladen werden können, auf dieselben Javascript-Funktionen zugreifen zu lassen, aber dazu muß man die Gesamtkonstruktion ändern und den ganzen Javascript-Krimskrams entweder ins Frameset selbst hineinschreiben oder  -  was ich hier _dringend_ empfehlen würde  -  in eine *.js-Datei auszulagern und dann in die einzelnen zu ladenen Seiten per <link> wieder einzubinden. Es gibt natürlich noch die Möglichkeit, mit "top.framename.location.href" und etwas Parameter-Salat das doch in den Griff zu bekommen, aber meines Erachtens lohnen sich solche Verrenkungen nicht. Und ich kann auch noch nicht genau sehen, _warum_ du die ganze Übung unternimmst.

            Ein Beispiel, wie es auf _einer_ Seite mit dem ein- und ausblenden funktionieren kann, findest du unter http://www.christoph-schnauss.de/prog/jscript/jscript05.htm  -  wenn das in jeder Seite deines Framesets funktionieren soll, muß es auch in jeder Seite eingebunden werden.

            Was nicht funktionieren kann: wenn du links dein Navigationsframe hast und dort veranlassen möchtest, daß rechts bestimmte Layer sichtbar/unsichtbar gemacht werden, ist das mit einer solchen Gesamtkonstruktion nahezu unmöglich. Mit einer serverseitigen Technologie (Perl, PHP ...) ist das etwas einfacher.

            Grüße aus Berlin

            Christoph S.