Stephan Huber: Warum funktioniert das in IE5/NS4, aber nicht in IE4

Hallo zusammen,
ich habe ein eigentlich recht simples Javascript, das die Sichtbarkeit von Layern umzustellt, um damit Rollovers zu machen, die nicht auf den Bereich eines Bildes beschränkt sind. Das ganze funktioniert wunderbar in IE5 und NS4, aber IE4 mag einfach nicht, und ich komm' nicht drauf, warum. Eigentlich sollte die Syntax völlig konform zu IE4 sein:

<script language="Javascript">
if (document.layers)  {
     ns = 1; ie = 0;
} else {
     ns = 0; ie = 1;
}

function layerzeigen(name) {
if (ns) {
    document.layers[''+name].visibility = "show";  
    }
    else {
    document.all[''+name].style.visibility = "visible"
    }
}

function layerverbergen(name) {
if (ns){
    document.layers[''+name].visibility = "hide"
    }
    else {
    document.all[''+name].style.visibility = "hidden"
    }
}

function menue_aktivieren(menuid)
{
    layerverbergen(eval('"' + menuid +'off"'));
    layerzeigen(eval('"' + menuid +'on"'));
}

function menue_deaktivieren(menuid)
{
    layerzeigen(eval('"' + menuid +'off"'));
    layerverbergen(eval('"' + menuid +'on"'));
}

</script>

Darauf folgen dann im Body Layer der Form:

<div id="geschichteoff" style="position:absolute;left:0px;top:66px;visibility:visible;z-index:0;">
<a href="../../main_content.phtml?bereich=welt&bereich2=geschichte" target="main_content" onmouseover="menue_aktivieren('geschichte');" onmouseout="menue_deaktivieren('geschichte');"><img src="images/icon_geschichte_off.gif" border=0></a></div>
<div id="geschichteon" style="position:absolute;left:0px;top:66px;visibility:hidden;z-index:2;">
<a href="../../main_content.phtml?bereich=welt&bereich2=geschichte" target="main_content" onmouseover="menue_aktivieren('geschichte');" onmouseout="menue_deaktivieren('geschichte');"><img src="images/icon_geschichte_on.gif" border=0></a></div>

Warum verweigert sich da IE4 bitte?
Wer's ausprobieren will:
http://analogon.com/pumuckl/index.phtml
Komischerweise funktioniert es auf der zweiten Seite in der oberen Navigationsleiste, obwohl das Javscript eigentlich bis auf einen minimalen Unterschied, der keine Rolle spielen sollte, nur Copy/Paste ist.

Viele Grüße
Stephan

  1. Hallo Stefan,

    daß das Script so funktioniert, kann ich gar nicht glauben (ohne diese Aussage überprüft zu haben ...), denn die Veschachtelung deiner Hochkommata ist größtenteils nicht korrekt und was das eval im Funktionsaufruf zu suchen hat ist mir ebenfalls nicht klar ...

    probiers doch mal so:

    function menue_aktivieren(menuid)
    {
        layerverbergen(menuid + "off");
        layerzeigen(menuid + "on");
    }

    function layerzeigen(name) {
    if (ns) {
       eval("document."+name+".visibility='show'");
        }
    else {
       eval("document.all."+name+".visibility='visible'");
        }
    }

    Die anderen Funktionen entsprechend .

    Grüße

    Frankie

    Hallo zusammen,
    ich habe ein eigentlich recht simples Javascript, das die Sichtbarkeit von Layern umzustellt, um damit >
    Viele Grüße
    Stephan

  2. Hallo Stephan

    Komischerweise funktioniert es auf der zweiten Seite in der oberen Navigationsleiste, obwohl das Javscript eigentlich bis auf einen minimalen Unterschied, der keine Rolle spielen sollte, nur Copy/Paste ist.

    Ohne das Script selbst geprüft zu haben, ist mir folgendes aufgefallen:

    auf der Startseite steht

    <div style="position:absolute;left:0px;top:129px;visibility:visible">
    <OBJECT classid=".. </NOEMBED>
    </OBJECT></div>

    vor den versteckten Divs, auf der Unterseite jedoch direkt am Ende der Datei. Räume doch auch auf der Startseite den Div mit den Objekt einfach ans Ende. Ich könnte mir vorstellen, daß es das ist.

    Viele Grüße

    Antje

  3. Hallo Stephan,

    ich verwende dieses Script auch. Bei mir funktioniert es sowohl unter IE4 wie IE5. Es traten ab und an Probleme unter IE5 auf, und zwar immer dann, wenn ich eine Änderung an dem Script vorgenommen hatte. Nach einem Kopieren in ein anderes Verzeichnis, löschen der Datei und einem Zurückkopieren lief es dann wieder. Das ist sicher keine Fehlerlösung, aber ich bin auch verwirrt, wie das angehen kann.
    Hier die Version, die bei mir unter beiden Browser-Versionen läuft:
    if (document.layers)  {
         ns = 1; ie = 0;
    } else {
         ns = 0; ie = 1;
         }
      
    var iDiv = 998;

    function zeigeEbeneNr(ebene_nr){
        name = 'layer' + iDiv;
        verbergen(name);
        name = 'layer' + ebene_nr;
        zeigen(name);
        iDiv = ebene_nr;
        }

    function zeigen(name) {

    if (ns) {
        document.layers[''+name].visibility = "show";  
        }
        else {
        document.all[''+name].style.visibility = "visible";
        }
    }

    function verbergen(name) {

    if (ns){
        document.layers[''+name].visibility = "hide";
        }
        else {
        document.all[''+name].style.visibility = "hidden";
        }
    }
    Es treten keine Probleme mehr auf, seit ich den ersten Layer (Nr.998) beim initialisieren auf visible eingestellt habe und alle anderen auf hidden.

    Viele Grüße
    Günter

  4. Hallo Ihr Drei,
    danke für die Tips, leider :-( führte keiner zum erwünschten Erfolg, bevor ich jetzt die Datenmenge um drei Postings vermehre, deshalb jetzt die 'Lösung' in einem: in meinem Skript wurden zwei Layer, deren z-index unterschiedlich ist (der on-layer hat einen höheren) jeweils auf visible bzw. hidden gesetzt. Das ganze funktioniert komischerweise erst dann unter IE4, wenn man nur den on-layer mit höherem z-index auf visible setzt, den off-layer aber NICHT auf hidden. Das ist recht merkwürdig, schließlich ist dieser Layer aufgrund des z-index ja eh' schon unsichtbar, aber irgendwie hat da IE 4 was dagegen. Wer's überprüfen will: Ich habe die Seiten so geändert, daß sie mit meinem IE 4.01 funktionieren, die betreffenden Zeilen, die die off-Ebene auch noch auf hidden setzen, sind im Javascript nur auskommentiert:
    http://www.pumuckl.de
    (Meine Vermutung wäre, daß das ganze irgendwie am Event-Bubbling des IE liegt, d.h. wenn ich auch die off-ebene auf hidden setze, kommen die events nicht mehr an, o.ä.)

    Viele Grüße & Dank für die Bemühungen
    Stephan