Matze: Mozilla document.writeln

Hallo NG,

ich bin nicht so der DHTML-Guru. Ich habe bei einem Kunden eine Seite übernommen die ein Tree-Menü hat das weder mit NS6, Mozilla noch Opera funktioniert :-(.

Ich habe zwar zumindest das Menü schon sichtbar hinbekommen, habe aber ein merkwürdiges verhalten.

Code unten: [SNIP]

Im Body sind noch 2 Layer für MS bzw. NS angegeben:
<layer id="NetscapeMENU"></layer>
<div align="left" id="MicrosoftMENU"></div>

Eigentlich müsste ich doch meiner nachträglich eingebauten Browsererkennung (document.getElementById) auch den Layer bzw. DIV ID mitgeben ?.

Aber mein eigentliches Problem ist, dass im Mozilla das Menü jetzt aufgebaut wird.In der Statuszeile wird auch der Aufruf "javascript:openandclose(3) z.B. korrekt angezeigt. Er öffnet aber nicht den Baum. Lt. Javascript-Console würde er function openandclose nicht finden.

Für jeden Tip vielen Dank im voraus.

Grüsse Matthias

[SNIP]
for (i=0;i<=menublock.length-1;i++) {
 showsubmenus[i]=-1
}
function openandclose(visi) {
 showsubmenus[visi]=(-1)*showsubmenus[visi]
 var menucontent=""
 for (i=0;i<=menublock.length-1;i++) {
  menusplit=menublock[i].split(";")
  urlsplit=menusplit[8].split("|")
  if (menusplit[3]==1) {font_weight_main="<b>"}
  if (menusplit[3]==0) {font_weight_main=""}
  if (menusplit[7]==1) {font_weight_sub="<b>"}
  if (menusplit[7]==0) {font_weight_sub=""}
  menucontent+=font_weight_main+"<a href='javascript:openandclose("+i+")'><font face="+menusplit[0]+" color="+menusplit[2]+" size="+menusplit[1]+">"+urlsplit[0]+"</font></a><br>"
  if (showsubmenus[i]==1) {
   for (ii=9;ii<=menusplit.length-1;ii++) {
    urlsplit=menusplit[ii].split("|")
       menucontent+=font_weight_sub+"   <a href="+urlsplit[1]+" target="+urlsplit[2]+"><font face="+menusplit[4]+" color="+menusplit[6]+" size="+menusplit[5]+">"+urlsplit[0]+"</font></a><br>"
   }
  }
 }
   if (document.getElementById ) {
    document.writeln(menucontent)
    document.close()
 }
 if (document.all) {
  MicrosoftMENU.innerHTML=menucontent
 }

if (document.layers) {
  document.NetscapeMENU.document.write(menucontent)
  document.NetscapeMENU.document.close()
 }
}

[/SNIP]

  1. Im Body sind noch 2 Layer für MS bzw. NS angegeben:
    <layer id="NetscapeMENU"></layer>
    <div align="left" id="MicrosoftMENU"></div>

    Allein das zeugt schon von ziemlicher unkenntniss der Macher. Es gibt nur ganz wenige Situationen, wo ein <layer> wirklich notwendig ist, da alle positionierten Elemente auch Layer sind.

    Aber mein eigentliches Problem ist, dass im Mozilla das Menü jetzt aufgebaut wird.In der Statuszeile wird auch der Aufruf "javascript:openandclose(3) z.B. korrekt angezeigt. Er öffnet aber nicht den Baum. Lt. Javascript-Console würde er function openandclose nicht finden.

    function openandclose(visi) {

    if (document.getElementById ) {
        document.writeln(menucontent)
        document.close()

    damit überschreibst du das komplette dokument inkl. JS.
    NC >4 und MZ können auch inerHTML.

    if (document.layers) {
      document.NetscapeMENU.document.write(menucontent)
      document.NetscapeMENU.document.close()

    da fehlt noch ein open();

    Der Ausschnitt zeigt schon, das das Skript arg veraltet ist, diese ganze Schriftattribute sollten mit CSS Klassen realisiert werden, dann sparst du die ganzen Abfragen um <Font> Tags zu öffnen und schliessen.
    Das Font Tag soll sowieso nicht mehr verwendet werden.

    Struppi.

    1. Hallo Struppi,

      erstmal danke. Ja ich weiss das der Script veraltet ist. Aber für die nächsten Wochen muss er noch halten :-(.

      Ich habe es mal mit dem innerHTML getestet:
         if (document.getElementById ) {
          document.all.Mozilla.innerHTML = menucontent
       }
      <body>
      <p id="Mozilla"></p>

      Jetzt sagt mir die JS-Console:
      Fehler: document.all has no properties

      und zeigt logischerweise gar nix mehr an. Wobei selbst das Beispiel aus SELFHTML im MOZ nicht läuft.
      Eigentlich wäre mir die innerHTML-Variante ja am liebsten gewesen.

      Matze

      1. Hallo,

        Ich habe es mal mit dem innerHTML getestet:
           if (document.getElementById ) {
            document.all.Mozilla.innerHTML = menucontent
         }

        Warum auf document.getElementById pruefen und dann das nur noch als Fallback fuer den IE 4 geeignete document.all ansprechen (was bei Mozilla-Derivaten natuerlich scheitern muss)?

        also:
        document.getElementById("Mozilla").innerHTML = menucontent;

        sofern "Mozilla" ein ID-Wert ist.

        MfG, Thomas

        1. Hallo Thomas,

          vielen Dank.

          Grüsse
          Matze