2009-08-18 12 views
6

Questo non funziona in Safari:Come aspettare che l'applet Java finisca il caricamento su Safari?

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

myMethod è un metodo pubblica indicato nella MyAppletClass.

Quando carico la pagina per la prima volta in Safari, viene visualizzato l'avviso prima che l'applet abbia completato il caricamento (quindi nella finestra di messaggio viene visualizzato undefined). Se aggiorno la pagina, l'applet è già stata caricata e l'avviso visualizza function myMethod() { [native code] }, come previsto.

Ovviamente, questo significa che i metodi dell'applet non sono disponibili finché non è stato caricato, ma Safari non sta bloccando l'esecuzione di JavaScript. Lo stesso problema si verifica con <body onLoad>.

Quello che mi serve è qualcosa come <body onAppletLoad="doSomething()">. Come posso risolvere questo problema?

Grazie

PS: io non sono sicuro se è rilevante, ma la JAR è firmato.

risposta

8

Uso un timer che si reimposta e continua a controllare un numero di volte prima che si arrenda.

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

Si noti che questo presuppone che l'applet verrà eseguito in Safari. Ho avuto alcuni casi in cui un'applet richiedeva Java 6 che semplicemente blocca Safari anche con codice simile al precedente. Ho scelto di eseguire il rilevamento del browser sul server e reindirizzare l'utente a una pagina di errore quando il browser non supporta l'applet.

+0

Grazie. È un peccato che non ci sia un modo più pulito per farlo! –

+0

Puoi anche semplicemente controllare l'applet. Almeno, puoi farlo in Firefox. Non ho controllato in Chrome e IE. In questo modo, non è necessario modificare l'applet per avere un metodo particolare. –

2

Ho avuto un problema simile qualche tempo fa e l'aggiunta di MAYSCRIPT al tag dell'applet ha risolto il mio problema.

dare uno sguardo a questa pagina: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

Speranza che aiuta!

+0

Non vedo come questo sia rilevante per aspettare che l'applet venga caricata. Inoltre, l'esempio nella pagina non funziona in Firefox 3.5.4 su Snow Leopard. – edoloughlin

+0

AFAIU che si applica solo a IE. In altre parole, non OS X e non Safari. –

3

Ecco una funzione generica che ho scritto per fare proprio questo:

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

chiamare in questo modo:

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

Si potrebbe anche provare document.getElementById (applet_id) .isActive per verificare se l'applet è stata caricata nell'esempio precedente, ha funzionato per me. :) – MarioVilas

+1

Ma se lo fai, document.getElementById (applet_id) restituirà null quando non esiste, e quindi genererà un'eccezione di riferimento null di ".isActive". Non volevo testare per eccezioni, questo è molto, molto lento in JS. –

+0

Per quanto riguarda i miei test, 'typeof (document.getElementById (applet_id))' restituisce sempre 'object'. Intendevi 'typeof (document.getElementById (applet_id) .someFunction)'? – targumon

Problemi correlati