Récemment, l'équipe du projet a découvert que si le formulaire pop-up utilisant showModalDialog contient un objet IFrame, les ressources mémoire occupées par l'objet IFrame ne seront pas libérées après la fermeture du formulaire. Après la répétition de la fenêtre contextuelle et de la fermeture, la mémoire occupée par le navigateur IE peut dépasser des centaines de Mo. Dans les cas graves, le navigateur IE signale une erreur et ne peut pas être fermé. La seule façon de redémarrer le navigateur est de le tuer. le processus. Après test, ce problème existe également lors de l'utilisation de la méthode open pour apparaître.
Dans le navigateur IE8, il existe une différence d'utilisation de la mémoire entre les pop-ups open et showModalDialog :
Le formulaire qui apparaît en mode ouvert occupe un processus iexplorer.exe indépendant
Le formulaire affiché par showModalDialog utilise le même processus iexplorer.exe que le formulaire parent
Après recherche, j'ai trouvé que la solution est de supprimer l'objet IFrame du formulaire avant de fermer le formulaire. Le code est le suivant :
<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); </span>
Mais lors des tests, j'ai trouvé deux limitations :
1. el.src n'est peut-être pas encore exécuté et les instructions suivantes seront exécutées si l'IFrame contient du contenu inter-domaines, il indiquera qu'il n'y a pas d'autorisation
2. Le formulaire se ferme plus vite que le script n'est exécuté, et la mémoire n'est toujours pas libérée
Après modification, le script final est le suivant :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE></TITLE> <BODY onbeforeunload="return unloadHandler();"> <IFRAME id="scanIf" width="800px" height="600px" src = "http://www.baidu.com"></IFRAME> <SCRIPT type="text/javascript"> function unloadHandler(notip) { // 取消窗口关闭时的监听事件 document.getElementsByTagName("BODY")[0].onbeforeunload = null; var el = document.getElementById("scanIf"); if (el) { el.src = ""; setTimeout(cycleClear, 100); return "提示:请点击取消按钮,当前窗口会自动关闭。"; } return true; } function cycleClear() { try { var el = document.getElementById("scanIf"); if (el) { el.contentWindow.document.write(''); el.contentWindow.document.clear(); var p = el.parentNode; p.removeChild(el); } window.close(); } catch (e) { setTimeout(cycleClear, 100); } } //window.onunload = unloadHandler; </SCRIPT> <input type="button" value="remove" onclick="unloadHandler();"> </BODY></HTML>