2009-09-21 4 views
2

J'ai écrit une application pour une utilisation hors ligne (avec Google Gears) sur les appareils utilisant IE Mobile. Les appareils subissent des fuites de mémoire à un rythme tel que l'appareil devient inutilisable avec le temps. La page de problème récupère les entrées de la base de données locale Gears et affiche une table de chaque entrée avec un lien dans la dernière colonne de chaque ligne pour ouvrir l'entrée (le lien est juste onclick = "open ('myID')"). Quand ils l'ont fait avec l'entrée, ils retournent à la table, ce qui est RE-rendu. C'est le bâtiment répété de cette table qui semble être le problème. Principalement les événements onclick.Comment puis-je empêcher les fuites de mémoire dans IE Mobile?

Le tableau est généré essentiellement comme ceci:

var tmp=""; 
for (var i=0; i<100; i++){ 
tmp+="<tr><td>row "+i+"</td><td><a href=\"#\" id=\"LINK-"+i+"\""+ 
    " onclick=\"afunction();return false;\">link</a></td></tr>"; 
} 

document.getElementById('view').innerHTML = "<table>"+tmp+"</table>"; 

J'ai lu sur des causes communes de fuites de mémoire et essayé de placer l'événement onclick pour chaque lien vers « null » avant de re-rendu de la table mais il semble toujours y avoir une fuite.

Quelqu'un a-t-il des idées?

Dans le cas où il importe, la fonction appelée de chaque lien ressemble à ceci:

function afunction(){ 
document.getElementById('view').style.display="none"; 
} 

Would qui constituent une référence circulaire de quelque façon?

Jake

+0

Revenez? La fermeture du navigateur libère complètement la mémoire. Faire une "fermeture en douceur" améliore les performances lorsque vous l'ouvrez de nouveau mais ne libère pas la mémoire. L'appareil est un XDA Orbit 2. –

Répondre

0

Je ne sais pas si cela va aider à la mémoire, mais au lieu de concaténer vos cordes, vous pouvez les pousser sur un tableau et les rejoindre pour une meilleure performance. Quelque chose comme:

var tmp=[]; 
for (var i=0; i<100; i++){ 
tmp.push("<tr><td>row "+i+"</td><td><a href=\"#\" id=\"LINK-"+i+"\""+ 
    " onclick=\"afunction();return false;\">link</a></td></tr>"); 
} 

document.getElementById('view').innerHTML = "<table>"+tmp.join('')+"</table>"; 
+0

Ceci est un bon conseil, mais votre exemple contient encore beaucoup de chaînes. – rpetrich

0

Si vous faites beaucoup de script qui modifie le contenu de la page il y a une fuite de mémoire IE qui a été mentionné dans un livre ancien AJAX, je l'ai utilisé dans le passé (et il peut bien être frapper votre ici). Quand une page est déchargée, vous devez effacer les divs/span/etc que vous avez modifiés, sinon leur contenu restera en mémoire. Essayez quelque chose comme

<script type="text/javascript"> 
window.onunload = clearAJAXContent; 

function clearAJAXContent() { 
/* clear any dynamic content placeholders here*/ 
} 
</script> 

Je crois que lorsque vous effacez, vous voulez définir innerHTML sur "". Quand je rentrerai à la maison, j'essaierai de trouver le livre et de mettre à jour ma réponse s'il y a quelque chose de différent, mais cela devrait vous donner quelque chose à tester entre temps

Questions connexes