ruben: Onload im Frame in Opera

Hallo!

Ich habe versucht, meine Web-Site dazu zu bringen, in Opera zu funktionieren.
Mir ist es gelungen, das Problem zu identifizieren, aber wie ich es jetzt lösen soll, ist mir schleierhaft.

Folgendes: Eine Seite in einem Frameset (ja, es muss.) soll onload eine Initialisierungsfunktion ausführen. Das funktioniert in Firefox und Safari (
window.onload=init
und <body onload="init()">
)
. Im Opera funktioniert es nur, wenn ich die Seite außerhalb des Framesets lade, oder aber (entgegen der Empfehlungen, die ich fand) Klammern hinter die Funktion setze:
window.onload=init()
Das bringt nun aber merkwürdigerweise mit sich, dass (weder in FF noch in Opera) irgendwelche Dokumenteigenschaften gelesen werden können. Der Fehler der auftritt, sobald die Funktion versucht etwas auf der document.-Ebene zu ändern, tritt nicht auf, wenn ich die Klammern weglasse. alert() und andere Sachen, die nicht auf document./Unter-Ebene stattfinden, funktionieren.

Ich begreife das nicht. Kann jemand mit etwas mehr Erfahrung mir das Verhalten erklären? Ich bin auch hierauf nur in 4-stündiger trial and error-Herangehensweise gekommen und finde auch keine vernünftige Seite zur Opera-Auslegung von JS (die Ausnahmen, auf die ich bisher gestoßen bin, sind nicht in selfHTML dokumentiert).

Vielen Dank,
Ruben

  1. Hallo,

    … oder aber (entgegen der Empfehlungen, die ich fand) Klammern hinter die Funktion setze:
    window.onload=init()
    Das bringt nun aber merkwürdigerweise mit sich, dass (weder in FF noch in Opera) irgendwelche Dokumenteigenschaften gelesen werden können. Der Fehler der auftritt, sobald die Funktion versucht etwas auf der document.-Ebene zu ändern, tritt nicht auf, wenn ich die Klammern weglasse. alert() und andere Sachen, die nicht auf document./Unter-Ebene stattfinden, funktionieren.

    So, wie du es gemacht hast (also ohne Klammern), ist es in diesem Fall auch richtig. Wenn du die Funktion mit Klammern schreibst, wird sie nämlich sofort ausgeführt. Deshalb kannst du auch nicht viel aus deinem document lesen. Beispiel:

    ########

      
    Doctype  
    <html>  
    <head>  
    <script type="text/javascript">  
    function init(){  
    document.getElementById("deineID").…  
    }  
    window.onload = init()  
    
    ~~~########  
      
    Bis hierher wird die Datei vorerst geladen. Jetzt versucht der Browser die Funktion auszuführen um einen eventuellen Rückgabewert von init() zu erhalten. Aber was macht diese? Sie versucht ein, zu diesem Zeitpunkt noch nicht vorhandenes Element zu referenzieren.  
      
    Damit das nicht passiert, gibt es 2 spezielle Schreibweisen.  
    ~~~javascript
      
    window.onload = funktionsname  
    window.onload = function(){/*beliebiger JS-Code, der erst ausgeführt wird, wenn event in Kraft tritt*/}  
    
    

    Zu deinem Opera/Frame - Problem kann ich dir aber nichts sagen, da ich Frames zwar auch mal verwendest habe, zu dieser Zeit jedoch kein JS konnte.

    Müssen es denn *unbedingt* frames sein? Es gibt doch genug - deutlich bessere - Alternativen.

    mfg. Daniel

    1. Doctype
      <html>
      <head>
      <script type="text/javascript">
      function init(){
      document.getElementById("deineID").…
      }
      window.onload = init()

      
      >   
      > Bis hierher wird die Datei vorerst geladen. Jetzt versucht der Browser die Funktion auszuführen um einen eventuellen Rückgabewert von init() zu erhalten. Aber was macht diese? Sie versucht ein, zu diesem Zeitpunkt noch nicht vorhandenes Element zu referenzieren.  
      >   
      > Damit das nicht passiert, gibt es 2 spezielle Schreibweisen.  
      > ~~~javascript
        
      
      > window.onload = funktionsname  
      > window.onload = function(){/*beliebiger JS-Code, der erst ausgeführt wird, wenn event in Kraft tritt*/}  
      > 
      
      

      Ok, das erklärt so manches, da ich das bisher nicht wusste und dachte, die Schreibweisen wären äquivalent.

      Zu deinem Opera/Frame - Problem kann ich dir aber nichts sagen, da ich Frames zwar auch mal verwendest habe, zu dieser Zeit jedoch kein JS konnte.

      Müssen es denn *unbedingt* frames sein? Es gibt doch genug - deutlich bessere - Alternativen.

      Fürs erste müssen es Frames sein wegen Rückwärtskompatibilität. Wenn sich die Zeiten ändern, dann ändert sich auch der Code.
      Hast du denn eine Ahnung, wo das Problem wurzelt? Anscheinend ja im Frame, genauer: Vermutlich im HTML-Quellcode des Framesets, denn da ist kein JS drin (außer im No-Frame-Bereich und dasselbe Script ist auch in der Frame-Seite) und was CSS damit zu tun haben sollte, weiß ich wirklich nicht.
      Oder aber es liegt an der Zugriffstruktur, dass die Seite aus irgendeinem Grund nicht auf das Objekt window zugreifen darf, wenn es im Frame liegt. Dann weiß ich aber wiederum nicht, wieso der Code funktioniert, sobald man eine Vokabel auf einer anderen Seite eingegeben hat...
      Hat jemand eine Idee für ein Workaround?

      Vielen Dank,
      Ruben

      1. Hallo,

        Müssen es denn *unbedingt* frames sein? Es gibt doch genug - deutlich bessere - Alternativen.
        Fürs erste müssen es Frames sein wegen Rückwärtskompatibilität. Wenn sich die Zeiten ändern, dann ändert sich auch der Code.

        Rückwärtskompatiblität mit Frames? Das hört sich für mich aber ziemlich paranoid an. Frames müssen ja im Gegensatz zu serverseitigen includes von Browser unterstützt werden.
        Wenn du also abwärtskompatibel schreiben willst, sind Frames eben *nicht* DIE Lösung.

        Und wenn du dich mit Suchmaschinen gut stellen willst, musst du ebenfalls auf Frames verzichten.

        Mal andersherum gefragt: Was kannst du ohne Frames in welchen Browsern nicht lösen?

        mfg. Daniel

        1. Mal andersherum gefragt: Was kannst du ohne Frames in welchen Browsern nicht lösen?

          Ein Javascript, das Daten verarbeitet und die Ergebnisse in eine Datenbank speichert ohne neu zu laden.
          Das geht mit Ajax, aber DA muss ich mir ja wohl Kompatibilitätssorgen machen.

          Gruß,
          Ruben

          1. Hallo,

            Mal andersherum gefragt: Was kannst du ohne Frames in welchen Browsern nicht lösen?
            Ein Javascript, das Daten verarbeitet und die Ergebnisse in eine Datenbank speichert ohne neu zu laden.
            Das geht mit Ajax, aber DA muss ich mir ja wohl Kompatibilitätssorgen machen.

            So schlecht, ist die Unterstützung durch die Browser doch gar nicht mehr…

            Statt Frames zu verwenden, könntest du doch auch alle Browser herausfiltern, die kein AJAX können und nur dort dafür sorgen, dass die Seite jeweils neu geladen wird.

            mfg. Daniel

            1. So schlecht, ist die Unterstützung durch die Browser doch gar nicht mehr…

              Statt Frames zu verwenden, könntest du doch auch alle Browser herausfiltern, die kein AJAX können und nur dort dafür sorgen, dass die Seite jeweils neu geladen wird.

              Deal! Aber bis dahin (große Umstellung) kann ein Kumpel von mir die Seite nicht verwenden, aufgrund eines Fehlers, den es gar nicht gibt.

  2. Hallo,

    Folgendes: Eine Seite in einem Frameset (ja, es muss.) soll onload eine Initialisierungsfunktion ausführen. Das funktioniert in Firefox und Safari (
    window.onload=init
    und <body onload="init()">
    )
    . Im Opera funktioniert es nur

    *Was* funktioniert? Was macht die Initialisierungsfunktion genau? → Tipps für Fragende

    wenn ich die Seite außerhalb des Framesets lade, oder aber (entgegen der Empfehlungen, die ich fand) Klammern hinter die Funktion setze:

    Das Aufrufen einer Funktion beim onload funktioniert im Opera durchaus, auch in Frame-Dokumenten. Der Fehler muss woanders liegen, zeige am besten mal den restlichen relevanten Code.

    window.onload=init()
    Das bringt nun aber merkwürdigerweise mit sich, dass (weder in FF noch in Opera) irgendwelche Dokumenteigenschaften gelesen werden können.

    Das ist logisch, siehe das andere Posting.

    Mathias

    1. Hallo Mathias,

      Das ist irrelevant, da er die Init-Funktion nicht anrührt. Wenn er sie dann aber anrührt, läuft sie durch und funktioniert wie erwartet.
      Die init-Funktion setzt den Vokabeltrainer in Bewegung, es ist relativ kompliziert.
      Aber das selbe Problem tritt auch dann noch auf, wenn außer
      window.onload=init;
      function init() {
      alert();
      }
      nichts im JS-file steht. Deswegen gehe ich mal davon aus, dass es nicht an dem nachfolgenden Code liegt.
      Es könnte an der HTML-datei liegen, ich wüsste aber gar nicht, wo ich da suchen soll, da JS und HTML soweit separat sind.

      Vielen Dank,
      Ruben

      1. Aber das selbe Problem tritt auch dann noch auf, wenn außer
        window.onload=init;
        function init() {
        alert();
        }
        nichts im JS-file steht. Deswegen gehe ich mal davon aus, dass es nicht an dem nachfolgenden Code liegt.

        Das kann Opera (von welchem sprechen wir eigentlich?) ohne Probleme, was das jetzt mit Frames zu tun hat, wird aber nciht deutlich.

        Es könnte an der HTML-datei liegen, ich wüsste aber gar nicht, wo ich da suchen soll, da JS und HTML soweit separat sind.

        evtl. die Fehlerkonsole?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Das kann Opera (von welchem sprechen wir eigentlich?) ohne Probleme, was das jetzt mit Frames zu tun hat, wird aber nciht deutlich.

          Der Zusammenhang zu Frames: Wenn ich die Seite mit diesem Script in einem Frameset habe, wird die onload-Funktion nicht ausgeführt. Nehme ich die Seite ohne Frameset, dann wird sie ausgeführt.

          Es könnte an der HTML-datei liegen, ich wüsste aber gar nicht, wo ich da suchen soll, da JS und HTML soweit separat sind.
          evtl. die Fehlerkonsole?

          Nix drin, außer Google-Ads.
          Live: http://vok.jonkerz.com/testit.php?lang=de]SS

          Danke,
          Ruben

          1. Das kann Opera (von welchem sprechen wir eigentlich?) ohne Probleme, was das jetzt mit Frames zu tun hat, wird aber nciht deutlich.
            Der Zusammenhang zu Frames: Wenn ich die Seite mit diesem Script in einem Frameset habe, wird die onload-Funktion nicht ausgeführt. Nehme ich die Seite ohne Frameset, dann wird sie ausgeführt.

            Hast du mal getest ob die Funktionen überhaupt existieren?
            onload="alert(init)"

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hast du mal getest ob die Funktionen überhaupt existieren?
              onload="alert(init)"

              Hatte ich nicht. Tut sie nicht im Frameset, ohne schon.
              Es gibt aber Beispiele von Funktionen, die in Framesets onload aufgerufen werden (auch in selfhtml). Ich komme wohl nicht umhin, die Seite zu zerstückeln bis ich den Haken gefunden habe.

              Vielen Dank,
              Ruben

              1. Hast du mal getest ob die Funktionen überhaupt existieren?
                onload="alert(init)"
                Hatte ich nicht. Tut sie nicht im Frameset, ohne schon.

                Das Interessante wäre gewesen, was das alert() ausgibt.

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Das Interessante wäre gewesen, was das alert() ausgibt.

                  Außerhalb des Framesets halt die Funktion (kompletten Text), innerhalb nichts bzw. undefined.

                  Gruß,
                  Ruben

                  1. Das Interessante wäre gewesen, was das alert() ausgibt.
                    Außerhalb des Framesets halt die Funktion (kompletten Text), innerhalb nichts bzw. undefined.

                    In dem Frameset ist die Funktion auch nicht existent (aber nicht nur im Opera sondern auch allen andernen Browsern), du müßtests eigentlich mit parent.ini() darauf zugrifen

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. In dem Frameset ist die Funktion auch nicht existent (aber nicht nur im Opera sondern auch allen andernen Browsern), du müßtests eigentlich mit parent.ini() darauf zugrifen

                      Missverständnis, großes!
                      Sorry, ich weiß, dass das funktioniert. Meine Struktur funktioniert sogar in bestimmten Beispielen. Aber mein bestimmtes Dokument funktioniert nicht.
                      Meine Struktur:
                      frameset enthält frame1 und frame2 (frame 2 übrigens 0 groß, unsichtbar)

                      frame1 enthält eine Funktion, die onload aufgerufen wird. Diese Funktion bezieht sich weder auf frame2 noch auf das Frameset. Deswegen verwundert es mich ja so.

                      Ich hab aber jetzt keine Lust, dem Fehler in meinem eigentlich validen Dokument hinterherzujagen, da das merkwürdige Betragen von Opera (Wenn eine JS-Funktion ausgeführt wurde, funktionieren alle, innerhalb des Framesets anderes Verhalten als außerhalb, obwohl das Frameset nicht relevant ist.) nicht wirklich auf einen Fehler meinerseits hindeutet.
                      Die Seite geht eh nochmal durch ein Remake, also lassen wir's für's Erste.

                      1. frame1 enthält eine Funktion, die onload aufgerufen wird. Diese Funktion bezieht sich weder auf frame2 noch auf das Frameset. Deswegen verwundert es mich ja so.

                        Mich auch, da meine Operas keine Probleme damit haben.

                        Ich hab aber jetzt keine Lust, dem Fehler in meinem eigentlich validen Dokument hinterherzujagen, da das merkwürdige Betragen von Opera (Wenn eine JS-Funktion ausgeführt wurde, funktionieren alle, innerhalb des Framesets anderes Verhalten als außerhalb, obwohl das Frameset nicht relevant ist.) nicht wirklich auf einen Fehler meinerseits hindeutet.

                        Validität hat nichts mit JS zu tun. Das ganze deutet sehr wohl auf einen Fehler hin.
                        Da du nur deine komplette Seite gezeigt hast und keinen Testcase läßt sich der Fehler nur schwer eingrenzen, auf der Seite sind soviele Skripte (evtl. funken die google Sachen auch dazwischen), du solltest bei sowas versuchen den Fehler zu lokalisieren.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                        1. Ich hab aber jetzt keine Lust, dem Fehler in meinem eigentlich validen Dokument hinterherzujagen, da das merkwürdige Betragen von Opera (Wenn eine JS-Funktion ausgeführt wurde, funktionieren alle, innerhalb des Framesets anderes Verhalten als außerhalb, obwohl das Frameset nicht relevant ist.) nicht wirklich auf einen Fehler meinerseits hindeutet.

                          Validität hat nichts mit JS zu tun. Das ganze deutet sehr wohl auf einen Fehler hin.
                          Da du nur deine komplette Seite gezeigt hast und keinen Testcase läßt sich der Fehler nur schwer eingrenzen, auf der Seite sind soviele Skripte (evtl. funken die google Sachen auch dazwischen), du solltest bei sowas versuchen den Fehler zu lokalisieren.

                          Wenn du meinst, dass es auf einen behebbaren Fehler hinausläuft, dann werd ich mich mal auf die Suche machen.
                          Das mit dem UTF-8 versteh ich nicht ganz, was sind denn für ungültige Zeichen im JS?
                          Ich werd mal versuchen, das herauszufinden, aber letztendlich stell ich eh die gesamte Seite um, von daher lässt mein Enthusiasmus zu wünschen übrig ..

                          Vielen Dank für die Hilfe,
                          Ruben

                          1. Das mit dem UTF-8 versteh ich nicht ganz, was sind denn für ungültige Zeichen im JS?

                            Deine JS Dateien sind als UTF-8 abgespeichert
                            http://vok.jonkerz.com/abfrage.js
                            Windows pappt in dem Fall drei Zeichen an den Anfang der Datei () wenn der Browser damit nicht umgehen kann, dann erkennt er nur sinnlose Zeichen.

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                      2. Ich hab aber jetzt keine Lust, dem Fehler in meinem eigentlich validen Dokument hinterherzujagen, da das merkwürdige Betragen von Opera (Wenn eine JS-Funktion ausgeführt wurde, funktionieren alle, innerhalb des Framesets anderes Verhalten als außerhalb, obwohl das Frameset nicht relevant ist.) nicht wirklich auf einen Fehler meinerseits hindeutet.

                        eins hab ich schon mal gefunden, du hast die JS Dateien in UTF-8 abgespeichert evtl. hat Opera damit Probleme, da dadurch auch ungültige Zeichen in der Datei sind, die eigentlich einen Fehler erzeugen sollten.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                  2. so ich hab mal einen Test geschrieben: http://javascript.jstruebig.de/test/test iframe.html
                    ein iframe das eine Funktion im Hauptfenster nach dem laden aufruft, funktioniert in OP 7,8 und 9.

                    Ich gehe also davon aus, dass du einen Fehler machst oder eine noch ältere Opera Version hast.

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)