2009-08-18 3 views
6

これはSafariで動作しません:SafariでJavaアプレットの読み込みを待つ方法を教えてください。

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

myMethodMyAppletClassで宣言されたパブリックメソッドです。

私は最初のSafariでページをロード

が、それはアプレットの読み込みが完了する前に警告(ので、メッセージボックスが表示さ undefined)を示しています。ページをリフレッシュすると、アプレットはすでにロードされており、予期したとおりに警告は function myMethod() { [native code] }と表示されます。

もちろん、これは、それがロードされるまで、アプレットのメソッドが利用できないことを意味しますが、Safariは動作してからJavaScriptをブロックしていません。 <body onLoad>でも同じ問題が発生します。私は必要なもの

<body onAppletLoad="doSomething()">のようなものです。この問題を回避するにはどうすればよいですか?

おかげ

PS:私はそれが関連するかどうかわからないんだけど、JARが署名されています。

答えて

8

私はリセットされ、それがあきらめる前に、回数をチェックし続けるタイマーを使用しています。

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

これは、アプレットがSafariで実行されることを前提としています。私はアプレットがJava 6を必要とするいくつかのインスタンスを持っていますが、上記のようなコードでもSafariを単に停止させるだけです。私はサーバー上でブラウザの検出を行い、ブラウザがアプレットをサポートしていないときにエラーページにリダイレクトすることを選択しました。

+0

ありがとうございました。これを行うためのよりクリーンな方法がないのは残念です! –

+0

また、単にアプレットを確認することもできます。少なくとも、あなたはFirefoxですることができます。私はChromeとIEでチェックしていません。そうすれば、特定のメソッドを持つようにアプレットを変更する必要はありません。 –

2

私はいくつかの時間前に同様の問題を抱えていたし、アプレットタグにMAYSCRIPTを追加すると私の問題を解決しました。

このページでのぞき見を取る: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

はそれが役に立てば幸い!ここで

+0

アプレットが読み込まれるのを待つこととどのように関連しているのかわかりません。また、Snow LeopardのFirefox 3.5.4ではこのページの例は動作しません。 – edoloughlin

+0

IEにのみ適用されるAFAIU。言い換えれば、OS X&Safariではない。 –

3

は、私はちょうどこれを行うために書いた汎用的な機能である:

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

はこのようにそれを呼び出します。

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

上記の例でアプレットが読み込まれているかどうかを調べるにはdocument.getElementById(applet_id).isActiveを試してみてください。 :) – MarioVilas

+1

しかし、あなたはそれを行う場合には、それが存在しない場合のdocument.getElementById(applet_id)はNULLを返します、そしてそれは「.isActive」のnull参照の例外がスローされます。例外的にテストする必要はありませんでした.JSでは非常に遅いです。 –

+0

私のテストでは、 'typeof(document.getElementById(applet_id))'は常に 'object'を返します。 'typeof(document.getElementById(applet_id).someFunction)'を意味しましたか? – targumon

関連する問題