2009-10-25 4 views
0

J'ai été suivi vers le bas une fuite de mémoire dans mon application web qui supprime dynamiquement et ajoute des ancres qui ont infobulles cluetip attachés et je pense que je suis limité le problème à la fermeture principale dans cluetip qui attache le bloc au noeud (ligne 32: var link = this, $ this = $ (this);).mémoire jQuery cluetip fuite

J'ai exécuté le script suivant dans SIEV avec une version modifiée de jquery 1.3.2 avec le correctif suivant qui permet de supprimer les éléments de bloc-notes . Cependant, les noeuds d'ancrage deviennent orphelins car il y a encore une référence à eux après que les noeuds de bloc-code sont supprimés?

Si je change la ligne 32 de la source de bloc à la suivante pour tester fins: var link = $ ('br'), $ this = $ ('br');

Les ancres sont libérés mais les nœuds « br » commencer à construire.

Par conséquent, je me demandais si quelqu'un sait comment je peux contourner ce problème ? ou si je ne libère pas les ressources correctement?

scripts attachés et Source:

modification jQuery. Après la ligne 1247, insérer ce qui suit avant l'accolade de fermeture (http://markmail.org/message/cfi4bvfjc3m6ww6k#query:jquery%20memory%20leak%20in%20remove%20and%20empty+page:1+mid:tapc7zt3cwl6rw4f+state:results):

this.outerHTML = "";

Exemple de script:

<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="jquery.cluetip.css"/> 


    <script type="text/javascript" src="jquery-1.3.2.js"></script> 
    <script type="text/javascript" src="jquery.cluetip.js"></script> 


    <script type="text/javascript"> 
      $(document).ready(function() { 
        setInterval(resetCluetip, 1000); 
      }); 


      function resetCluetip() { 
        $('a').each(function() { 
          $(this).cluetip('destroy'); 
          $(this).unbind().remove(); 
        }); 


        $('#cluetip*').unbind().empty(); 


        $('body').html('<a href="#" class="contextMenu" title="title|body">anchor one</a><br>'); 


        $('a').each(function() { 
          $(this).cluetip({splitTitle: '|'}); 
        }); 
      } 
    </script> 
</head> 
<body> 
</body> 
</html> 

Répondre

1

Voici quelques commentaires:

  • Tout d'abord, ce que ce script ne fait aucun sens pour moi ... Remise à zéro des cluetips et le contenu du page chaque seconde. Pourquoi ne pas simplement mettre à jour l'attribut title avec de nouvelles informations, puis actualiser le bloc d'étiquettes ou définir l'attribut de bloc d'étiquettes ajaxCache: false si vous recevez les mises à jour via ajax?
  • En utilisant .remove() sur un objet doit le retirer du DOM et aussi délie toutes les références, vous ne devriez pas avoir besoin d'utiliser .unbind().remove(); ou .unbind().empty();
  • Wildcards ne fonctionnent pas avec les ID de cette façon $('#cluetip*') une meilleure façon de faire est d'utiliser un filtre d'attribut de sélection comme celui-ci $('div[id*="cluetip"]')
  • Je ne pouvais pas reproduire la fuite de mémoire.
+0

Le script est est simplement un conteneur de test pour ce que ma demande de production fait pour mettre en évidence le problème. Dans ma demande de production, nous avons des balises d'ancrage qui représentent des documents qui peuvent être ajoutés ou supprimés par les utilisateurs donc, quand ils sont ajoutés ou supprimés les cluetips doivent être ajoutés ou supprimés. Malheureusement, il semble que la supprimer ne peut pas supprimer les références à l'ancre en raison de la fermeture (http://www.ibm.com/developerworks/web/library/wa-memleak/) qui provoque la fuite. Quelle version de I.E. avez-vous utilisé pour tester cela? Comme I.E. 6 et 7 ne peuvent pas faire face à ce genre de fuite – Andrew

+0

Merci pour le rappel sur les wildards.Les autres objets cloutés semblent être nettoyés de la façon dont je l'ai maintenant. Mais cela pourrait être plus probable parce que je nettoie l'objet parent qui a l'ID "cluetip". – Andrew