Opera の場合のみ "Loading Applet..." と表示されたまま動作しません。
試した環境は全て Windows 上で
Firefox 2.0.0.4 / Internet Explorer 7.0.5730.11 / Opera 9.21.8776 です。
※ はてなの質問本文の制限にかかったのでコードはコメント欄に書きます。
何か良い解決方法はありますか?
宜しくお願いします。
こんにちは。
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大ブラウザでの動作を確認しました!!
精密な検証/丁寧な解説、とても役に立ちました!!!
ありがとうございました!!