Comment puis-je forcer le Javascript de collecte des ordures dans IE? C'est à dire est très lent après les appels AJAX & manipulation du DOM
J'ai une page avec enchaîné menus déroulants. Le choix d'un option
à partir de la première select
remplit le deuxième, et le choix d'un option
à partir de la deuxième select
retourne un tableau de résultats correspondant à l'aide de la innerHtml
fonction sur un vide div
sur la page.
Le problème est, une fois que j'ai fait mes sélections et une quantité considérable de données est mis sur la page, tous les Javascript sur la page fonctionne exceptionnellement lentement. Il me semble que si toutes les données que j'ai tiré vers l'arrière via AJAX pour remplir la div
est encore monopolisant beaucoup de mémoire. J'ai essayé de réglage de la restitution de l'objet qui contient l'AJAX résultats de null
après l'appel de innerHtml
mais avec pas de chance.
Firefox, Safari, Chrome et Opéra ne montrent pas de dégradation des performances lorsque j'utilise Javascript à insérer un grand nombre de données dans le DOM, mais dans IE, il est très apparente. Pour tester que c'est un Javascript/DOM question plutôt qu'un simple vieux IE problème, j'ai créé une version de la page qui renvoie tous les résultats sur la charge initiale, plutôt que via AJAX/Javascript, et trouvé que IE n'avait pas de problèmes de performances.
Pour info, je suis en utilisant jQuery jQuery.obtenez méthode à exécuter l'appel AJAX.
MODIFIER C'est ce que je fais:
<script type="text/javascript">
function onFinalSelection() {
var searchParameter = jQuery("#second-select").val();
jQuery.get("pageReturningAjax.php",
{SEARCH_PARAMETER: searchParameter},
function(data) {
jQuery("#result-div").get(0).innerHtml = data;
//jQuery("#result-div").html(data); //Tried this, same problem
data = null;
},
"html");
}
</script>
Je tiens à souligner que cela ne devient un problème quand le retour data
est assez grand. Elle est directement liée à la taille, que je suis capable de voir ralentissement modéré de la taille moyenne des résultats et le seul grand ralentissement quand il est à quelques centaines de dossiers + retournés.
OriginalL'auteur aw crud | 2010-05-03
Vous devez vous connecter pour publier un commentaire.
Utilisation
html()
utilise jQueryempty
méthode qui travaille très dur pour empêcher les fuites de mémoire.avez-vous essayé:
Je pense il y a d'autres problèmes de performances de votre code responsable de la lenteur. Est votre retour des données à l'aide de la png avec transparence alpha? J'ai vu que tuer IE6 (lorsque l'alpha filtre est appliqué) et de ralentir IE7 considérablement.
Êtes-vous les événements de liaison pour les lignes, les cellules, le texte à l'intérieur des cellules? Combien de données sont vous insérer?
Il y a plus de 2000 lignes, pour un total de ~250kb. Je ne suis qu'à la liaison d'un événement unique sur la DIV qui contient l'ensemble du jeu de résultats.
donc, vous avez vraiment besoin de 2000 lignes importées en même temps? pouvez-vous important en morceaux/pages?
La requête est assez compliqué et prend plusieurs secondes à s'exécuter si je retourne à 10 lignes ou 1000 lignes. La pagination n'est pas vraiment réalisable. La nature des données que l'utilisateur veut faire défiler rapidement pour localiser les entrées importantes, de sorte que même si l'enregistrement des résultats dans la mémoire, et de faire de la pagination de cette façon, travaillé, il serait briser le flux.
OriginalL'auteur David Murdoch
Vous pouvez forcer la collecte des ordures dans IE à l'aide de la CollectGarbage fonction, par exemple
JScript garbage collector est décrite en détail dans cette entrée de blog: http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx
Que le blog dit, le GC n'est pas prévisible, de sorte de suppression des données ou data = null sera pas de récupérer la mémoire immédiatement, mais il finira par récupérer.
Mais je doute que votre performance pénalité est vraiment causé par l'utilisation de la mémoire; je pense que c'est un problème avec DOM rendu.
savez-vous si cela doit être ajouté à chaque fichier javascript dans mon application?
Je ne suis pas complètement sûr si cela est vrai avec JS, mais dans d'autres langues, lors de la Collecte des Ordures est forcé de pousser tous les objets survivants dans la prochaine génération - qui peut être très préjudiciable si vous vous retrouvez en poussant beaucoup d'objets transitoires dans les générations suivantes.
OriginalL'auteur ignaZ
Si quelqu'un ne s'intéresse pas seulement dans IE:
À force de collecte des ordures dans Gecko:
Lien
OriginalL'auteur Max