FAQ zum Baumstruktur-Menü
(häufig gestellte Fragen - und die Antworten dazu)

Hot-Tipps:

Alle Versionen:

Version 1.41 (auf www.js-menue.de):

Version 1.41 als auch 15beta3/4 (auf Anfrage bei Ansgar Federhen)

Version von Frank Bergermann



Alle Versionen:


nojsmenu.htm erstellen

Die Datei nojsmenu.htm enthält das vollständig geöffnete Menü für Browser mit abgeschaltetem JavaScript (ggf. auch für Opera, wo das Menü nicht funktioniert, siehe Script unter Opera zum Laufen bringen).

Gemäß Dokumentation zur Version 1.41 (erweitert um javascript:-Hinweis, "none" gelöscht):

Tipps:


2 Frames gleichzeitig wechseln:

Bisher ungetestet:

function changeFrames(url,frame,url2){ // Ändert url und url eines 2. Frames gleichzeitig.
  // Bisher noch nicht getestet.
  // Beispiel-Aufruf in URL: "javascript:parent.changeFrames('doku/doku.htm#top','meinFrame','xyz.htm')"
  frames[ZielFrame].location.href=url;
  frames[frame].location.href=url2;
}

Ansprechen mit <URL>= "javascript:parent.changeFrames('seite1.htm','meinFrame2','seite2.htm')" und <ZIEL>=""


JavaScripts einbinden

Beispiele für eingebundene JavaScripts


JS-Menü als *.js-File (nur für neuere Browser geeignet, alte Browser kennen das nicht, dort bleibt die Seite leer)

Man kann das Menü-Script auch in eine externe *.js-Datei auslagern.

Hinweis:
Diese Methode wurde bewußt nicht als Standard gewählt, da sie erst ab NN3/IE4 unterstützt wird (laut SelfHTML > JavaScript > JavaScript in HTML > JavaScripts in separaten Dateien).

Wer es dennoch möchte, hier eine Anleitung:


Menüeintrag "Seite in neues Fenster"

Wenn man einen Link haben möchte, mit dem man das Dokument im rechten Fentster in ein neues, leeres Fenster lädt, so kann man folgenden Menüeintrag benutzen (möglichst als letzten einfügen):

mD.neu(new LE("root","Seite in neues Fenster","javascript:var rechts = unescape(parent.frames[parent.ZielFrame].window.location.href);var popUp = window.open(rechts, 'new', 'toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=720,height=550,left=22,top=22');popUp.window.focus();// Dank an http://www.free-solutions.de","","fenster.gif","Öffnet das Dokument im rechten Frame in einem neuen Fenster. Funktioniert allerdings nicht bei allen Seiten mit JavaScript."))

Hier wurde die kompette Funktion in den Link gepackt. Außerdem wurde nicht nur der frame-Aufruf mit parent. ergänzt, sondern ebenso der Zugriff auf die Menü-Variable ZielFrame.

In der Version von Frank Bergermann ist dafür bereits eine spezielle Funktion eingeführt, der Menüeintrag lautet dann nur noch:

mD.neu(new LE("root","Seite in neues Fenster","javascript:parent.neuesfenster()","","fenster.gif","Öffnet das Dokument im rechten Frame in einem neuen Fenster. Funktioniert allerdings nicht bei allen Seiten mit JavaScript."))


Menüeintrag "Quelltext rechte Seite"

Läuft unter MSIE und NS4, nicht NS6.01.

Für Version 1.41 und 15beta3/4:

Für Version von Frank Bergermann:


Menüeintrag "Rechte Seite zu Favoriten"

Für Version 1.41 und 15beta3/4:

Für Version von Frank Bergermann:


Auf JavaScript-Funktionen des Menüs zugreifen

Beste Lösung:
<a href="javascript:parent.funtkionsname()" target="menuFrame">Linktext</a>.
Wichtig ist dabei die Angabe target="menuFrame".
Beispiele: Alle Ordner zuklappen Alle Ordner aufklappen

Das gleiche bei Buttons geht nicht, dort kann man kein Target angeben. Aber der Timer des übergeordneten Fensters hilft aus:
onclick="var f='Funktion()';parent==self?opener.parent.setTimeout(f,1):parent.setTimeout(f,1)"

Theorien diverser Möglichkeiten:

Achtung: 1. und 2. setzten Ausgangspfad des Menüs auf den Ordner der Datei mit der Funktionsaufruf, sollte daher im gleichen Ordner wie das Menü stehen, sonst funktioniert das Menü nicht mehr!
Klicken Sie bitte sooft auf ZURÜCK, bis die Bilder wieder angezeigt werden.
Abhilfe:
- Datei ins gleiche Verzeichnis setzen wie index.htm, dann ändert sich der Ausgangspfad des Menüs nicht.
- Oder: 4. verwenden.

(Gewünscht von zatrix aus dem JS-Menü-Forum, aber höchst wahrscheinlich auch schon von vielen Forum-Teilnehmern vorher.)


Menü nachladen, wenn eine Seite nicht durch das Menü aufgerufen wurde

Dazu muß man in jede Seite ein kleines Script einbauen, innerhalb <head>...</head>.

Zu empfehlen sind Version mit Link und Version mit externem Skript. Letztere läßt sich jederzeit anpassen, läuft aber nicht offline.

Beispiele:


Menüteile nachladen

Möglichkeit A: Umschalten auf eine andere Menüdatei.

Man erstellt einen Link auf eine 2. Menüdatei mit Ziel="_top". Bei einem Klick auf diesen Link wird diese dann in den obersten Frame geladen.

In der 2. Menüdatei sollte man als erstes direkt nach der Wurzel einen Link auf die Hauptmenüdatei (meist index.htm) setzen, wieder mit Ziel="_top". Textvorschlag: "Zurück zum Hauptmenü". (Die Wurzel schafft diese Funktionalität nicht, sie lädt nämlich nur die rechte Seite neu, mit der in der Variablen Startseite angegebenen Seite und dem in der Variablen ZielFrame angegebenen Frame als Ziel.)

//Eintrag für das normale Menü (index.htm):
mD.neu(new LE("root","Menü 2 nachladen","menu2.htm","_top","",""))

//Beispiel-Eintrag für das Menü 2 (menu2.htm):
mD.neu(new HVE("root","<img src=\"bilder/jsmlogo.gif\" border=0 width=\"125\" height=\"16\" align=\"absmiddle\">","","Homepage von JS-Men&uuml;"))
	// "index.htm" ggf. an eigene Startdatei anpassen:
	mD.neu(new LE("root","Zurück zum Hauptmenü","index.htm","_top","",""))
	mD.neu(new VE("menu2","root","Menü 2","","","",""))
		mD.neu(new LE("menu2","Dummy","javascript:;","","","Damit Ordner nicht leer ist"))
//oder (noch nicht getestet):
mD.neu(new HVE("root","Untermenü 2","",""))
	// "index.htm" ggf. an eigene Startdatei anpassen:
	mD.neu(new LE("root","ZURÜCK zum Hauptmenü","index.htm","_top","",""))
	mD.neu(new VE("sub1","root","Unterordner","","","",""))
		mD.neu(new LE("menu2","Dummy","javascript:;","","","Damit Ordner nicht leer ist"))

Möglichkeit B: Menüeinträge live nachladen und erweitern.

Dazu kann von mir ein kostenpflichtiges Script angefordert werden. Privatsites 5 Euro, Firmensites 50 Euro.

Bei Klick auf "Alle Ordner auf" werden diese Ordner aber bisher nicht mit geöffnet. Wird später überarbeitet werden.


Menü passend zum Link öffnen (wenn z. B. auf der rechten Seite ein Link angeklickt wird, der ebenso im Menü vorhanden ist):

WARNUNG: Dieser Abschnitt ist total unausgereift und muß noch überarbeitet werden.

Beispiele, um im rechten Frame einen Link zu öffnen, und dabei gleichzeitig das Menü an der passenden Stelle zu öffnen:
a) in dieses Menü: HTML JavaScript Effekte Erdbeben
b) in das Standard-JS-Menü (funktioniert in diesem Menü nicht): Abschnitt: Wie funktioniert es? Abschnitt: Download
(funktioniert nur, wenn diese Seite im rechten Frame steht, und eine Version mit AutoSync verwendet wird)
(Die darin aufgerufene Funktion egalisiert Groß-/Kleinschreibung)
Ist aber überflüssig in Versionen mit (eingeschaltetem) AutoSync
Das gleiche für die Version 1.4.1:
a) in dieses Menü: HTML JavaScript Effekte Erdbeben
b) in das Standard-JS-Menü (funktioniert in diesem Menü nicht): Abschnitt: Wie funktioniert es? Abschnitt: Download
(Groß-/Kleinschreibung genauestens beachten. URL aus dem Menü empfohlen, Menüeintrag geht aber auch, aber Gefahr der Umbenennung)


Ordner geöffnet/geschlossen starten

Für das folgende gilt generell:

Version 1.41:

Version 15beta3/4:

Version von Frank Bergermann:

Die folgenden Variablen benutzen. Mehrere Einträge in 1 Variable durch Komma trennen, alle Einträge in insgesamt 1 Anführungszeichenpaar.

oder:


Rechte Maustaste schützen

(Siehe FAQ von Arne Dieckmann, http://home.nexgo.de/ar/arne.d/jsmenhelp/index.html)

Vieleicht findet sich im Forum auch noch eine andere Lösung?

Siehe auch: Rechte-Maustaste-Schutz umgehen


Rechte-Maustaste-Schutz umgehen


Icons in verschiedenen Helligkeiten erzeugen


Tageszeitbegrüßung

function tageszeit(){
var h=(new Date()).getHours()
if(h>=18)return "Abend"
if(h>=12)return "Tag"
return "Morgen"
}

Menüdatum und Seitedatum

Wird noch weiterentwickelt, aber hier schon mal eine sichere Variante.

// Menüdatum und Seitedatum
 suffixHTML += "<CENTER><HR>"; // Zentrierung, Trennlinie (weglassen, wenn doppelt)
 suffixHTML += "Menü-Inhalt Stand: " + getLastModifiedDate() + "<BR>"; // Menüdatum
 suffixHTML += SeitedatumHTML("Rechtes Dokument: ","[Klick für rechten Dokumentstand]") + "<BR>"; // Seitedatum (s.u.)
 suffixHTML += "<HR></CENTER>"; // Trennlinie, Zentrierung-Aus
function SeitedatumHTML(IE4Text,ErsatzText){ // HTML für Seitedatum
  if(document.all&&!window.opera){ //IE ab 4, Opera ausschließen, da Probleme mit document.all (Opera 5.11)
    setInterval("SeitedatumAktualisieren()",1000) // regelmäßig aktualisieren
    // oder statt Intervall als onload im menuFrame und seiteFrame (onload in einzelnen Frames nur im IE)
    return IE4Text + '<span id="pagedate">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span>';
    // bei Courier/Courier New weniger Leerzeichen
  }
  return '<a href="javascript:parent.alert(parent.seitedatum())">' + ErsatzText + '</a>';
  // NS4:alert-Titel zeigt Framenamen an. Deshalb parent.alert
}
function DatumKurz(d){ // Datumsformatierung in "D.M.YYYY" aus Systemformat
	return d.getDate() + "." + ( d.getMonth()+1 ) + "." + Jahr( d.getYear() )
}
function Jahr(x){ // Jahr 4stellig mit Browserkorrektur
  //MSIE: 2001. NS: 101 (bei new Date, =-1900), 01 (bei document.lastModified, = 2stellig).
  //Opera + Übersicht: http://www.bitwelt.de/javascript/sonstiges/jahr2000.htm
  return x>999?x:x<70?x+2000:x+1900
}
function getLastModifiedDate() { // Datum der letzten Dokumentänderung, Form: "D.M.YYYY"
  return DatumKurz(  new Date( Date.parse(document.lastModified) )  );
} // Dank an www.pessara.de
function seitedatum(){ // für Seite-Datum im Menü
  var d // Datum
  // Wichtig: Existenz der Objekte abfragen (beim Start noch nicht geladen, CGI-Ergebnisse sind ohne lastModified, ...)
  if(frames[ZielFrame]) // erst nach dem Start
    if(frames[ZielFrame].document) // Dokument geladen
      if(d=frames[ZielFrame].document.lastModified) // nur bei gespeicherten Dateien, nicht bei generierten Seiten
        return DatumKurz(new Date(d))
  return "(-)" // else
}
function SeitedatumAktualisieren(){ // Seitedatum aktualisieren. Wichtig: Existenz der Objekte abfragen!
 if(frames["menuFrame"])
  if(frames["menuFrame"].document)
   if(frames["menuFrame"].document.all)
    if(frames["menuFrame"].document.all.pagedate)
     frames["menuFrame"].document.all.pagedate.innerText=seitedatum()
}

 


Variable Breite des Menüframes

Im MSIE kann man den Menüframe mit der Maus breiter und schmäler ziehen, wenn man den Framespacing-Wert für den Menü-Frame ändert:



Version 1.41 (auf www.js-menue.de)


Unendliche Ordnertiefen ermöglichen (in 15betaX behoben)


Script in werbefinanzierter Umgebung zum Laufen bringen (in 15betaX behoben)


Script in einem Frameset zum Laufen bringen (in 15betaX behoben)


CSS Style-Sheet im Klappframe verwenden (in 15betaX behoben)

Leider ist in Version 1.41 ein Tippfehler, darum wird im Klapp-Frame das Style-Sheet nicht geladen. Abhilfe:

Suchen lassen nach:
TYPE\
ersetzen durch:
TYPE=\

In 15betaX wird der betroffene Quellcode-Teil (bentutzt für Menü-Frame und Klapp-Frame) in einer gemeinsamen Variable gespeichert, und die ist richtig.


Neue Version 15beta3 zum Download freigegeben

Es hat leider sehr lange gedauert, aber nun hat Ansgar endlich die Erlaubnis erteilt. Neue Version downloadbar unter:

http://js-menue.info/jsm15b3.zip (Quelle: JS-Menü-Newsletter)

Integriert sind z. B. folgende Verbesserungen (Erläuterung der Punkte oben):

Wie umsteigen?



Version 1.41 als auch 15beta3/4 (Version 15beta3 hier)


Script unter Opera zum Laufen bringen

Opera stoppt, wenn es die Seiten dynamisch aufbauen soll. Stattdessen kann man in Opera das statische Menü "nojsmenu.htm" anzeigen lassen.

Hinter:
// ab hier brauchst Du nichts mehr zu ändern

folgendes einfügen:

if(navigator.userAgent.indexOf("Opera")!=-1){
  brow="opera" // Standard: browserabhängie Links = Opera . WICHTIG: Abfrage muß nach Netscape4.x und MSIE erfolgen
  jsstart=' ';
  menusource='nojsmenu.htm';
  KlapFrame='0';
}else{
  jsstart=' onLoad="start()" onResize="neumalen()" ';
  menusource='leer.htm';
}

Suchen lassen nach:
onLoad="start()" onResize="neumalen()"
ersetzen durch:
'+jsstart+'

Suchen lassen nach:
FRAME NAME="menuFrame" SRC="leer.htm"
ersetzen durch
FRAME NAME="menuFrame" SRC="'+menusource+'"

Die neueste Opera-Version (6 ab build 1010, nicht die 6 beta's) soll das nicht mehr nötig haben. Bin aber noch nicht dazu gekommen.


Scrollbalken unter NS6.01 anzeigen lassen

Habe ich schon mal versucht (nojsmenu.htm vorher geladen und anderes). Die Scrollbalken wurden dann auch angezeigt, waren aber tot, es ließ sich nicht damit scrollen.

Stattdessen hilft folgender Code, einen kleinen Hinweis am Menüanfang auszugeben:

Hinter
// ab hier brauchst Du nichts mehr zu ändern

folgendes setzen:
if(navigator.userAgent.indexOf("Netscape6")!=-1)
prefixHTML="<small>Netscape 6 Scrollbar-Fehler möglich. Scrollrad benutzen oder Menü-Frame anklicken und Tastaturpfeiltasten benutzen!</small><HR>"+prefixHTML


Menüaufbau beschleunigen (besonders bei Seiten mit Bannern/Grafiken/Countern). Geändert!

<HTML>
<BODY BGCOLOR='#FFFFCC' onLoad="parent.start2()">
<TABLE WIDTH=100% HEIGHT=100%>
  <TR>
    <TD align=center valign=middle><I><B>Men&uuml; wird geladen ...</B></I></TD>
  </TR>
</TABLE>
</BODY>
</HTML>

Wichtig ist der Zusatz onLoad="parent.start2()" im body-Tag


Zurückscrollen beim Ordner-Öffnen verhindern:

nach "ion aufzu" suchen lassen
dann nach "malemenu"

Diese Zeile komplett ersetzen durch:

fmw=frames["menuFrame"].window
if (document.layers){ // Nur Netscape
x=fmw.pageXOffset
y=fmw.pageYOffset
}
else{ // IE
x=fmw.document.body.scrollLeft
y=fmw.document.body.scrollTop
}
maleMenu()
fmw.scrollTo(x,y) // x-Position funktioniert nicht (NN4/IE), geht immer auf hor. Anfang(0). Y klappt.


Menüstruktur-Definitionen vereinfachen

Bei Versionen 1.41 und 15beta3/4: vor "function ladeDaten()" oder sonst wo zwischen/nach den Funktionen folgende Funktionen einfügen:

// Im Folgenden 1 Zusatzleerzeichen nach new gegen maschinelle Ersetzung
function l(a,b,c,d,e,f){	// Link
mD.neu(new  LE(a,b,c,d,e,f))
}
function v(a,b,c,d,e,f,g){	// Verzeichnis
mD.neu(new  VE(a,b,c,d,e,f,g))
}
function r(a,b,c,d){		// Root
mD.neu(new  HVE(a,b,c,d))
}

Statt z. B. mD.neu(new LE(...)) heißt es dann nur noch l(...).
Achtung: hinten die letzte Klammer fällt auch weg.

Tool zum kürzen alter Menüeinträge: menueintragskuerzer.htm. Kann auch rückgängig machen (Modus "rückwärts" wählen).

Sonst hier die Anleitung für Wordpad:


Ordnerinhalte dynamisch anzeigen


Funktionslose Menüeinträge erzeugen



Version von Frank Bergermann