高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1395
Hang launching signed Applets from JavaScript

Q:JavaScript の onLoad() ハンドラで LiveConnect を使用していますが、アプレットがロードを完了する前にハングしてしまいます。

A:Mac OS X 10.3 の Java 1.4.2 Update 2 では、アプレットがまだロードされておらず、アプレットの署名に使用された証明書が信頼できるものとしてまだ認証されていない場合に、LiveConnect を使用して署名付きアプレットのメソッドを呼び出すと、ハングする可能性があります。

この問題を回避するには、アプレットのメソッドを LiveConnect で呼び出す前に、署名付きアプレットが信頼できることを確実にします。JavaScript では、アプレットがロードされ承認されているかどうかを LiveConnect を使用せずに検出することはできないので、簡単な解決策は、アプレットがロードされて、アプレットのメソッドを安全に呼び出せることを知らせる JavaScript 関数を呼び出すことです。たとえば、アプレットがロードされたことを通知するのに使用する JavaScript 関数が、リスト 1 に示すように appletLoaded() である場合に、これをアプレットの init() メソッドから呼び出す方法を以下のリストに示します。リスト 2 および 3 には、JavaScript を呼び出すアプレットで使用できる java コードの例を示します。リスト 2 にはアプレットのコンテキストを使用した JavaScript の呼び出しを示し、リスト 3 には LiveConnect を使用した JavaScript の呼び出しを示します。リスト 2 に示すようにアプレットのコンテキストを使用すると、LiveConnect は初期化する必要がないため、オーバーヘッドが少なくて済みますが、最終結果はどちらも同じです。

リスト 1:appletLoaded() 関数の例を示す HTML および JavaScript

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<html>
<head>
  <title>LiveConnect Applet Example</title>
</head>
  <body>
    <script type="text/javascript" language="JavaScript">
      <!--
      var OkToScriptJavaToJavaScriptApplet = 0;

      function appletLoaded() {
         OkToScriptJavaToJavaScriptApplet = 1;
         // これで、JavaScript からアプレットに安全にコールバックできます。
         // この関数から必要な関数を直接呼び出すか、
         // OkToScriptJavaToJavaScriptApplet がゼロでないことを確認してから
         // 別の関数から呼び出すようにする。
         }
      //-->
    </script>
    <applet archive="JavaToJavaScriptApplet.jar" code="JavaToJavaScriptApplet"
      width=600 height=100 name=JavaToJavaScriptApplet mayscript>
      Your browser does not support Java, so nothing is displayed.
    </applet>
  </body>
</html>

リスト 2:showDocument メソッドを使用して Java から JavaScript を呼び出す

public void init() {
try {
  getAppletContext().showDocument(new java.net.URL("javascript:appletLoaded()"), "_self");
  } catch (java.net.MalformedURLException e) {e.printStackTrace();}
}

リスト 3:LiveConnect を使用して Java から JavaScript を呼び出す

public void init() {
  JSObject win = JSObject.getWindow(this);
  win.eval("appletLoaded()");
}

ドキュメントの改訂履歴

日付 メモ
2004-12-01 初版

掲載日: 2004-12-01