2009-08-18 7 views
6

Cela ne fonctionne pas dans Safari:Comment attendre le chargement d'une applet Java sur Safari?

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

myMethod est une méthode publique déclarée MyAppletClass. Lorsque je charge la page pour la première fois dans Safari, elle affiche l'alerte avant que l'applet ait fini de se charger (de sorte que la boîte de message affiche undefined).

Si j'actualise la page, l'applet a déjà été chargée et l'alerte affiche function myMethod() { [native code] }, comme vous pouvez vous y attendre.

Bien sûr, cela signifie que les méthodes de l'applet ne sont pas disponibles tant qu'il n'est pas chargé, mais Safari n'empêche pas l'exécution de JavaScript. Le même problème se produit avec <body onLoad>.

Ce dont j'ai besoin est quelque chose comme <body onAppletLoad="doSomething()">. Comment puis-je contourner ce problème?

Merci

PS: Je ne sais pas si elle est pertinente, mais le JAR est signé.

Répondre

8

J'utilise une minuterie qui se réinitialise et continue de vérifier un certain nombre de fois avant d'abandonner.

<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>    

Notez que cela suppose que l'applet s'exécutera dans Safari. J'ai eu quelques cas où une applet exigeait Java 6 qui bloque simplement Safari même avec un code similaire à celui ci-dessus. J'ai choisi de faire la détection du navigateur sur le serveur et de rediriger l'utilisateur vers une page d'erreur lorsque le navigateur ne supporte pas l'applet.

+0

Merci. C'est dommage qu'il n'y ait pas une façon plus propre de faire ça! –

+0

Vous pouvez également vérifier simplement l'applet. Au moins, vous pouvez dans Firefox. Je n'ai pas vérifié dans Chrome et IE. De cette façon, vous n'avez pas besoin de modifier l'applet pour avoir une méthode particulière. –

2

J'ai eu un problème similaire il y a quelque temps et l'ajout de MAYSCRIPT à l'étiquette de l'applet a résolu mon problème.

Jetez un coup d'oeil à cette page: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

Hope it helps!

+0

Je ne vois pas comment cela est pertinent pour attendre le chargement de l'applet. En outre, l'exemple sur la page ne fonctionne pas dans Firefox 3.5.4 sur Snow Leopard. – edoloughlin

+0

AFAIU qui s'applique uniquement à IE. En d'autres termes, pas OS X et pas Safari. –

3

Voici une fonction générique je l'ai écrit à faire ceci:

/* 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); 
     } 
    } 
} 

Appelez comme ceci:

WaitForAppletLoad("fileapplet", 10, 2000, function() { 
    document.getElementById("fileapplet").getDirectoriesObject("c:/"); 
}, function() { 
    alert("Sorry, unable to load the local file browser."); 
}); 
+0

Vous pouvez également essayer document.getElementById (applet_id) .isActive pour tester si l'applet est chargée dans l'exemple ci-dessus, cela a fonctionné pour moi. :) – MarioVilas

+1

Mais si vous faites cela, document.getElementById (applet_id) renverra null quand il n'existe pas, et alors il lancera une exception de référence nulle de ".isActive". Je ne voulais pas avoir à tester par exception, c'est très, très lent dans JS. –

+0

En ce qui concerne mes tests, 'typeof (document.getElementById (applet_id))' renvoie toujours 'object'. Voulez-vous dire 'typeof (document.getElementById (applet_id) .someFunction)'? – targumon