最近、プロジェクトチームは、IFRAMEオブジェクトがShowModaldialogを使用してポップアップフォームに含まれている場合、フォームが閉じた後にIFRAMEオブジェクトが占有するメモリリソースがリリースされないことを発見しました。ポップアップのクローズが何度も繰り返された後、IEブラウザのメモリ使用量は数百のMを超える可能性があります。深刻な場合、IEブラウザーはエラーを報告し、閉じることができません。プロセスを殺すことによってのみブラウザを再起動できます。テスト後、この問題は、オープンメソッドを使用してポップアップするときにも存在します。
IE8ブラウザでは、OpenおよびShowModaldialogからのメモリ使用量のポップアップに違いがあります。
オープンメソッドにポップアップされたフォームは、独立したiexplorer.exeプロセスを占有します。
showmodaldialogモードでポップアップされたフォームは、親フォームと同じiexplorer.exeプロセスを使用します。
検索後、ソリューションは、フォームが閉じる前にフォームからiframeオブジェクトを削除することであることがわかりました。コードは次のとおりです。
<span style = "font-size:18px"> var el = document.getElementByid( "scanif"); el.src = ""; el.contentwindow.document.write( ''); el.contentwindow.document.clear(); var p = el.parentnode; p.removechild(el); </spas
ただし、テスト中に、2つの制限があることがわかりました。
1. EL.SRCがまだ実行されていない場合、次のステートメントが実行されます。 IFRAMEにクロスドメインコンテンツが含まれている場合、許可がないことが促されます。
2。フォームは、スクリプトが実行されるよりも速く閉じられており、メモリはまだリリースされていません。
変更後、最終スクリプトは次のとおりです。
<!doctype html public " - // w3c // dtd html 4.0 transitional // en"> <html> <head> <title> </title> <body onbe foreunload = "return unloadhandler();"> <iframe id = "scanif" src = " type = "text/javascript"> function unloadhandler(notip){//ウィンドウが閉じられているときにリスニングイベントをキャンセルします。getelementsbytagname( "body")[0]。現在のウィンドウは自動的に閉じます。 ";} return true;} function cycleclear(){try {var el = document.getelementbyid(" scanif "); if(el){el.contentwindow.document.write( ''); el.contentwindow.document.clear(); var p = p = p = p = p = p = el.ParentNode; p.RemoveChild(el);} windos.close();} catch(e){setimeout(cycleclear、100);}} // window.onload = unloadhandler; </script> <入力タイプ= "ボタン" button "value =" remove "onclick =" unloadler();