人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Opera の Javascript で動的に読み込んだ Java アプレットが動作しません。同一のデータでIE/Firefox では動作しています。
Opera の場合のみ "Loading Applet..." と表示されたまま動作しません。

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

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

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


●質問者: Takel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2.0 Applet firefox IE Internet Explorer
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● じゃっくそにっく
●400ポイント ベストアンサー

こんにちは。

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の動きが異なることについて

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

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ