Stefan: Funktion aus Java-Applet nicht sofort verfügbar

Hallo,

ich habe zwei Probleme mit dem dynamischen einbinden eines Java-Applets mittels JavaScript:
Ich habe ein kleines Applet "geschrieben" (Quellcode zusammenkopiert und kompiliert), mit welchem ich die Version der JavaVM abfragen kann. Klappt an sich auch gut. Wenn ich dann bloß die Funktion aufrufe, bekomme ich die ersten paar male eine Fehlermeldung in Firefox, dass es die Funktion nicht gibt. Beim zweiten oder dritten mal klappt es dann. Woran liegt das?

Das ist der Code mit dem das Applet eingebunden wird:

function createjavaapplet(params, code, id, archive)
{
 var object = document.createElement("object");
 var par;
 if (navigator.appName=="Microsoft Internet Explorer") {
  object.setAttribute("classid","clsid:8AD9C840-044E-11D1-B3E9-00805F499D93");
  object.setAttribute("codebase","http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab");
  par = document.createElement("param");
  par.setAttribute("name","code");
  par.setAttribute("value",code);
  object.appendChild(par);
 }
 else {
  object.setAttribute("classid","java:"+code);
  object.setAttribute("type","application/x-java-applet");
  if(archive!="") object.setAttribute("archive",archive);
 }
 object.setAttribute("id",id);
 if(archive!="") {
  par = document.createElement("param");
  par.setAttribute("name","archive");
  par.setAttribute("value",archive);
  object.appendChild(par);
 }
 for(var i=0;i<params.length;i++) {
  par = document.createElement("param");
  par.setAttribute("name",params[i][0]);
  par.setAttribute("value",params[i][1]);
  object.appendChild(par);
 }
 return object;
}

function button1()
{
 var jver = createjavaapplet(new Array(new Array("codebase","./")), "jversion.class", "jver", "");
 var main = document.getElementById("main");
 main.appendChild(jver);
}

function button2()
{
 jver = document.getElementById("jver");
 alert("getJavaVersion():"+jver.getJavaVersion()
  +"\ngetJavaVendor():"+jver.getJavaVendor()
  +"\ngetJavaVMVersion():"+jver.getJavaVMVersion()
  +"\ngetJavaVMVendor():"+jver.getJavaVMVendor()
  +"\ngetJavaVMName():"+jver.getJavaVMName()
 );
}

Wenn ich nun button1() mache wird das Applet gestartet (was auch in der Statuszeile von FF steht), beim klicken auf button2() gibt es nun aber die ersten ein-zwei Male eine Fehlermeldung (keine direkte, aber er zeigt JavaScript-Fehler an das die Funktion getJavaVersion() nicht existiert), aber danach bekomme ich die MessageBox wie erwartet. Woran liegt das?

Meine zweite Frage: Opera und IE laden irgendwas, aber anscheinend starten sie nicht Java. Wo liegt hier das Problem?

Wenn ich es fest einbinde klappt es im FF sofort, IE und Opera laden das Applet, kennen aber die Funktionen nicht.

Ich habe mich beim einbinden an diese Seite gehalten:
http://ww2.cs.fsu.edu/~steele/XHTML/appletObject.html

Kann mir damit jemand weiterhelfen?

Viele Grüße,
Stefan

  1. Moin Moin!

    Suchbegriff: Liveconnect

    Aus leidiger Erfahrung vor einigen Jahren: Java-Applets und Javascript arbeiten in verschiedenen Browsern unterschiedlich gut zusammen. Mal funktioniert die Kommunikation in beiden Richtungen, mal nur mit Methodenaufrufen aus JS ins Applet hinein, mal nur mit JS-Aufrufen aus dem Applet heraus (über openURL("javascript:locheDenFuss('kaboom!')") oder ähnliche Krücken). Dazu kommt speziell beim IE noch das nette Extra, dass sich die VMs von MS und von Sun extrem unterschiedlich verhalten. Und es gibt definitiv eine Verzögerung zwischen dem Zeitpunkt, wo JS das Applet als Objekt sieht und dem Zeitpunkt, wo das Applet wirklich aufrufen kann.

    Ich habe mir damals mit einigen Timeouts, Polling und wechselseitigen Callbacks geholfen, insgesamt war das aber sehr unbefriedigend.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Hallo Alexander,

      ich will ja gar nichts kompliziertes, alles was ich will ist wissen welche Version von Java installiert ist. Das ist nur eine Richtung, ohne Parameterübergabe und alles. Das Problem scheint aber irgendwo schon in der dynamischen Einbindung des Applets durch JavaScript zu liegen, die nur im FF funktioniert bis jetzt.

      Ich habe mal nach LiveConnect gesucht, doch alles was ich finde sind Beispiele mit drei Zeilen wie toll das geht von vor vielen Jahren. Gibt es irgendwo umfangreichere Informationen wo auch auf Probleme und Unterschiede einzelner Browser eingegangen wird (nicht IE 4.0 und NN 4.7)?

      Viele Grüße,
      Stefan

  2. Hallo Stefan,

    ich habe zwei Probleme mit dem dynamischen einbinden eines Java-Applets mittels JavaScript:

    ja, ging mir auch so. Ich habe tagelang rumprobiert bis es endlich im IE, FF und Opera lief.

    Am stabilsten läuft das Ansprechen über document.NameDesApplets
    Allerdings musst du beim Zugriff auch eine Unterscheidung treffen.

    if(typeof(document.applets["foo"]) != "undefined")  
      irgendwas=document.applets["foo"].getIrgendwas();  
    else if(typeof(document.foo) != "undefined")  
      irgendwas=document.foo.getIrgendwas();  
    else  
      ...
    

    Klick auf den Link in der Signatur und guck dir im Quelltext "getData()" an.
    Das Applet ist über ein externes Javascript eingebunden.

    Ich hoffe es hilft dir weiter.
    Grüße,

    Jochen

    --
    Kritzeln statt texten:
    Scribbleboard
    1. Hallo Jochen,

      Am stabilsten läuft das Ansprechen über document.NameDesApplets
      Allerdings musst du beim Zugriff auch eine Unterscheidung treffen.

      if(typeof(document.applets["foo"]) != "undefined")

      irgendwas=document.applets["foo"].getIrgendwas();
      else if(typeof(document.foo) != "undefined")
        irgendwas=document.foo.getIrgendwas();
      else
        ...

      
      >   
      > Klick auf den Link in der Signatur und guck dir im Quelltext "getData()" an.  
      > Das Applet ist über ein [externes Javascript](http://www.electric-lemon.de/applet.js) eingebunden.  
        
      Habe ich ausprobiert, klappt leider gar nicht im FF. document.applets ist leer und document.jver ist nicht definiert. Wahrscheinlich gehen die Funktionen nicht mit XHTML.  
      Im IE und Opera (nur 8, nicht 9) geht dieser Zugriff (aber das dynamische einbinden nicht).  
      Ich sehe im Endergebnis keinen Unterschied in der Art wie das Applet eingebunden wird (nur im Weg), leider klappt das weder im IE noch Opera.  
      In Opera 9 habe ich es überhaupt noch nicht hinbekommen auf das Applet zuzugreifen.  
        
      Viele Grüße,  
      Stefan
      
      1. In Opera 9 habe ich es überhaupt noch nicht hinbekommen auf das Applet zuzugreifen.

        Korrektur: Das war eine Beta-Version von Opera 9, die auch mit deiner Seite nicht ging, die aktuelle (9.26) verhält sich wie Opera 8.

      2. Hi Stefan,

        klappt leider gar nicht im FF. document.applets ist leer und document.jver ist nicht definiert. Wahrscheinlich gehen die Funktionen nicht mit XHTML.

        kann ich mir nicht vorstellen. Hast du etwas online? Dann guck ich mal rein.

        Grüße, Jochen

        --
        Kritzeln statt texten:
        Scribbleboard
        1. Hi Jürgen,

          kann ich mir nicht vorstellen. Hast du etwas online? Dann guck ich mal rein.

          Die Seite ist noch nicht online, ich schick dir gleich Zugangsdaten per Mail.
          Vielen Dank für deine Mühe.

          Viele Grüße,
          Stefan

          1. Hi Stefan,

            Die Seite ist noch nicht online, ich schick dir gleich Zugangsdaten per Mail.

            *hmpf* das sieht ja grausam aus. Sorry, aber da habe ich keinen Nerv mich durchzuwühlen. So ein winziges, auf das allernötigste reduziert wäe schick.

            Etwas in der Art: http://www.electric-lemon.de/self/testcase.html

            Die Verbindung Java -> Javascript klappt wirklich problemlos in allen aktuellen Browsern. Das beweist der obige Link.

            Vielen Dank für deine Mühe.

            Naja, die Mühe musst du dir jetzt bei der Fehlersuche machen.

            Grüße, Jochen (nicht Jürgen)

            --
            Kritzeln statt texten:
            Scribbleboard
            1. Hi Jochen (entschuldigung für die Namensverwechslung),

              *hmpf* das sieht ja grausam aus. Sorry, aber da habe ich keinen Nerv mich durchzuwühlen. So ein winziges, auf das allernötigste reduziert wäe schick.

              Etwas in der Art: http://www.electric-lemon.de/self/testcase.html

              Das funktioniert bei mir leider nirgendwo (es gibt bei in allen Browsern die Ausgabe "bullshit").

              Die Verbindung Java -> Javascript klappt wirklich problemlos in allen aktuellen Browsern. Das beweist der obige Link.

              ...nicht

              Ich habe jetzt zwei Dateien gemacht (fast identisch, aber IE kann kein echtes XHTML, sind komplett selbstständig (bis auf das Applet)):
              http://test.souly-music.de/liveconnect.xhtml
              http://test.souly-music.de/liveconnect.html

              Die Abfrage des statischen Applets funktioniert jetzt in allen Browsern immer.
              Die Abfrage des dynamisch erzeugten Applets klappt in Firefox manchmal (manchmal auf Anhieb, manchmal nach 10 Klicks oder auch gar nicht).
              In IE wird es nicht einmal richtig erzeugt (die Darstellung ist wie ein Bild das noch nicht geladen wurde), gibt es da einen Trick mit dem ich dem IE sagen soll er muss es auch starten? In Opera bin ich mir nicht sicher, die Abfrage geht aber nicht.

              Viele Grüße,
              Stefan

              1. Hi,

                Das funktioniert bei mir leider nirgendwo (es gibt bei in allen Browsern die Ausgabe "bullshit").

                sorry, ich hab da wohl etwas (im Applet) geschludert. Aber das W-Lan hier im Hotel ist katastrophal. Ich guck morgen was da schief läuft.

                Grüße,

                Jochen

                --
                Kritzeln statt texten:
                Scribbleboard
              2. Hi Stefan,

                Das funktioniert bei mir leider nirgendwo (es gibt bei in allen Browsern die Ausgabe "bullshit").

                so, jetzt aber ...
                http://www.electric-lemon.de/self/testcase.html

                http://test.souly-music.de/liveconnect.xhtml

                wird als "Content-Type: application/xhtml+xml" ausgeliefert. Bist du sicher, dass du das willst? Welche Vorteile bringt dir das?

                Grüße,

                Jochen

                --
                Kritzeln statt texten:
                Scribbleboard
                1. Hi Jochen,

                  so, jetzt aber ...
                  http://www.electric-lemon.de/self/testcase.html

                  Das Applet ist statisch in der Seite und wird nicht dynamisch erzeugt. Statisch klappt es bei mir auch (oder geht meine Test-Seite bei dir nicht?).

                  http://test.souly-music.de/liveconnect.xhtml

                  wird als "Content-Type: application/xhtml+xml" ausgeliefert. Bist du sicher, dass du das willst? Welche Vorteile bringt dir das?

                  Ja, das ist beabsichtigt. Denn nur so schaltet Firefox in den echten Standard-Modus, auch bei gültigem XHTML-Doctype der als text/html ausgeliefert wird, wird die Seite leicht abweichend gerendert als mit application/xhtml+xml.
                  Seitdem ich damit einmal Probleme habe liefere ich als application/xhtml+xml aus (außerdem ist mir aufgefallen, wird die Seite gerade auf langsameren Rechnern schneller gerendert, dafür ist bereits ein Fehler in der XML-Syntax unverzeihlich und man kriegt nur eine Fehlermeldung wo das Parsen abgebrochen wurde). Natürlich habe ich sonst alles dynamisch in PHP und es wird geprüft ob der Browser ein "Accept: application/xhtml+xml" gesendet hat (nur Gecko-Browser und Opera glaub ich), sonst kriegt er "text/html" und die Seite auch ohne XML-Header (die den IE6 in den Quirks-Mode springen lässt).

                  Viele Grüße,
                  Stefan

                  1. Hi Stefan,

                    geht meine Test-Seite bei dir nicht?

                    Als ich den Sinn der vielen Buttons so langsam durchblickte ..... jaaah, annähernd.

                    Das Applet ist statisch in der Seite und wird nicht dynamisch erzeugt

                    muss es denn dynamisch sein? Warum? Ich hab noch ein wenig gebastelt, allerdings ist mir das rumgepopel mit create und append viel zu umständlich gewesen. Ich habe es wieder verworfen. Herausgekommen ist das:

                    http://www.electric-lemon.de/self/testcase.html

                    Grüße,

                    Jochen

                    --
                    Kritzeln statt texten:
                    Scribbleboard
                    1. Hi Jochen,

                      Als ich den Sinn der vielen Buttons so langsam durchblickte ..... jaaah, annähernd.

                      Ich dachte die seien selbsterklärend

                      muss es denn dynamisch sein? Warum? Ich hab noch ein wenig gebastelt, allerdings ist mir das rumgepopel mit create und append viel zu umständlich gewesen. Ich habe es wieder verworfen. Herausgekommen ist das:

                      http://www.electric-lemon.de/self/testcase.html

                      Ja, es sollte schon dynamisch sein, da ich das Applet starte, die Version von Java feststelle und dann entsprechend fortfahre.
                      Ich hab jetzt ein Workaround mit inner/outerHTML für den IE gebaut der sehr gut funktioniert. Das Firefox-Verhalten bekomme ich aber nicht in den Griff und in Opera funktioniert auch deine Version leider nicht.

                      Viele Grüße,
                      Stefan

                      1. Hi Stefan,

                        Das Firefox-Verhalten bekomme ich aber nicht in den Griff

                        komisch ... das liegt dann aber an deiner Firefox und/oder Javaversion bzw. dem Zusammenspiel der beiden. Oder ist ähnlich wie in der Version mit Opera. Probiere einmal die Timeout-Variante aus.

                        und in Opera funktioniert auch deine Version leider nicht.

                        Hmmm, anscheinend nicht immer. Aber hier hat ein window.setTimeout() nach dem dynamischen einbinden und dann erst auslesen der Versionsinfo geholfen.

                        Grüße, Jochen

                        --
                        Kritzeln statt texten:
                        Scribbleboard
                        1. Hi Jochen,

                          komisch ... das liegt dann aber an deiner Firefox und/oder Javaversion bzw. dem Zusammenspiel der beiden. Oder ist ähnlich wie in der Version mit Opera. Probiere einmal die Timeout-Variante aus.

                          Ich hatte erst Java 1.5 installiert, dann auf 1.6 upgedated, hat sich nichts geändert. Ich habs auf zwei Rechnern ausprobiert: Genau das gleiche.
                          Ich hab es jetzt mit timeout probiert, selbst bei 5 Sekunden noch keine sichere Antwort. Das ist keine Lösung. Gibt es nicht irgendeinen Trick wie man ihn dazu bewegen kann das Applet neu zu starten oder so, vielleicht hilft das?

                          Hmmm, anscheinend nicht immer. Aber hier hat ein window.setTimeout() nach dem dynamischen einbinden und dann erst auslesen der Versionsinfo geholfen.

                          Bei mir scheitert das dynamische Einbinden bereits. Anstelle eines Applets gibt es nur einen grauen Kasten.

                          Viele Grüße,
                          Stefan

                          1. Sorry Stefan,
                            dann bin ich ratlos. Ich muss mich an dieser Stelle ausklinken ...

                            Grüße, Jochen

                            --
                            Kritzeln statt texten:
                            Scribbleboard
                            1. Hi Jochen,

                              ich habe vorhin durch Zufall die Lösung gefunden:
                              Nicht das Applet als Object dynamisch einbinden, sondern eine Seite die das Applet enthält dynamisch als Object einbinden!
                              Funktioniert problemlos in Firefox und Opera.

                              Hat nur noch einen Haken: Wie bekomme ich Opera dazu diese Seite ohne Seitenränder/Abstände und ohne Scrollbars einzubinden? Ich habe überall (!) "margin: 0; padding: 0; overflow: hidden;" gemacht. Interessiert Opera aber nicht, macht weiterhin Abstände und Scrollbars. Firefox hingegen macht es dann richtig.

                              Viele Grüße,
                              Stefan

                              1. Ich hab das mit Opera noch hinbekommen mit "position: absolute".

                                Ich hänge jetzt allerdings an einem Problem fest:
                                Es dauert natürlich ein paar Millisekunden, bis die Seite (Object) geladen wird. Ich kann aber erst richtig darauf zugreifen, wenn sie fertig geladen ist.

                                Ich habe mir mal eben sowas überlegt:

                                  
                                timer.setMilliseconds(0);  
                                while (timer.getMilliseconds()<800)  
                                {  
                                 if(document.getElementById("jvt").contentDocument!=null) break;  
                                }
                                

                                Das klappt aber nicht, da der Browser so sehr mit der Ausführung dieses Codes beschäftigt ist, dass er die Seite nicht lädt.
                                Ich brauche was, das alle 100ms abfragt ob die Seite schon da ist. Da gibt es ja setIntervall. Das macht aber sofort weiter, das ist blöd. Ich habe ja eine Funktion mit einem Rückgabewert, die muss warten bis der Wert da ist, ich weiß nicht wie ich mir da mit setIntervall helfen soll. Hat da jemand eine Idee?

                                Viele Grüße,
                                Stefan

                    2. muss es denn dynamisch sein? Warum? Ich hab noch ein wenig gebastelt, allerdings ist mir das rumgepopel mit create und append viel zu umständlich gewesen. Ich habe es wieder verworfen. Herausgekommen ist das:

                      Mir ist gerade noch was aufgefallen für dynamische Einbindung: Im IE7 startet er fest eingebundene Applets erst nach einem Klick drauf (hängt wohl mit diesem Patentstreit zusammen). Das ist sehr unpraktisch, insbesondere vor dem Hintergrund das man das Applet gar nicht sehen sollte.