Opera の Javascript で動的に読み込んだ Java アプレットが動作しません。同一のデータでIE/Firefox では動作しています。

Opera の場合のみ "Loading Applet..." と表示されたまま動作しません。

試した環境は全て Windows 上で
Firefox 2.0.0.4 / Internet Explorer 7.0.5730.11 / Opera 9.21.8776 です。

※ はてなの質問本文の制限にかかったのでコードはコメント欄に書きます。

何か良い解決方法はありますか?
宜しくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/05/31 20:29:12
  • 終了:2007/06/02 12:05:41

ベストアンサー

id:jack_sonic No.1

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/06/01 15:15:31

ポイント400pt

こんにちは。

HTMLページとJavaアプレットを作り、

私のほうでもInternetExplorer7, FireFox2.0 , Opera9.21で動作確認をしてみましたところ、

Opera9で同様の現象が起きました。

その中で、

・bodyタグ内に静的にappletタグを置くとOperaでもきちんと読み込まれる。

>JavaApplet内部のコードは原因ではない。

>OperaにおけるcreateElement,appendChildを使ったappletタグの動的追加に問題がある

というわけなので、

XMLシリアライザで確認してみたところ、DOMには追加されているものの、反映されていないという

かたちでした。

DOM APIで色々やってみたのですが、反映されないようで、書き込み方を変えた

方法をとりました。

対策

動的追加には、DOM APIとinnerHTMLを使った方法の2つがありますが、

・このページは厳格なXMLやXHTMLではない

・appletタグは、複雑な入れ子・ツリー構造になることがなく、

追加する対象も限定される(bodyやdivやtdなど)。

・DOM APIよりinnerHTMLを使ったほうがよいケースがいくつか存在する。

(FireFoxでのフォーム送信のケースや、

DOM APIがinnerHTMLよりも遅いこと、その他)、

・DOM APIを使わなくてもよい可能性

という点から、innerHTMLで追加する関数をつくり、やってみたところ、

InternetExplorer7, FireFox2.0 , Opera9.21すべての

ブラウザで正常に読み込まれました。

関数は、

addAppletTag(対象オブジェクト, appletコード, 幅,高さ, paramのHTML, 設定タイプ{代入/末尾追加/先頭追加} )

です。書き込み先のオブジェクト、先頭に追加するか、代入するか、末尾に追加するかなどが選べます。

読み込みに時間のかかるアプレットに変えた場合は少しウェイトが必要かもしれません。

<html>
<head>
<script type="text/javascript">
// onLoad()
function OnLoad()
{
	// 追加対象タグ(body)を選択して、appletタグを追加
	addAppletTag( document.body, 'hogeApplet', 'HogeApplet', 128, 128 , '' , '', '');
	// 読み込みが長いアプレットの場合、setTimeoutで少し時間を置く必要が
	// あるかもしれません。
	// オブジェクト取得
	var hogeApplet = document.getElementById('hogeApplet');
	// メソッド呼び出しテスト
	alert("before");
	hogeApplet.DoMage(1);
	alert("after");
}
/////////////////////////////////////////////////
// 指定されたタグ内にinnerHTMLでappletを追加する関数
//	( 追加するオブジェクト,
//	  appletコード, 幅,高さ, 
//	  codebace, パラメータHTML, 
//	  設定タイプ(head:先頭追加,assign:代入,それ以外:末尾)
//	 )
function addAppletTag(obj, id, code, width, height, codebace, paramText , pos)
{	
	if( ! codebace ) codebace = "";
	// 先頭に追加するか末尾に追加するか
	txtHead = ""; txtTail ="";
	if( pos=='head' ){
		 txtTail = obj.innerHTML;
	}else if(pos=='assign') {
		// 代入
	}else{
		// 末尾追加
		txtHead = obj.innerHTML;
	}

	// innerHTMLで追加
	obj.innerHTML = txtHead + "<applet id='"+ id 
		+ "' code='" + code 
		+ "' codebace='" + codebace
		+ "' width='" + width 
		+ "' height='" + height
		+ "'>"
		+ paramText 
		+ "</applet>" + txtTail;
		
	return 0;
}

</script>
</head>
<body onload="OnLoad()">
ボディ
</body>
</html>

はてなの回答文章の文字変換で悪影響があるといけないので、

こちらにも載せておきます。

JavaScript/Javaアプレットの動的追加について - 情報処理研究所 ジャックズラボ(jack's Lab)

Operaのapplet追加のDOM APIの動きが異なることについて

新たな情報があればまたコメントします。

id:takel

ご回答ありがとうございます!!

同等のコードで無事、3大ブラウザでの動作を確認しました!!

精密な検証/丁寧な解説、とても役に立ちました!!!

ありがとうございました!!

2007/06/02 12:04:33
  • id:takel
    ==== HTML 部 ====
    <html>
    <head>
    <script type="text/javascript">
    function OnLoad()
    {
    var appletElm = document.createElement("applet");
    appletElm.setAttribute("id", "hogeApplet");
    appletElm.code = "HogeApplet";
    appletElm.width = 128;
    appletElm.height = 128;
    //appletElm.setAttribute("mayscript", true);
    var bodyElm = document.getElementsByTagName("body").item(0);
    if (!!(bodyElm))
    {
    bodyElm.appendChild(appletElm);
    }

    var hogeApplet = document.getElementById("hogeApplet");
    if ((typeof hogeApplet != "undefined") && (hogeApplet))
    {
    window.alert("before");

    var ret = hogeApplet.DoMage(1);

    window.alert("after");
    }
    }
    </script>
    </head>
    <body onload="OnLoad();">
    <!-- <applet id="hogeApplet" code="HogeApplet" width="256" height="256"></applet> -->
    </body>
    </html>
  • id:takel
    ==== Java applet 部 ====
    public class HogeApplet extends java.applet.Applet {
    public static void DoMage(long arg) {
    try {
    Thread.sleep(arg);
    }
    catch (java.lang.InterruptedException ex) {
    }
    }
    };

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません