- PR -

innerHTMLでjavaアプレットをロードすると、IEのウィンドウが閉じてしまう

1
投稿者投稿内容
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2008-07-24 17:04
イントラネットのweb画面のリンクから実行されるJavaScriptで、最終的には次の画面に遷移するのですが、遷移前にある処理をさせるため、Javaアプレットを動的ロードすることにしました。動的ロードにしたのは、静的ロードだとweb画面を開いたとき一時的に固まるため、エンドユーザの混乱を招くから避けたい、というお客さんの要望によります。

idを振ったdivタグに対してinnerHTMLでアプレットをロードさせることで、要求通りに動作する画面が完成しました。しかし開発環境以外のマシンで動作させたところ、次の画面に遷移せず、IEのウィンドウがいきなり閉じてしまいます。この画面の起動元のIEウィンドウは残っているので、IEのプロセスが終了するわけではありません。
innerHTMLをコメントアウトすると正しく遷移するため、この部分に何かありそうです。

開発環境のマシン(Windows2000SP4)は最新のパッチを適用済みで、それ以外のマシン(Windows2000かXP)は運用上の理由により、パッチは一切適用してありません。恐らくパッチを適用すれば解決すると思うのですが、この「運用上の理由」が曲者で、要はパッチ適用によりシステムの一部が動かなくなるリスクを回避するためなので、できればパッチは適用したくないのがお客さんの意向です。

最悪の場合、運用上の理由を曲げて頂くしかないのですが、その前に技術的なアプローチで解決できそうなヒントがあれば、ご提示いただけると幸いです。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-07-24 18:22
アプレットをinnerHTMLで突っ込んだことはないので、一般的な話で。
HTMLのタグがおかしい(入れ子が変とか)と、IEの挙動が不安定になることがありますね。
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2008-07-25 11:11
具体的なhtmlは次のような感じです。
なお画面は4つのフレームから成り、その内の一つが下記のようになっています。

<body>
:
:
<div id="hoge"></div>
</body>

getElementById()で取得したhogeのDOMオブジェクトに、innerHTMLでアプレットをロードさせています。
書き忘れていましたが、IEのバージョンは6で、SPは関係ないようです。

OK Windows2k SP4 IE6SP1 最新パッチ適用済
NG Windows2k SP4 IE6SP1 最新パッチ未適用
NG WindowsXP SP2 IE6SP2 最新パッチ未適用
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2008-07-28 11:05
パッチ適用していないことが原因であることを突き詰めたのでしょうか。
であれば、それらしい情報がmicrosoftのページに書かれているはずなので確認しましょう。回避策ももしかしたらあるかもしれません。
回避策がなければ、そのようにクライアントに提言するしかありません。

ということで、まずは事象の切り分けからでしょう。
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2008-07-28 17:44
開発機から、パッチkb947864をバックアウトすると問題の現象が生じますので、パッチ適用の有無が影響することは間違いありません。
http://support.microsoft.com/kb/947864

ですが今回の問題に関する具体的な情報は、ちょっと見当たらないようです。脆弱性ということで一括りにされているのかもしれません。
いずれにせよ、パッチ適用しか回避策がなさそうですね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-28 18:00
ちょっとした疑問なのですが、Java は Sun の Java なのでしょうか?それとも Microsoft VM なのでしょうか?

また、innerHTML が駄目だとしたら、window.open でウィンドウを開くなどして、そこで Java を実行するという手では回避できないでしょうか?ポップアップブロッカー等の問題が新たに起きるかもしれませんし、また、当然、プログラムの変更が必要になります。当初の問題が回避できるのかどうかも定かではありませんが。

今まで拝見していて、思いついたのはこれぐらいです。
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2008-07-29 15:51
SunのJDK1.5とJRE1.6の両方で確認しています。

子ウィンドウを開く方法でも対応できるかもしれませんが、裏で何やら複雑なことをやっているみたいで、それなりの調査が必要です。
元々次のように動作するシステムがあり、

1. 任意の項目をクリック、Javascript開始
2. サーバへsubmit、Javascript終了
3. サーブレットでDB操作(レコード削除等、クリック元により異なる)
4. サーブレットキックで子ウィンドウを開きJavaアプレットロード、外部アプリを起動

1と2の間に新しく条件判定を入れたいというのが、今回の要件でした。
この条件判定にも別外部アプリを用いる必要があり(今振り返るとそれはmustではなかったのですが)、およびユーザの各種意向や、ドキュメントが不十分な既存システムの改善という事情もあって、当初一番簡単に実現できると思われた方法で設計したのですが、こんな落とし穴があろうとは。orz

一応ユーザには、次の3つを提案しました。
a) パッチを適用
b) アプレットを静的ロードに変更
c) 設計からやりなおし

請負開発ではないのでcでも構わないのですが、一旦できたものが没になるのは、あまり気乗りしませんね…
1

スキルアップ/キャリアアップ(JOB@IT)