Markus Dippold: Reference Error - weiß nicht, warum

Hi *.*,

folgenden Fehler haut mir die Opera JavaScript-Konsole um die Ohren:

Inline script thread
Error:
name: ReferenceError
message: Statement on line 8: Reference to undefined variable: No such variable 'STFrames'
Backtrace:
  Line 8 of inline#1 script in http://www.dippold.org/startrek/serien/nextgen.html
    STFrames(FrameDokumentURL, DokumentURL, DokumentName, FrameDokumentURLPfad, DokumentURLPfad, "startrek/serien/index.html?nextgen.html");

Im zugehörigen HTML-File steht folgendes:
Im Head:
<SCRIPT LANGUAGE="JavaScript" SRC="../../javascripts.js" TYPE="text/javascript"></SCRIPT>

Im Body:
<script language="JavaScript">
<!--
... // Besetzung aller Variablen; die sind auch richtig geschrieben.
STFrames(FrameDokumentURL, DokumentURL, DokumentName, FrameDokumentURLPfad, DokumentURLPfad, 'startrek/serien/index.html?nextgen.html');
// -->
</script>

Ich weiß jetzt nicht, warum Opera meint, "STFrames" wäre eine Variable. Ich bin der Meinung, das ist eine Funktion. Die Referenzierung auf die javascripts.js stimmt auch (denke ich ..., nextgen ist im Verzeichnis serien, eins hoch -> Verzeichnis startrek, noch eins hoch -> root, genau wie die style.css, die ja funktioniert).

Und in der javascripts.js ist das drin:
function STFrames(FrameDokumentURL, DokumentURL, DokumentName, FrameDokumentURLPfad, DokumentURLPfad, pa_Name)
{
...
}
(Kein Returnwert)

Was ist da falsch?
Irgendwo ein Komma/Strichpunkt zuviel oder zuwenig?
Oder muß man immer return reinschreiben, auch wenn es gar nichts zu returnen gibt und es auch vom Aufruf her nicht erwartet wird?
Muß man "}" mit ";" abschließen oder ist das nur zur Verzierung (nein, bis jetzt mache ich das nicht, sondern nur bei ganz normalen Anweisungszeilen)?

Vielen Dank und mfG,
Markus

  1. Hi,

    <script language="JavaScript">

    bitte auch hier das type-Attribut nicht vergessen.

    Ich weiß jetzt nicht, warum Opera meint, "STFrames" wäre eine Variable. Ich bin der Meinung, das ist eine Funktion.

    Auch eine Funktion ist eine Variable. _Alles_ ist eine Variable. Wenn Du diese Philosophie mal richtig erleben möchtest, dann programmiere in Python :-)

    Die Referenzierung auf die javascripts.js stimmt auch (denke ich

    Dies lässt sich überprüfen. Ein alert() ist i.a. recht auffällig.

    Oder muß man immer return reinschreiben, auch wenn es gar nichts zu returnen gibt und es auch vom Aufruf her nicht erwartet wird?

    Nein.

    Muß man "}" mit ";" abschließen oder ist das nur zur Verzierung

    Weder noch. In bestimmten Fällen kann es einen Unterschied machen; aber das ist so tief, dass es hier nicht von Bedeutung ist.

    (nein, bis jetzt mache ich das nicht, sondern nur bei ganz normalen Anweisungszeilen)?

    Auch dort sind Semikola übrigens optional. Nur zwischen zwei Anweisungen in der selben Zeile sind sie unvermeidbar. Besserer Stil ist es aber, es dennoch zu verwenden.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      <script language="JavaScript">

      bitte auch hier das type-Attribut nicht vergessen.

      Gemacht, testweise in dem eine File.
      Nützt leider auch nix.

      Die Referenzierung auf die javascripts.js stimmt auch (denke ich

      Dies lässt sich überprüfen. Ein alert() ist i.a. recht auffällig.

      Tja, dann paßt die Referenzierung wohl. Gerade ausprobiert.

      Irgendeine Idee, warum Opera diese Meldung bringt?

      Gruß,
      Markus

      1. Hi,

        bitte auch hier das type-Attribut nicht vergessen.
        Gemacht, testweise in dem eine File.
        Nützt leider auch nix.

        nein, für JavaScript selber bringt das in Deinen Testsystemen vermutlich nichts. Es korrigiert aber einen ganz allgemeinen Fehler.

        Irgendeine Idee, warum Opera diese Meldung bringt?

        Er kennt die Funktion nicht. Das kann z.B. durch einen beim Parsen des Scripts augetretenen Fehler verursacht werden. Eine URL könnte helfen.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          bitte auch hier das type-Attribut nicht vergessen.
          Gemacht, testweise in dem eine File.
          Nützt leider auch nix.

          nein, für JavaScript selber bringt das in Deinen Testsystemen vermutlich nichts. Es korrigiert aber einen ganz allgemeinen Fehler.

          Irgendeine Idee, warum Opera diese Meldung bringt?

          Er kennt die Funktion nicht. Das kann z.B. durch einen beim Parsen des Scripts augetretenen Fehler verursacht werden. Eine URL könnte helfen.

          Steht zwar schon im ersten Posting in der Fehlerbeschreibung, aber bitte:
          http://www.dippold.org/startrek/serien/nextgen.html

          Wenn man die Datei so aufruft, sollte oben der Hinweis kommen, daß diese Datei in einen Frame gehört + ein Häuschen mit Link, der dann die index.html aufruft mit automatischer Anzeige der richtigen Datei im Frame.
          Und das tut es eben nicht.

          Der normale Aufruf-Weg ist:
          http://www.dippold.org/ -> Star Trek -> Serien -> The Next Generation

          Der Fehler kommt in beiden Fällen.

          Nochwas:
          Der IE sagt an dieser Stelle: "Fehler: Objekt erwartet"
          (was vermutlich das gleiche wie beim Opera bedeuten soll)

          Gruß,
          Markus

          1. Hi,

            Steht zwar schon im ersten Posting in der Fehlerbeschreibung, aber bitte:

            hoppla, mein Fehler, sorry.

            Der IE sagt an dieser Stelle: "Fehler: Objekt erwartet"
            (was vermutlich das gleiche wie beim Opera bedeuten soll)

            Der Code ist leider in seinen Details nicht wirklich gut zu verstehen; u.a. deshalb, weil Du irgendwelche Sachen mit dem navigator-Objekt machst (wozu das?) und wegen der Klammersetzung, aber vor allem wegen der Weiterleitung, die das ursprüngliche Umfeld eliminiert. Wenn Du dies mal herausnehmen könntest, würde das eine Analyse immens vereinfachen.

            Wozu eigentlich die Unterscheidung zwischen lokal und nicht lokal? Warum arbeitest Du nicht einfach auch bei Dir mit einem Server und in Folge dessen mit relativen URLs?

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi,

              Der IE sagt an dieser Stelle: "Fehler: Objekt erwartet"
              (was vermutlich das gleiche wie beim Opera bedeuten soll)

              Der Code ist leider in seinen Details nicht wirklich gut zu verstehen; u.a. deshalb, weil Du irgendwelche Sachen mit dem navigator-Objekt machst (wozu das?) und wegen der Klammersetzung, aber vor allem wegen der Weiterleitung, die das ursprüngliche Umfeld eliminiert. Wenn Du dies mal herausnehmen könntest, würde das eine Analyse immens vereinfachen.

              Du meinst das "&& parseInt(navigator.appVersion) >= 4"?
              Keine Ahnung, das ist aus einer Scriptsammlung downgeloaded ...gedownloaded ... heruntergeladen.
              Ich denke mal, daß soll wohl die Browserversion abfragen.
              Ob das nun für meine Zwecke notwendig ist, weiß ich nicht (wenn 100 Leute mit Java-Kenntnissen in einem Raum sind, dann sind sicher 95 dabei, die mehr Ahnung von JavaScript haben als ich).

              Was meinst Du mit Klammersetzung?

              Und bis zur Weiterleitung komme ich ja schon gar nicht.
              So wie ich das sehe, tritt der Fehler auch schon vorher auf.

              Wozu eigentlich die Unterscheidung zwischen lokal und nicht lokal? Warum arbeitest Du nicht einfach auch bei Dir mit einem Server und in Folge dessen mit relativen URLs?

              Damit es auch zu Hause klappt. Ich habe keinen Server installiert. Ich habe mich mal daran versucht (Apache) mit der Konsequenz, daß surftechnisch danach gar nichts mehr ging. Deinstallieren ließ sich das Teil auch nicht mehr sauber - da habe ich dann mein Systembackup zurückgespielt.
              Dann habe ich mal den Tip von einem Kollegen ausprobiert, bei dem es angeblich läuft. Hier was nachinstallieren, dort was nachinstallieren, da wird was nicht gefunden, funktioniert hat es letztendlich auch nicht.
              Ich halte es für einfacher, zu Hause einfach die Variable auf "true" zu setzen. Ob nun das Bildchen angezeigt wird oder nicht, stört nicht, ich will nur die Funktion an sich testen können.

              Gruß,
              Markus

              1. Hi,

                Du meinst das "&& parseInt(navigator.appVersion) >= 4"?

                ja, das ist sinnfrei.

                Keine Ahnung, das ist aus einer Scriptsammlung downgeloaded ...gedownloaded ... heruntergeladen.

                *g*

                Ich denke mal, daß soll wohl die Browserversion abfragen.

                Und genau die interessiert nicht im Mindesten. Auf die Fähigkeiten kommt es an, und die stehen nicht in der Browserversion.

                Ob das nun für meine Zwecke notwendig ist, weiß ich nicht (wenn 100 Leute mit Java-Kenntnissen in einem Raum sind, dann sind sicher 95 dabei, die mehr Ahnung von JavaScript haben als ich).

                Wenn in einem Raum 100 Leute mit Java-Kenntnissen sind, haben bestimmt 20 davon keinen Schimmer von JavaScript.

                Was meinst Du mit Klammersetzung?

                Blöcke sollte man nicht erst in der nächsten Zeile öffnen.

                Und bis zur Weiterleitung komme ich ja schon gar nicht.

                Mit Mozilla kam man da hin, und exakt dort behinderte die Weiterleitung die Analyse.

                Wozu eigentlich die Unterscheidung zwischen lokal und nicht lokal? Warum arbeitest Du nicht einfach auch bei Dir mit einem Server und in Folge dessen mit relativen URLs?
                Damit es auch zu Hause klappt. Ich habe keinen Server installiert.

                Genau das solltest Du ändern :-)

                Ich habe mich mal daran versucht (Apache) mit der Konsequenz, daß surftechnisch danach gar nichts mehr ging.

                Ich habe keine Ahnung, was da alles schief gelaufen sein muss. Von solchen Problemen habe ich noch nie etwas gehört. An sich ist die Installation eines lokalen Servers völlig trivial.

                Ich halte es für einfacher, zu Hause einfach die Variable auf "true" zu setzen.

                Nun ja, dadurch nimmst Du Mängel und Suboptimalitäten in Deinem Projekt in Kauf; beispielsweise wegen abwärtsrelativer statt rootrelativer URIs.

                Cheatah

                --
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    Die aufgerufene Funktion ist also im Extra-js-File, der Aufruf in der HTML-Datei?
    Dann könnte es ein Timing-Problem sein - die externe Datei ist zum Aufrufzeitpunkt vielleicht noch nicht geladen...

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    1. Hi,

      Die aufgerufene Funktion ist also im Extra-js-File, der Aufruf in der HTML-Datei?
      Dann könnte es ein Timing-Problem sein - die externe Datei ist zum Aufrufzeitpunkt vielleicht noch nicht geladen...

      Hm, das js-File ist 11kB groß (oder klein, je nachdem).
      Gut, ich könnte den Funktionsaufruf im HTML-File ans Ende setzen.
      Aber ist dann sichergestellt, daß die js-Datei eher geladen ist als der Funktionsaufruf erfolgt?
      Kann man das noch anderweitig beeinflussen?

      Ich habe hier einen T-LAN-Anschluß, an der Geschwindigkeit an sich sollte es also nicht liegen.

      Abgesehen davon, die js-Datei ist auch schon in einem Frame eingebunden, der als allererstes geladen wird, lange bevor die Funktion STFrames aufgerufen wird. Bis dahin sind es noch zwei Mausklicks.
      Ich würde das verstehen, wenn ich die Datei separat aufrufe (und dann funktioniert es auch manchmal nicht, daß oben der Link auf die Hauptseite erscheint mit dem automatischen Aufruf der vorher angezeigten Einelseite in einem Frame der Hauptseite).

      Gruß,
      Markus

      1. Hi,

        Hm, das js-File ist 11kB groß (oder klein, je nachdem).

        die Ressource ist damit ca. 15 KB groß, plus den gesamten Roundtrip.

        Aber ist dann sichergestellt, daß die js-Datei eher geladen ist als der Funktionsaufruf erfolgt?

        Das sollte eigentlich sowieso gewährleistet sein, Stichwort Synchronität. AFAIK hat damit auch nur der IE Probleme, wenn man nämlich ein <script src> durch JavaScript ausgibt. Dass Opera hier versagt, halte ich für ein Gerücht.

        Abgesehen davon, die js-Datei ist auch schon in einem Frame eingebunden, der als allererstes geladen wird, lange bevor die Funktion STFrames aufgerufen wird.

        Auch wenn das ein mehr als merkwürdiger Effekt wurde: Hast Du dieses Faktum mal geändert?

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          Das sollte eigentlich sowieso gewährleistet sein, Stichwort Synchronität. AFAIK hat damit auch nur der IE Probleme, wenn man nämlich ein <script src> durch JavaScript ausgibt. Dass Opera hier versagt, halte ich für ein Gerücht.

          Ich glaube auch nicht, daß es daran liegt. Aber die angegebene Fehlermeldung ist nur das Zitat der Meldung, wie sie von Opera ausgegeben wird.
          Vermutlich ist es was völlig profanes und ich sehe den Wald vor lauter Bäumen nicht.

          Abgesehen davon, die js-Datei ist auch schon in einem Frame eingebunden, der als allererstes geladen wird, lange bevor die Funktion STFrames aufgerufen wird.

          Auch wenn das ein mehr als merkwürdiger Effekt wurde: Hast Du dieses Faktum mal geändert?

          Bei einem Browserneustart und dem Direktaufruf der Seite, die den Fehler bringt, sollte das doch gewährleistet sein.
          Umgekehrt sollte die js-Datei auf jeden Fall geladen sein, wenn ich die Seite über den normalen Top-Down-Weg aufrufe.

          In beiden Fällen kommt die Meldung.

          Gruß,
          Markus

          1. Hallo Markus

            Vermutlich ist es was völlig profanes und ich sehe den Wald vor lauter Bäumen nicht.

            so ist es,

            hier ein Auszug aus dem Quelltext der HTML-Datei:

            <HEAD
            <SCRIPT LANGUAGE="JavaScript" SRC="../../javascripts.js" TYPE="text/javascript"></SCRIPT>

            merkst du die Ursache?

            Es ist übrigens eine gute Idee, auch bei Script-Fehlern den Validator zu bemühen. Nach Korrektur des Fehlers arbeitet der Browser wie erwartet.

            Viele Grüße

            Antje

            1. Hallo Markus

              <HEAD
              <SCRIPT LANGUAGE="JavaScript" SRC="../../javascripts.js" TYPE="text/javascript"></SCRIPT>

              merkst du die Ursache?

              Jupp, sag' ich doch. Danke.

              Es ist übrigens eine gute Idee, auch bei Script-Fehlern den Validator zu bemühen. Nach Korrektur des Fehlers arbeitet der Browser wie erwartet.

              Hm, auch wenn sich der W3C-Validator immer daran stört, daß ich keinen DOC-Type angegeben habe (und ich es mit dem Override der verschiedenen Typen mache), an dem fehlenden ">" stört er sich offenbar nicht.
              Zumindest bringt er mit und ohne ">" die gleichen Fehlermeldungen (je nach DOC-Type unterschiedlich, aber bei beiden Möglichkeiten  - mit und ohne ">" - immer die gleichen).

              Verwendest Du einen anderen Validator?

              Gruß,
              Markus

  3. Problem gelöst, ein fehlendes ">" war's.

    Danke an alle Beteiligten.

    Gruß,
    Markus

    PS:
    Weitergreifende Optimierungen mache ich später.