2009-11-30 8 views
2

Je tente de repeupler un menu déroulant. Je fais un appel ajax pour récupérer myList. Lorsque j'ai la nouvelle liste, je supprime toutes les options de l'élément select et j'insère les nouvelles valeurs (environ 100 options). Cela fonctionne très bien sur les versions ultérieures d'IE et Firefox; l'actualisation est presque instantanée. Cependant, sur IE6, ces opérations ralentissent vraiment le navigateur. La liste déroulante devient presque animée lorsque les options sont supprimées, et cela continue pendant plusieurs secondes. Existe-t-il un moyen d'accélérer cela en dehors de la comparaison de l'ancienne liste avec la nouvelle et en supprimant/ajoutant uniquement les éléments qui ont changé?Suppression des options de select dans IE6

$("#myselect").children.remove(); 

$.each(myList, function(i, val) { 
    $("<option>").attr("value", val.myID) 
       .text(val.myText) 
       .appendTo("#myselect"); 
}); 
+3

Vous pouvez essayer de masquer le contrôle entre deux modifications pour vous assurer qu'il n'essaie pas de rendre les modifications. – NibblyPig

+0

Btw, vous pouvez remplacer $ ('# mySelect'). Children(). Remove() avec $ ('mySelect'). Empty(); –

Répondre

2

Et si vous créiez un nouvel élément et le désactiviez?

var newSelect = $("<select></select>"); 
$.each(myList, function(i, val) { 
    $("<option>").attr("value", val.myID) 
       .text(val.myText) 
       .appendTo(newSelect); 
}); 
$("#myselect").replaceWith(newSelect); 
+0

On dirait que cela devrait fonctionner, et ce serait simple comme tarte. Je rapporterai. :) – Chris

+0

Cela l'accélère de plusieurs secondes et corrige le retrait "animé". IE6 est encore un peu lent, mais cela semble être la meilleure solution. Merci! – Chris

2

Bien que votre code est beaucoup plus agréable, si elle est trop lent, allez la route directe (je l'ai fait dans le passé, avant d'utiliser jQuery, et il a été instantanée dans tous les navigateurs, y compris IE6). il suffit de retirer tous les enfants de la sélection en supprimant le code html:

$("#myselect").html(''); 

Et modifier la boucle de sorte que vous créez le code html pour chaque option, et l'insérer dans la sélection à l'aide

$('#myselect').html(optionsHTML); 

Selon les performances, vous pouvez essayer un compromis entre cette solution et la solution de karim79 (par exemple, supprimer les options avec html(), et les ajouter en utilisant le tableau au lieu de créer du code HTML).

+0

J'aime aussi cette idée, car vous n'avez pas à souffler l'élément select. .html ('') a également corrigé le problème children.remove(). – Chris

+0

Cela a résolu mon problème de performance où $ ("# myListBox"). Empty() dans IE8 prenait plus de 3 secondes pour effacer une zone de liste où Firefox prenait 30ms. Pour être juste, il y avait plus de 2500 articles, mais cela n'explique pas la différence d'ordre de grandeur des performances. – Nick

Questions connexes