問題 私の現在のプロジェクトでは、フロントエンド部分は完全に「ワンページ」コンセプトに基づいた EXTJS を使用して構築されています。基本コンテナである HTML を除いて、すべて JS ファイルです (ページは JS ファイルによって実装されます)。ユーザーがページを切り替えると、前のページ オブジェクトを破棄し、新しいページ オブジェクトを作成して HTML で表示します。このアーキテクチャに基づいて、レポートを表示するための ActiveX コントロールも導入しました。この導入により、問題が発生します。レポート コントロールが存在するページにアクセスし、ユーザーがページを 2 回切り替える限り、IE はクラッシュし (FF にはこの問題はありません)、何度試行しても機能しなくなります。
理由 リソース解放を念頭に置いてシステムが設計されており、破棄部分は特別に処理されており、ActiveX のないページでも問題がないためです。したがって、問題は、IE が JS に含まれる ActiveX コントロールを解放することにあるはずです。結局のところ、HTML、JSP、または PHP ページで構築された従来のフロントエンドでは、ユーザーがジャンプしてページがアンロードされるとすぐに、システムが継続的な再描画を使用している間、そのページ内の ActiveX は破棄されます。 HTML ページにジャンプすると、システムは更新されず、アンロードも行われず、当然、ActiveX は破棄されず、ブラウザがクラッシュします。
解決策 原因が分かったので、解決策を考えていきます。 IE では ActiveX コントロールを破棄することはできません。自分で実行するだけです:
// @AcitveXObjectID: 検索対象のノード範囲は、このノードから削除する ActiveX を検索するために使用されます。
//@ContianerID: 削除する ActiveX コントロールの ID。
function ActiveXKiller(AcitveXObjectID,ContianerID){
var ce=document.getElementById(ContianerID);
if (ce){
var cce=ce.children; 0;iif(cce[i].id==AcitveXObjectID){
ce.removeChild(cce[i]);
}
}
}
このメソッドは、ActiveX コントロールを強制終了するために使用されます。 原理もシンプルです。 Dom 内の指定された ActiveX ID を使用して、指定されたノード範囲 (通常は親ノードまたは ActiveX コントロールのコンテナー) 内を段階的に検索し、見つかったら手動で削除します。
このキラーを使用すると、クラッシュを避けるためにページを再描画する前に ActiveX を処理できます。
さらに、言及すべき特別な状況があります。これは、Ext.Window に ActiveX コントロールを配置するときです。 Ext.Window を閉じたときに内部の ActiveX を破棄できるようにしたい場合は、次の条件を満たす必要があります:
ActiveX のコンテナは Ext.Window 自体である必要があります。
つまり、ActiveX コントロールを Ext.Panel に配置し、それを Ext.Window に配置するとします。 Ext.Window が閉じているときに ActiveX コントロールを「一緒に」取得できるとは期待しないでください。
幸運を祈ります!