Carsten: Netscape-Problem beim dynamischen Ändern eine Textinhalts.

Beitrag lesen

Hallo Thomas,

Habe diesen Script geschrieben:

Oh mann.

So, nun funktioniert das aber nicht unter Netscape, liegt es am Netscape
Preview Release 2 oder generell an Netscape

Ähm, dir ist klar, dass Netscape bis 4.7 und Netscape ab 5 (also die
Pre-Releases und die Mozilla Milestones) nix aber auch gar nix miteinander
zu tun haben, was das verhalten bei DHTML betrifft ?

  • MS Internet Explorer macht hier keine Probleme.

naja, wenn du die <style>'s so schreibst, dass sie funktionieren, funktioniert
die Seite auch im IE nicht mehr so richtig toll. (36pt muss aber auch nicht
sein ;-)

Wo liegt also der Fehler.

Ich geh mal davon aus, dass du das ganze für normale Internet-Benutzer machen
möchtest - also IE4/5 und NN4.x. Der IE Teil klappt ja schon mal.
Der NN positioniert Layer aber absolut, die variable Text-Ausgabe 'klebt' immer
in der linken oberen Ecke. Relative Positionierung plus document.write in
<div> Bereiche klappt nicht so recht, also muss man den Layer an die richtige
Stelle schieben.

So funktioniert es:

<html>
<!-- Copyrights by Thomas Häber webmaster@haeber.de //-->
<head>
<title>Startseite mit dynamischen Inhalt</title>
<style type="text/css">
<!--
a:hover {color:"#FFFFFF";}
a       {text-decoration:"none";}
.Zeugs { font-family:"Century Gothic",Arial; font-size:20pt; color:#000000; text-align:center; }
td  {font-family:Arial,"Lucida Sans"; font-size:13pt; color:#000000; }
-->
</style>

<script language="JavaScript" type="text/javascript">
<!--
function TextSetzen(welche)
{
  switch (welche)
  {
  default:
  case "Nothing":
    text="<-- Klicken Sie auf der linken Seite den gewünschten Verweis an.";
    break;
  case "Touristik":
    text="Hier informieren Sie sich über die Touristikangebote der UZE GmbH.";
    break;
  case "Export":
    text="Hier informieren Sie sich über die Import- und Exportgeschäfte sowie die Luftfracht der UZE GmbH.";
    break;
  case "Diverses":
    text="Hier informieren Sie sich über Diverses."
    break;
  }
  TextAnzeigen(text);
}

function TextAnzeigen(text)
{
  if(document.all)
    document.all.Microsoft.innerHTML = text;
  else if(document.layers)
  {
    // anti Flacker, da die (Y)Position erst nach dem
    // document.write() verändert werden kann
    document.Netscape.visibility="hidden";

// Text zusammenbauen und ausgeben
    document.Netscape.document.open();
    Gesamt = '<span class="Zeugs")>'+text+'</span>';
    document.Netscape.document.write(Gesamt);
    document.Netscape.document.close();

// relative Positionierte <div>'s funktionieren nicht richtig,
    // aber immerhin lässt sich die Position eines relativen <div>
    // ermitteln und an das absolute <layer> zuweisen
    document.Netscape.pageX=document.Microsoft.pageX+5;
    // Horizontal positionieren und zentrieren
    document.Netscape.pageY=document.Microsoft.pageY-document.Netscape.clip.height/2;

// Ergebnis sichtbar machen
    document.Netscape.visibility="show";
  }
}
// -->
</script>
</head>
<body onload="TextSetzen('Nothing');" bgcolor="#6666FF" text="#000000" link="#000000" alink="#000000" vlink="#000000">
<table bordercolor="#FFFF00" align="center" width="550" height="360" cellspacing="0" cellpadding="0" border="1">
<tr height="120">
<td align="center" width="250"><a href="index2.html" onMouseOver="TextSetzen('Touristik');" onMouseOut="TextSetzen();">&#149; Touristik</a></td>
<td width="300" rowspan="3">

<layer name="Netscape" width=290></layer>

<div id="Microsoft" class="Zeugs" style="position:relative; left:0; top:0;" ></div>

</td></tr><tr height="120">
<td align="center" width="250"><a href="index3.html" onMouseOver="TextSetzen('Export');" onMouseOut="TextSetzen();">&#149; Import, Export und Luftfracht</a></td></tr><tr height="120">
<td align="center" width="250"><a href="index4.html" onMouseOver="TextSetzen('Diverses');" onMouseOut="TextSetzen();">&#149; Diverses</a></td>
</tr>
</table>
</body>
</html>

Änderungen:
<style> korrigiert, das hat ja noch nicht mal der IE angezeigt *fg*

4 mal den gleichen Code zu einer Funktion zusammengefasst, sonst kriegt man
ja 'nen Rappel beim rumprobieren.

im Script-Teil alle </ durch </ ersetzt. (Korinthenkackerei, ist nur ein muss,
wenn in einem String "</script>" vorkommt)

Codeteil für Netscape-Ausgabe angepasst: siehe Kommentare.

Immer noch drin ist der bekannte Netscape resize-bug. (Verstell mal die
Fenstergrösse... :( ... einmal Reload drücken -> wieder ok. Steht irgendwo
im Archiv auch ein Abhilfe-Script zu.)

Alternative Realisierung mit vier <div> von den immer nur eins
sichbar ist:

<html><head>
<style type="text/css">
<!--
a:hover {color:"#FFFFFF";}
a       {text-decoration:"none";}
.Zeugs  { font-family:"Century Gothic",Arial; font-size:20pt; color:#000000; text-align:center; position:absolute; left:0; top:0; width:290; visibility:hidden; }
.MZeugs { font-family:"Century Gothic",Arial; font-size:20pt; color:#000000; text-align:center; position:relative; left:0; top:0; width:290; }
td  {font-family:Arial,"Lucida Sans"; font-size:13pt; color:#000000; }
-->
</style>
<script><!--

var letzter;

function TextSetzen(text)
{
  if(!text)
    text="Nothing";

if(document.all)
    document.all.Microsaft.innerHTML = document.all[text].innerHTML ;
  else if(document.layers)
  {
    if(letzter)
      document.layers[letzter].visibility="hide";
    letzter=text;

// Referenzposition ist der relativ positionierte Layer
    // Dahin wird jetzt der Layer, der angezeigt werden soll
    // verschoben
    document.layers[text].pageX=document.Microsaft.pageX+5;
    // in Y-Richtung muss zusätzlich noch zentriert werden.
    // dazu wird um die Hälfte des Clip-Bereiches nach oben verschoben.
    document.layers[text].pageY=document.Microsaft.pageY-document.layers[text].clip.height/2;

document.layers[text].visibility="show";
  }
}
// -->
</script>
</head>
<body onload="TextSetzen();" bgcolor="#6666FF" text="#000000" link="#000000" alink="#000000" vlink="#000000">
<table bordercolor="#FFFF00" align="center" width="550" height="360" cellspacing="0" cellpadding="0" border="1">
<tr height="120"><td align="center" width="250"><a href="index2.html" onMouseOver="TextSetzen('Touristik');" onMouseOut="TextSetzen();">&amp:#149; Touristik</a></td>
<td align="center" width="300" rowspan="3">

<div id="Microsaft" class="MZeugs"></div>
<div id="Nothing" class="Zeugs"><-- Klicken Sie auf der linken Seite den gewünschten Verweis an.</div>
<div id="Export" class="Zeugs">Hier informieren Sie sich über die Import- und Exportgeschäfte sowie die Luftfracht der UZE GmbH.</div>
<div id="Diverses" class="Zeugs">Hier informieren Sie sich über Diverses.</div>
<div id="Touristik" class="Zeugs">Hier informieren Sie sich über die Touristikangebote der UZE GmbH.</div></td></tr>

<tr height="120"><td align="center" width="250"><a href="index3.html" onMouseOver="TextSetzen('Export');" onMouseOut="TextSetzen();">&#149; Import, Export und Luftfracht</a></td></tr>
<tr height="120"><td align="center" width="250"><a href="index4.html" onMouseOver="TextSetzen('Diverses');" onMouseOut="TextSetzen();">&#149; Diverses</a></td></tr>
</table></body></html>

Vorteil: Du hast keinen (Text)Inhalt mehr im Script drinstehen, etwas kürzer.

So, jetzt habe ich aber genug Netscape DHTML für heute gelernt.
(Getestet mit NN4.73/IE5.0, keine Garantie das es woanders läuft.)

Gruss,
Carsten