7

Les navigateurs IE6 et IE7 de Microsoft souffrent de fuites de mémoire lorsque certains modèles de code Javascript sont utilisés. J'ai trouvé beaucoup d'informations sur ce que les modèles de fuite étaient, au début IE6 jours. Cependant, je comprends que beaucoup (mais pas tous) ont été corrigés dans IE7 et dans un service pack pour IE6. Je ne peux pas trouver une source d'information fiable sur les fuites qui restent dans ces versions corrigées de IE6 et IE7.Avoir des difficultés à utiliser les détecteurs de fuites IE Javascript

Il existe deux outils pour détecter les modèles de fuite. Mais je n'arrive pas à les utiliser comme je le veux!

  • détecteur de fuite de mémoire de (V2) Microsoft trouve aucune fuite du tout dans mon code, même lorsque j'utilise des modèles qui fuiraient. C'est peut-être parce que je cours IE8 - est-il un moyen non-headachy pour le faire prétendre être IE6 ou IE7? Les gouttes et les sIEves semblent trouver des tonnes de fuites de la variété «orpheline». Sûrement, il doit s'agir de faux positifs - pratiquement tous les éléments que j'ajoute au document puis supprimez à nouveau sont listés, et je ne crois pas que je garde des références à eux. Et s'ils sont réels, comment puis-je trouver où dans mon code ils fuient? Les outils ont une fonction 'propriétés' qui ne montre rien, ce qui donne l'impression d'être cassé. Encore une fois, je n'ai aucune idée si ces fuites sont pertinentes pour IE6 ou IE7, ou juste pour IE8, qui est la version de IE que j'ai installé.

Je voudrais vraiment savoir quels types de fuites de mémoire sont toujours un problème avec les versions corrigées de IE6 et IE7, et comment les trouver efficacement dans mon code en direct à l'aide des outils pour me aider.

Une aide?

+0

Merci pour votre réponse galambalazs! Je suis déçu que la prime de 250 points ne m'ait plus donné de réponse ... – thomasrutter

Répondre

2

Je ne pense pas qu'il existe un outil efficace pour détecter les fuites de mémoire. Cependant, il existe un logiciel que vous pouvez utiliser pour émuler IE 6-7-8 sur votre PC, il s'appelle IE Tester.

La fuite la plus courante d'Internet Explorer est une interaction avec JScript.

Lorsqu'un objet DOM contient une référence à un objet JavaScript (un tel événement de fonction de traitement), et lorsque que objet JavaScript contient une référence à cet objet de DOM, puis une structure cyclique est formé . - http://javascript.crockford.com/memory/leak.html

Cette structure cyclique est ce que IE a des moments difficiles traitant. Vous devez comprendre comment les références cycliques sont formées (via fermeture). La première étape serait de nettoyer vos éléments DOM avant de les supprimer.

Cela peut être fait par une fonction générale comme ceci:

function purge(d) { 
    var a = d.attributes, i, l, n; 
    if (a) { 
     l = a.length; 
     for (i = 0; i < l; i += 1) { 
      n = a[i].name; 
      if (typeof d[n] === 'function') { 
       d[n] = null; 
      } 
     } 
    } 
    a = d.childNodes; 
    if (a) { 
     l = a.length; 
     for (i = 0; i < l; i += 1) { 
      purge(d.childNodes[i]); 
     } 
    } 
} 

Chaque fois que vous supprimez des éléments du DOM, vous devez utiliser purge sur le premier.Vous pouvez même écrire un wrapper pour que

function safeRemove(el) { 
    purge(el); 
    el.parentNode.removeChild(el); 
} 

Bien sûr, il est juste un point de départ, car il ne vous aidera pas avec des références dans d'autres lieux (comme les gestionnaires d'événements DOM2, ou ailleurs si fermeture). Vous devriez vérifier les endroits où vous supprimez des éléments, et découvrez quelles fonctions les référencent.

Ce problème semble toujours exister dans IE 6-7-8.

+0

Est-ce que jquery le fait dès que vous appelez '.remove()'? –

+1

Bonne question. Je l'ai testé et pour les événements que vous avez ajoutés via jQuery c'est bien, mais les événements ajoutés de toute autre manière semblent fuir (avec jQuery 'remove'). – galambalazs