Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wait for a Java applet to finish loading on Safari?

This doesn't work in Safari:

<html>
<body>
<applet id="MyApplet" code="MyAppletClass" archive="MyApplet.jar">
<script type="text/javascript">
   alert(document.getElementById('MyApplet').myMethod);
</script>
</body>
</html>

myMethod is a public method declared in MyAppletClass.

When I first load the page in Safari, it shows the alert before the applet has finished loading (so the message box displays undefined) . If I refresh the page, the applet has already been loaded and the alert displays function myMethod() { [native code] }, as you'd expect.

Of course, this means that the applet methods are not available until it has loaded, but Safari isn't blocking the JavaScript from running. The same problem happens with <body onLoad>.

What I need is something like <body onAppletLoad="doSomething()">. How do I work around this issue?

PS: I'm not sure if it's relevant, but the JAR is signed.

like image 816
Pedro d'Aquino Avatar asked Aug 18 '09 11:08

Pedro d'Aquino


People also ask

Does Safari support Java applets?

While Java is supported on Safari for Mac, it's not supported on Safari for iOS (that is, for iPhone or iPad).

How do I fix applet error loading?

Re-launch the web browser. Go to the Java applet. When the "Security Warning" window asking "Do you want to run this application?" appears, if there is a "I accept the risk and want to run this app." option, checkmark it ON first then --> Click the "Run" button. The Java applet should load OK now.


3 Answers

I use a timer that resets and keeps checking a number of times before it gives up.

<script language="text/javascript" defer>

function performAppletCode(count) {
    var applet = document.getElementById('MyApplet');

    if (!applet.myMethod && count > 0) {
       setTimeout( function() { performAppletCode( --count ); }, 2000 );
    }
    else if (applet.myMethod) {
       // use the applet for something
    }
    else {
       alert( 'applet failed to load' );
    }
}  

performAppletCode( 10 );

</script>               

Note that this assumes that the applet will run in Safari. I've had some instances where an applet required Java 6 that simply hangs Safari even with code similar to the above. I chose to do browser detection on the server and redirect the user to an error page when the browser doesn't support the applet.

like image 151
tvanfosson Avatar answered Oct 20 '22 20:10

tvanfosson


Here is a generic function I wrote to do just this:

/* Attempt to load the applet up to "X" times with a delay. If it succeeds, then execute the callback function. */
function WaitForAppletLoad(applet_id, attempts, delay, onSuccessCallback, onFailCallback) {
    //Test
    var to = typeof (document.getElementById(applet_id));
    if (to == "function") {
        onSuccessCallback(); //Go do it.
        return true;
    } else {
        if (attempts == 0) {
            onFailCallback();
            return false;
        } else {
            //Put it back in the hopper.
            setTimeout(function () {
                WaitForAppletLoad(applet_id, --attempts, delay, onSuccessCallback, onFailCallback);
            }, delay);
        }
    }
}

Call it like this:

WaitForAppletLoad("fileapplet", 10, 2000, function () {
    document.getElementById("fileapplet").getDirectoriesObject("c:/");
}, function () {
    alert("Sorry, unable to load the local file browser.");
});
like image 28
Chris Chubb Avatar answered Oct 20 '22 20:10

Chris Chubb


I had a similar problem some time ago and adding MAYSCRIPT to the applet tag solved my problem.

Take a peek at this page: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

Hope it helps!

like image 26
Bruno Avatar answered Oct 20 '22 19:10

Bruno