Maison > interface Web > js tutoriel > le corps du texte

Solution au problème de la mémoire des objets IFrame qui n'est pas libérée dans les compétences Browser_Javascript d'IE

WBOY
Libérer: 2016-05-16 16:39:07
original
1733 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!