undine: ab NS 4.08 läuft's prima, aber NS 4.03 gibt Fehlermeldungen

Hallo Forum,

meine kleinen Scripte werden von NS 4.08 aufwärts problemlos akzeptiert, aber der NS 4.03 gibt Fehlermeldungen! Nun sind mir die Ideen ausgegangen, was falsch sein könnte. Im Archiv hab ich soweit nichts gefunden (falsch gesucht?), hat einer von Euch eine Idee oder ein Lesetipp? Konkretes Problem:

beim Einlesen der Funktion gibts die Meldung: function not always returns a value

in der Zeile des Funktionsaufrufts (z.B. Body onLoad): funtion is not defined

Aber dies eben alles nur bei  NS 4.03 und 4.05... darüber läufts prima.

Ein Beispiel gibts unter http://surf.to/thecavegirls im INTRO Teil, ein anderes hier als Code:

**************************************
<html>
<head>

<style type="text/css">
#impressum { font-family: verdana, arial, sans-serif; font-size: 10px;}  
.imp {font-family: impact, arial narrow,sans-serif; font-size: 14px;}
  </STYLE>

<script LANGUAGE="JAVASCRIPT">

function moveImpressum()
{if (document.layers)
    {document.impressum.top -=4;
    if (document.impressum.top <= 20)
        {return true;
        }
    }
else if (document.all)
    {impressum.style.top = parseInt(impressum.style.top)-4;
    if (parseInt(impressum.style.top)<= 25)
        {return true;
        }
    }        
if((document.layers)(document.all))
    {setTimeout('moveImpressum()', 100);  
    }
}
</SCRIPT>

</head>
<body BGCOLOR="#FFCC66" BACKGROUND="../images/links_mitte.gif" onLoad="moveImpressum()">

<div ID="impressum" STYLE="position:absolute; left: 10px; top: 220px; width:160px; height:560px;">
<p><span class="imp">IMPRESSUM</SPAN></P>
</DIV>

</body>
</html>

******************************************
schon mal jetzt Danke für jeden Tipp!

  1. Hallo Undine,

    meine kleinen Scripte werden von NS 4.08 aufwärts problemlos akzeptiert, aber der NS 4.03 gibt Fehlermeldungen!

    Notiere doch mal:

    <div ID="impressum" STYLE="position:absolute; left: 10px; top: 220px; width:160px; height:560px;">

    so:

    <div ID="impressum" STYLE="position:absolute; left:10px; top:220px; width:160px; height:560px;">

    (die Blanks hinter den Doppelpunkten vor den Style-Zuweisungen left: iund top: raus - leider reagierten die ersten 4er-Versionen von Netscape oftmals mit Nichtbeachtung auf Zuweisungen, bei denen ein Blank da stand - und was in diesem Fall dazu fuehren wuerde, dass er das Element nicht als ordentlich positioniert ansieht und damit auch nicht als dynamisch aenderbar. Das ist jetzt aber alles nur Spekulation...)

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,

      Notiere doch mal:

      <div ID="impressum" STYLE="position:absolute; left: 10px; top: 220px; width:160px; height:560px;">

      so:

      <div ID="impressum" STYLE="position:absolute; left:10px; top:220px; width:160px; height:560px;">

      daran liegt es leider nicht, hab ich gerade ausprobiert!

      (die Blanks hinter den Doppelpunkten vor den Style-Zuweisungen left: iund top: raus - leider reagierten die ersten 4er-Versionen von Netscape oftmals mit Nichtbeachtung auf Zuweisungen, bei denen ein Blank da stand

      gut zu wissen! Da werde ich dann unbedingt drauf achten, danke!

      grüße von Undine

  2. Hallo undine,

    beim Einlesen der Funktion gibts die Meldung: function not always returns a value

    in der Zeile des Funktionsaufrufts (z.B. Body onLoad): funtion is not defined

    Aber dies eben alles nur bei  NS 4.03 und 4.05... darüber läufts prima.

    zunächst mal - nur zur Sicherheit, weißt Du wahrscheinlich sowieso - ab Netscape 4.06 aufwärts werden alle Fehlermeldungen in der 'Javascript-Konsole' gesammelt sind also nicht mehr direkt sichtbar. Diese erhält man durch Eingabe von "javascript:" in der URL-Zeile.

    Nun noch zum Skript:
    In der Funktion moveIt() (in intro.htm) stehen ja eine ganze Reihe von if-Abfragen der Form

    if(parseInt(<wert>)><irgendwas>) { tue_was(); ... }

    Bei einer Verzweigung steht zusätzlich "return true; " hinter der if-Abfrage. D.h. manchmal gibt die Funktion den Wert true zurück, manchmal gar keinen Wert - und das scheint den JS-Interpreter zu stören. Abhilfe: Entweder das "return true;" weglassen, oder - falls Du den Return-Wert benötigst - ganz am Ende der Funktion hinter allen if-Abfragen ein "return false;" schreiben.

    Die andere Fehlermeldung "moveIt() is not defined" könnte ein Folgefehler der ersten Fehlermeldung sein. Der JS-Interpreter traf ja in der Funktion moveIt() auf besagten obigen Fehler und hat daher die Funktion vielleicht nicht vollständig "gefressen", d.h. kein Funktionsobjekt generiert, so daß moveIt() in nachfolgenden Aufrufen auch nicht bekannt ist.
    Soviel erstmal zu meinen Spekulationen... ;-)

    Viele Grüße

    Andreas

    1. Hallo Andreas,

      »

      zunächst mal - nur zur Sicherheit, weißt Du wahrscheinlich sowieso - ab Netscape 4.06 aufwärts werden alle Fehlermeldungen in der 'Javascript-Konsole' gesammelt sind also nicht mehr direkt sichtbar. Diese erhält man durch Eingabe von "javascript:" in der URL-Zeile.

      Ja, und merkwürdigerweise gab es da ja keine Fehlermeldungen.

      »»Abhilfe: Entweder das "return true;" weglassen, oder - falls Du den Return-Wert benötigst - ganz am Ende der Funktion hinter allen if-Abfragen ein "return false;" schreiben.

      Also wenn ich "return true;" weglasse, funktionierts.KLASSE! Aber ich dachte halt, die Funktion ist hier zu Ende und da sollen dann auch die Javascript Berechnungen aufhören und keine endlos weiteren Berechnungsschleifen gerechnet werden. Deshalb wollte ich den Wert zurückgeben und dachte, dann ist die Funktion beendet. Wie kann ich die denn nun beenden? "return false;" gibt die gleiche Fehlermeldung wie "return true;" und "break;" ist an der Stelle "invalid".

      Die andere Fehlermeldung "moveIt() is not defined" könnte ein Folgefehler der ersten Fehlermeldung sein.

      Das dachte ich mir auch schon.

      Noch ne Frage, wenn's nicht zuviel wird: mit IE gibt's wie gesagt keine Probleme, aber unter HOMESITE (browsed mit IE) gibts bei diesen dynamischen Sachen z.B. dieser beim browsen die Fehlermeldung "invalid floitingpoint operation" und dann klappt das ganze Programm zusammen... dabei funktioniert doch alles im IE ohne Fehlermeldung... hast du ne Ahnung, woran das liegen könnte?

      viele Grüße von Undine

      1. Hallo undine!

        Also wenn ich "return true;" weglasse, funktionierts.KLASSE! Aber ich dachte halt, die Funktion ist hier zu Ende und da sollen dann auch die Javascript Berechnungen aufhören und keine endlos weiteren Berechnungsschleifen gerechnet werden. Deshalb wollte ich den Wert zurückgeben und dachte, dann ist die Funktion beendet. Wie kann ich die denn nun beenden? "return false;" gibt die gleiche Fehlermeldung wie "return true;" und "break;" ist an der Stelle "invalid".

        Wie Andreas schon sagte, am Ende der Funktion noch ein return false. Dadurch wird in jedem Fall ein ordentlicher Wert zurueckgegeben. Ueber den fehlenden Rueckgaewert am Ende hat sich die Fehlermeldung ja beschwert (function not always returns a value).

        Du kannst aber auch einfach die Funktion verlassen, ohne etwas zurueckzugeben. Du musst nicht unbedingt was hinter return schreiben. Ohne Parameter wird die Funktion eben einfach so verlassen. Dann darfst Du aber *nie* etwas aus der Funktion zurueckgeben, musst also alle returns nackt lassen. Das ist ueberhaupt der bessere Weg.

        break ist nicht fuer das "Abrechen" von Funktionen gedacht (dafuer gibt es ja return). Es beendet alle moeglichen Arten von Schleifen und switch-Bloecke. Und nach einem Label kann man es auch noch irgendwie verwenden (<../../tebh.htm#a4> und http://developer.netscape.com/docs/manuals/js/client/jsguide/stmtsov.htm#1008389).

        Calocybe

      2. Hallo Undine,

        Also wenn ich "return true;" weglasse, funktionierts.KLASSE! Aber ich dachte halt, die Funktion ist hier zu Ende und da sollen dann auch die Javascript Berechnungen aufhören und keine endlos weiteren Berechnungsschleifen gerechnet werden. Deshalb wollte ich den Wert zurückgeben und dachte, dann ist die Funktion beendet. Wie kann ich die denn nun beenden? "return false;" gibt die gleiche Fehlermeldung wie "return true;" und "break;" ist an der Stelle "invalid".

        also eine Möglichkeit wäre noch, daß Du einfach "return;" statt "return true;"  verwendest, so daß die Funktion auf alle Fälle keinen Wert zurückliefert. Wenn Du "return true;" schreibst, gibst Du ja einen Wert vom Typ boolean zurück - und das muß die Funktion dann immer tun.
        Momentan sieht es ja so aus:

        function xyz {
          if (bedingung1)  {
            tu_was();           // <- danach wird am Ende der Funktion weitergemacht
          }
          if (bedingung2) {
            tu_was_anderes();
            return true;    
            // hier wird ein boolean-Wert (true) zurueckgegeben
            // und danach die Funktion an dieser Stelle abgebrochen
          }

        // Hier kommt man hin, wenn bedingung2 nicht erfüllt
          // ist. Da hier kein return steht, wird nix zurückgegeben.
          // Mögliche Abhilfe: An dieser Stelle ein "return false;"
        }

        Die andere Alternative wäre eben das return false; an der gekennzeichneten Stelle. Sollte das nicht funktionieren, wäre das imho ziemlich merkwürdig ... aber bei JavaScript weiß man ja nie <g>.

        Noch ne Frage, wenn's nicht zuviel wird: mit IE gibt's wie gesagt keine Probleme, aber unter HOMESITE (browsed mit IE) gibts bei diesen dynamischen Sachen z.B. dieser beim browsen die Fehlermeldung "invalid floitingpoint operation" und dann klappt das ganze Programm zusammen... dabei funktioniert doch alles im IE ohne Fehlermeldung... hast du ne Ahnung, woran das liegen könnte?

        Mit Homesite hab ich selber leider noch kaum Erfahrung. Hast Du mal probiert, unterschiedliche Browser in Homesite einzubetten (bzw. geht das überhaupt?). Klingt für mich so, als ob sich zwei große Programme (IE und Homesite) nicht in allen Lebenslagen miteinander vertragen...

        Viele Grüße

        Andreas