1

私は Java アプレットに取り組んでおり、IE9 で問題が発生しています。この設計では、特定のタブが選択または選択解除されると、ドキュメントにアプレットが追加および削除されます。

1) タブを選択すると、アプレットが正常に表示されます。Java コンソールに、次のメッセージが表示されます。

basic: Added progress listener
 basic: Plugin2ClassLoader.addURL parent called for XXX

basic: Applet initialized
 basic: Starting applet

basic: Applet made visible
 basic: Applet started
 basic: Told clients applet is started

2) タブが選択されていない場合: Java コンソールで

basic: Starting applet teardown

basic: Finished applet teardown
 basic: Removed progress listener: 

直後に (誰が、なぜアプレットを再起動したのか不明)

basic: Added progress listener:

basic: Plugin2ClassLoader.addURL parent called for

basic: Applet loaded.

basic: Applet resized and added to parent container

basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 106964 us, pluginInit dt 45402059 us, TotalTime: 45509023 us

basic: Applet initialized

basic: Starting applet

basic: completed perf rollup

この同じアプレットは、ドキュメント モードが IE8 に切り替えられたときに正常に動作します。また、Firefoxも正常に動作します...

ところで、私は次のバージョンのJREを使用しています

バージョン: 7.0.150.3

このアプレットの予期しない再起動の理由は何ですか?

4

1 に答える 1

0

(同じ問題に関する MSDN TechNet フォーラムのメッセージも見つけました。)

似たようなことをしているプロジェクトであなたの問題にぶつかりました.1ページのアプリケーションのDOMからアプレットを注入したり削除したりしていました.タブでアプレットを長期間 (数日) 維持することに関しては、サポートしているブラウザーのすべての癖に対処する必要があります。アプレットのライフサイクルの管理は実際には強制されておらず、ブラウザーごとに異なるため、それらを無効にするものもあり、「存続期間の短い」アプレットを使用すると、全体的に「安全」で「簡単」であることが証明されました。

つまり、IE9 の 2 つの問題を除いて:

  • IE9 がアプレットごとに個別の JVM を使用するように強制しない場合、アプレットを再注入して再実行しようとすると、特定の構成でクラッシュする可能性があります。
  • 2 月 12 日のKB2792100であると思われる Windows Update の後、現在対処しているセキュリティ情報MS13-009に対処しています。

何が原因で IE9 がこのような動作をするようになったのかは完全にはわかりませんが、アプレットを削除するときの内部競合状態が疑われることに注意してください (または、アプレットを削除することが間違いであると想定する奇妙なセーフガードですが、常にそうであるとは限りません)気にしないでください)。

また、私が言及した両方の問題について、問題が発生しなかったワークステーションを少なくとも 1 つ見つけました。私のマシンを除いて、すべての同僚のワークステーションと私たちのテスト サーバーは一貫して失敗していました (これにより、デバッグがさらに楽しくなりました)。

回避策

私たちがこれに対処した方法は満足のいくものではありませんが、今のところはそれで間に合わせています。IE9 には特別なケースがあります。うまくいけば、IE10 にはバグがなく、IE8 モードの IE8 または IE9 でさえ、または別の互換モードでの MSDN 投稿 IE9 で言及されているように、問題は発生しないようです。

したがって、古き良き IE9 では、より伝統的な長寿命のアプレットを実際に使用し、JS から Java への通信を使用して、必要に応じて必要なことを実行し、DOM の削除部分をスキップしています...つまり、 Java プラグインが動作しない場合、または IE がアプレットを強制終了することを決定した場合に、タブなどを更新する必要がある場合があることをユーザーに通知する必要がある場合があります。

うまくいけば、次の更新で悪化しないことを願っています。

別の回避策

また、かなり奇妙なものを見つけました。通常、アプレットが完了すると、DOM からアプレットを削除していました。タスクが完了すると、JS コールバックがトリガーされ、親からアプレットが削除されます。また、念のため、以前のアプレットが正しく削除されなかった場合に備えて、新しいアプレットを挿入する前に既存のアプレットも削除します。

数週間後、これらは両方とも失敗します。

setInterval()しかし、アプレットを挿入してから、繰り返し機能を開始して定期的にアプレットをチェックし、利用可能になったらすぐにアプレットを削除できることに気付きました。不思議なことに、このアプローチを使用するとバグは発生しません!!

ただし、次のようにこのルートをたどりませんでした。

  • アドホックな理由でこの種の奇妙なタイマーを追加するのは本当に好きではなく、それらが破棄されないリスクがあります。
  • アプレットは作業が完了する前に削除され、早期に終了する可能性があります。そうではないようですが、そのようなものはどちらかというと「不特定」であるため、そのままにしておきます。

あなたが試すことができる他のこと

<object>タグの代わりにタグを使用してみてください<applet>これは実際には IE に推奨されますが、注入時にアプレットを自動起動させたいため、これを行うことができませんでした。また、何らかの理由で IE8 (サポートしているすべてのつまらないブラウザーの中で唯一のもの) はアプレットの自動起動を拒否します。ページの読み込み後に挿入されます。したがって、それが機能するかどうかを確認できます。機能し、IE8 が必要ない場合は、ゴールデンである可能性があります (または、上記のような特別なケースの代わりに、IE8 と IE9 に異なるタグを使用できます)。

しかし、私は(まだ)試す機会がありませんでした。

幸運を祈ります。

于 2013-03-20T17:24:56.103 に答える