Maison  >  Article  >  interface Web  >  Solution au problème de fuite de mémoire lors de l'utilisation de jQuery pour réinitialiser l'adresse iframe sous IE_jquery

Solution au problème de fuite de mémoire lors de l'utilisation de jQuery pour réinitialiser l'adresse iframe sous IE_jquery

WBOY
WBOYoriginal
2016-05-16 16:15:281293parcourir

Il y a une iframe dans la page :

Copier le code Le code est le suivant :


Test de fuite IFRAME

Le contenu de a.html est le suivant :

Copier le code Le code est le suivant :





Insérer le titre ici






Le suffixe "9" est valable pour IE6/IE7/IE8/IE9/IE10 suffixe" Suffixe "9 Le préfixe "*" est valable pour IE7

Le préfixe " " est valable pour IE7
Préfixe du sélecteur @media screen et (-ms-high-contrast : actif), (-ms-high-contrast : aucun)

Valable pour IE10


Copier le code

Le code est le suivant :



SPAN




Le contenu de b.html est le suivant :


Copier le code


Insérer le titre ici



SPAN





Il y a une rumeur sur Internet selon laquelle la méthode d'écriture suivante peut réduire les fuites de mémoire :

Copier le code

Le code est le suivant : var frameDom = $('iframe:eq(0)')[0]; var frameWin = frameDom.contentWindow;
essayez{
frameWin.document.write('');
frameWin.document.clear();
}attraper(e){};
frameDom.src = 'b.html';



Alors quel est l’effet ?
Première méthode d'écriture : définir directement l'URL

Copier le code

Le code est le suivant :

var drapeau = vrai;
var frameDom = $('iframe:eq(0)')[0];
$('bouton').on('clic',fonction(){
si (drapeau) {
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
/*
Essayez{
frameWin.document.write('');
frameWin.document.clear();
}attraper(e){};
*/
frameDom.src = 'b.html';
drapeau = faux ;
}autre{
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
/*
Essayez{
frameWin.document.write('');
frameWin.document.clear();
}attraper(e){};
*/
frameDom.src = 'a.html';
drapeau = vrai ;
>
//$('#console').append(flag ? 'Passer à a.html': 'Passer à b.html');
});

Test à l'aide du tamis : les #fuites augmentent d'environ 28 à chaque changement.

Méthode d'écriture 2 : Méthode d'écriture en ligne

Copier le code Le code est le suivant :

<script><br> var drapeau = vrai;<br> var frameDom = $('iframe:eq(0)')[0];<br> $('bouton').on('clic',fonction(){<br> si (drapeau) {<br>       var frameDom = $('iframe:eq(0)')(0];<br> var frameWin = frameDom.contentWindow;<br>         essayer{ <br> frameWin.document.write(''); <br> frameWin.document.clear(); <br>         }attraper(e){}; <br> frameDom.src = 'b.html';<br> drapeau = faux ;<br> }autre{<br>       var frameDom = $('iframe:eq(0)')(0];<br> var frameWin = frameDom.contentWindow;<br>         essayer{ <br> frameWin.document.write(''); <br> frameWin.document.clear(); <br>         }attraper(e){}; <br> frameDom.src = 'a.html';<br> drapeau = vrai ;<br> ><br> //$('#console').append(flag ? 'Passer à a.html': 'Passer à b.html');<br> });<br> </script>

Test à l'aide du tamis : les #fuites augmentent d'environ 28 à chaque changement. Il n'y a aucune différence avec la manière d'écrire

Troisième méthode d'écriture :

Copier le code Le code est le suivant :

var drapeau = vrai;
var frameDom = $('iframe:eq(0)')[0];
$('bouton').on('clic',fonction(){
si (drapeau) {
/*
Essayez{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}attraper(e){};
*/
​​​ $('iframe:eq(0)').remove();
$('body').append("");
drapeau = faux ;
}autre{
/*
Essayez{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}attraper(e){};
*/
​​​ $('iframe:eq(0)').remove();
$('body').append("");
drapeau = vrai ;
>
});

Utilisation du test sIEve : la #fuite moyenne est de 3, ce qui est une énorme différence par rapport aux deux premières

Méthode d'écriture 4 : Notez qu'un morceau de code est commenté dans la méthode 3. Que se passera-t-il si vous supprimez le commentaire ?

Copier le code Le code est le suivant :

var drapeau = vrai;
var frameDom = $('iframe:eq(0)')[0];
$('bouton').on('clic',fonction(){
si (drapeau) {
Essayez{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}attraper(e){};
​​​ $('iframe:eq(0)').remove();
$('body').append("");
drapeau = faux ;
}autre{
Essayez{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}attraper(e){};
​​​ $('iframe:eq(0)').remove();
$('body').append("");
drapeau = vrai ;
>
});

Il n'y a pas de différence évidente entre cette méthode d'écriture et la méthode d'écriture 3. Les #fuites augmentent quand même d'environ 3 à chaque fois que vous la changez

On peut donc conclure que la meilleure façon de résoudre la fuite de mémoire liée à la réinitialisation de l'adresse iframe est de la tuer et d'en ajouter une autre !

La transmission en ligne peut ne pas être fiable

Remarque : L'environnement de test local est WIN7 x64 IE9

Déclaration:
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