2009-08-18 14 views
6

esto no funciona en Safari:¿Cómo esperar a que un applet de Java termine de cargarse en Safari?

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

myMethod es un método público consignado en MyAppletClass.

Cuando carga por primera vez la página en Safari, muestra la alerta antes de que el applet haya terminado de cargarse (por lo que el cuadro de mensaje muestra undefined). Si actualizo la página, la aplicación ya se ha cargado y la alerta muestra function myMethod() { [native code] }, como era de esperar.

Por supuesto, esto significa que los métodos de applet no están disponibles hasta que se carguen, pero Safari no está bloqueando la ejecución de JavaScript. El mismo problema ocurre con <body onLoad>.

Lo que necesito es algo así como <body onAppletLoad="doSomething()">. ¿Cómo puedo solucionar este problema?

Gracias

PS: No estoy seguro de si es relevante, pero que se firme el JAR.

Respuesta

8

Uso un temporizador que se restablece y sigue comprobando varias veces antes de que se rinda.

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

Tenga en cuenta que esto supone que el applet se ejecutará en Safari. He tenido algunos casos en los que un applet requiere Java 6 que simplemente cuelga Safari incluso con un código similar al anterior. Elegí hacer la detección del navegador en el servidor y redirigir al usuario a una página de error cuando el navegador no es compatible con el applet.

+0

Gracias. Es una pena que no haya una manera más limpia de hacerlo. –

+0

También puede simplemente buscar el applet. Al menos, puedes hacerlo en Firefox. No he comprobado en Chrome & IE. De esta forma, no es necesario modificar el applet para tener un método en particular. –

2

Tuve un problema similar hace algún tiempo y al agregar MAYSCRIPT a la etiqueta del applet resolví mi problema.

echar un vistazo a esta página: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

espero que ayude!

+0

No veo cómo es relevante esperar a que se cargue el applet. Además, el ejemplo en la página no funciona en Firefox 3.5.4 en Snow Leopard. – edoloughlin

+0

AFAIU que solo se aplica a IE. En otras palabras, no es OS X & no Safari. –

3

Aquí es una función genérica que escribí para hacer precisamente esto:

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

Llamada así:

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

También podría intentar document.getElementById (applet_id) .isActive para probar si el applet está cargado en el ejemplo anterior, funcionó para mí. :) – MarioVilas

+1

Pero si lo hace, document.getElementById (applet_id) devolverá nulo cuando no exista, y arrojará una excepción de referencia nula de ".isActive". No quería tener que probar por excepción, eso es muy, muy lento en JS. –

+0

En lo que respecta a mis pruebas, 'typeof (document.getElementById (applet_id))' siempre devuelve 'object'. ¿Quiso decir 'typeof (document.getElementById (applet_id) .someFunction)'? – targumon

Cuestiones relacionadas