2010-12-22 7 views
8

Ce morceau de code suivant fonctionne, mais il rend un peu bizarre le navigateur. Rien de majeur. Je me demande s'il y aurait un moyen de rendre cela plus efficace? Puis-je utiliser la mise en cache ou peupler d'une manière ou d'une autre, puis la copier dans l'autre 5. (Il y a 6 listes déroulantes avec une classe de 'masque' sur la page.)plus efficace jquery

Toute aide serait grandement appréciée!

$('.mask').each(function() { 
    $(this).append($('<option/>').val("").text("")); 
    for (var i = 1; i < 256; i++) { 
     $(this).append($('<option/>').val(i).text(i)); 
    } 
    }); 
}); 

Répondre

12

Vous pouvez créer les nœuds une fois puis clone, comme ceci:

var temp = $('<select/>'); 
$('<option/>').val("").text("").appendTo(temp); 
for (var i = 1; i < 256; i++) { 
    $('<option/>').val(i).text(i).appendTo(temp); 
} 
temp.children().clone().appendTo('.mask'); 

Au lieu de faire beaucoup d'individu ajoute au DOM (ce qui est très coûteux), lots tous les éléments en place dans un fragment de document, les clone ensuite, en les ajoutant par lots (un lot par sélection).

+0

Quelqu'un peut-il expliquer pourquoi cela est préférable même si ce n'est pas aussi rapide que la solution ci-dessus? –

+0

@Kyle - il est plus sûr d'utiliser la création DOM de vos noeuds, par exemple une citation dans la valeur, etc (bien sûr dans * ce cas particulier *) entraînera des problèmes, HTML invalide et un rendu imprévisible. Pour être sûr, respectez les méthodes de création DOM, pas HTML via la génération de chaîne. –

6

Il est beaucoup plus rapide (environ 3-10 fois, comme testé here) pour construire le code HTML vous-même dans une seule chaîne:

var html = "<option value=''></option>"; 
for (var i = 1; i < 256; i++) { 
    html += "<option value='" + i + "'>" + i + "</option>"; 
} 
$(".mask").append(html); 

Voir test de performance comparant les options actuelles dans ce fil: http://jsperf.com/appending-options-jquery

+0

Ceci est évidemment la solution la plus rapide, mais il ne semble pas être ce que tout le monde préfère utiliser? Quelqu'un peut-il expliquer pourquoi ce n'est pas aussi bon qu'une solution ci-dessous? –