Bonjour,
J’ai un gros problème en javascript avec les closures. J’explique mon affaire : je réalise un treeview en javascript pour le boulot.
La particularité de ce treeview tient au fait que les niveaux se chargent progressivement. C'est-à-dire que pour des raisons de performances (les treeviews pouvant comporter plusieurs milliers d’éléments), je ne charge que les nœuds de premier niveau au départ. Lorsque l’utilisateur deploie un nœud alors les niveaux suivants sont affichés, etc… Tout se passe côté client.
J’ai donc implémenté deux classes javascript, une qui s’appelle treeview, et une qui s’appelle tvNode. Je tenais à ce que toutes les fonctions comme le deploiement des nœuds ou encore le highlight d’un nœud ne soient pas des fonctions globales, mais internes à ces deux classes sous forme de méthodes, de façon à pouvoir réutiliser le code au maximum. Je n’utilise donc pas de innerHTML, et je crée mes nœuds avec le DOM et j’assigne mes gestionnaires d’évènements (comme celui gérant le deploiement/reduction d’un nœud) en utilisant addEventListener ou attachEvent. En effet mon treeview doit marcher sur IE et Firefox.
Or, je bute sur un problème de taille ; le code suivant marche sous IE, Firefox et Chrome, mais il y a une grosse fuite de mémoire sous IE 6 et 7 (il semblerait que ça ne le fasse pas avec IE 8). J’ai beaucoup surfé sur le net pour y remédier et j’ai essayé beaucoup de solutions proposées. Aucune n’a fait l’affaire.
Dans le fichier zip joint au message se trouve le code du treeview ainsi que le htm et les images qui vont avec. Pour se rendre compte du bug il faut cliquer quelques fois sur les liens (ce qui décharge un treeview et en charge un autre à la place), pour voir la quantité de mémoire utilisée par IE 6 ou 7 grandir dans le gestionnaire des tâches.
Dans le fichier tvProgressif.js, il y a deux endroits intéressants :
/*( 2 ) */ --> c'est là que sont crées les closures. Si on commente ces lignes on n'a plus de fuite mémoire, mais les noeuds des treeviews ne sont plus déployables. Peut être que j'attache ces fonctions aux objets du DOM d'une mauvaise façon, ce qui serait la source de tout mes ennuis
/*( 1 ) */ --> c'est là que je nettoie le DOM avant le chargement d'une nouvelle arborescence, pour éliminer les références circulaires entre le DOM et les fonctions javascripts et ainsi permettre au garbage collector de IE faire son travail de désallocation
Ca n'a malheureusement pas l'air de marcher... peut être y a t'il une meilleure façon de procéder?
Merci beaucoup de m'aider car je galère pas mal et depuis un certain temps sur cette histoire.
PS : j'utilisais innerHTML au début et le problème de fuite mémoire ne se produisait pas, mais bon je préférerais pouvoir utiliser le nouveau qui est bien mieux niveau réutilisabilité
Partager