2009-12-29 5 views
1

Récemment, je dois exécuter périodiquement le script récupéré via Ajax à partir du serveur Web. Je le fais en créant d'abord une étiquette de Script et assigne l'attribut de texte pour exécuter le manuscrit. Ensuite, je dispose la balise de script juste pour savoir que la mémoire ne cessent d'augmenter à chaque création dans IE 7. Le code HTML suivant illustre le problème:IE fuit la mémoire pour le javascript généré dynamiquement

<html> 
<body> 
<span id='m_garbageBin'></span> 
<script type="text/javascript"> 
    function buttonClicked() 
    { 
     for (var i = 0; i < 100000; i++) 
     { 
      var sc = document.createElement("script"); 
      sc.text = "var x=1;"; 
      document.body.appendChild(sc); 
      m_garbageBin.appendChild(sc); 
      m_garbageBin.innerHTML = ''; 
     } 
    } 
</script> 
<script id='m_dynamicScript' type="text/javascript"> 
</script> 
    <input type='button' value='Click me!' onclick='buttonClicked();'/> 
</body> 

Le script ne fait rien du tout et toujours la mémoire continue d'augmenter à chaque clic sur le bouton dans IE mais pas dans Firefox (en utilisant .innerHTML au lieu de .text). Le fait que je doive récupérer le script à exécuter périodiquement ne peut pas être changé. Quelqu'un sait ce que je peux faire pour éviter l'augmentation de la mémoire dans IE?

+1

ce n'est pas "ajax" –

+0

Où est 'm_garbageBin' défini? En outre, bien sûr, l'utilisation de la mémoire augmente, vous créez 100000 éléments chaque fois que vous exécutez la fonction. –

+0

@Luke: ce qui précède est illustratif du problème, plutôt que d'être le script original de Conrad (probablement, la partie AJAX fonctionne bien). – outis

Répondre

0

essayez delete sc; après avoir défini le innerHTML sur ''.

+0

Merci pour votre suggestion, mais il n'a pas fait l'affaire. – Conrad

+0

L'instruction 'delete' échouera (elle retournera false, et rien ne sera supprimé), car l'instanciation de variable faite dans le contexte d'exécution *" Code de fonction "*, définit les variables avec l'attribut de propriété' {DontDelete} ' , plus d'info: http://bclary.com/2004/11/07/#a-10.2.3 – CMS

3

Essayez de supprimer les éléments script juste après qu'ils sont joints, quelque chose comme ça peut aider:

function buttonClicked() { 
    var head = document.getElementsByTagName('head')[0]; 
    for (var i = 0; i < 100000; i++) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     script.text = "var x=1;"; 
     head.appendChild(script); 
     head.removeChild(script); 
    } 
} 

C'est la façon dont certaines bibliothèques modernes, comme jQuery make it.

Voir aussi:

+0

Pour autant que je sache, IE a un problème concernant la fonction removeChild qui ne libère pas vraiment la mémoire jusqu'à la page est déchargé même un élément est supprimé en utilisant cet appel. Certains se réfèrent à "psuedo-leak": http://www.mail-archive.com/[email protected]/msg05231.html – Conrad

Questions connexes