jQuery ajoutant un tableau d'éléments
Pour le but de cette question permet de dire que nous avons besoin de append()
de 1000 objets de la body
élément.
Vous pouvez aller à ce sujet comme ceci:
for(x = 0; x < 1000; x++) {
var element = $('<div>'+x+'</div>');
$('body').append(element);
}
Cela fonctionne, cependant, il semble inefficace pour moi, car autant que je sache ce qui va causer de 1000 document déplacé. Une meilleure solution serait:
var elements = [];
for(x = 0; x < 1000; x++) {
var element = $('<div>'+x+'</div>');
elements.push(element);
}
$('body').append(elements);
Cependant, ce n'est pas un monde idéal et cela déclenche une erreur Could not convert JavaScript argument arg 0 [nsIDOMDocumentFragment.appendChild]
. Je comprends que append()
ne peut pas gérer des tableaux.
Comment aurais-je à l'aide de jQuery
(je sais à propos de la DocumentFragment nœud, mais que j'ai besoin d'utiliser d'autres fonctions jQuery sur l'élément, telles que .css()
) ajouter un tas d'objets pour les DOM à la fois pour améliorer les performances?
append()
ne pas accepter un tableau de chaînes de caractères.- la réponse que vous avez approuvé l'est encore plus lent que votre première approche. Regardez les journaux de la console dans ce jsfiddle jsfiddle.net/du2TN/2
- intéressant, bien qu'il semble que mon code fonctionne en jQuery 1.8 et est la plus rapide des méthodes jQuery. (mise à jour de votre JSfiddle)
- Bon à savoir 🙂 de toute façon, @jAndi et jackwander la solution est beaucoup plus rapide. Mais si vous préférez utiliser jQuery, quelle que soit vous convient 🙂
- J'ai besoin d'utiliser jQuery comme ils doivent être jQuery objets afin que je puisse utiliser d'autres fonctions jQuery en eux.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un vide objet jQuery au lieu d'un tableau:
Cela peut être utile si vous voulez faire des trucs avec de nouveaux élément généré à l'intérieur de la boucle. Mais notez que cela va créer une énorme pile d'éléments (à l'intérieur de l'objet jQuery).
Il semble bien que votre code fonctionne parfaitement bien avec jQuery 1.8.
.add
et de l'insertion de la finale de l'objet jQuery devrait fonctionner quand même.add
n'a pas de mise à jour de la copie originale..append
comportement a changé avec jQuery 1.8. Il travaille avec des tableaux de jQuery objets maintenant. C'est votre code: jsfiddle.net/7Q6wm/2. Je suppose que vous avez utilisé une version plus ancienne.elements = elemetns.add($div)
paselements.add($div)
elements = elements.add('<div>'+usernames[i]+'</div>');
—comme vous faites référence à 1,8 prend désormais en charge les autres, les gens de créer des objets tels que les suivantselements.push($('<div>', {text: usernames[i]}));
oùtext
HTML échappe à l'entrée pour la sécurité de l'insertion.Vous pourrait simplement appeler
Ou vous pouvez simplement créer une grande chaîne dans la première place.
Comme vous l'avez dit, probablement la plus "bonne" façon est l'utilisation d'une DocFrag. Cela pourrait ressembler à
.textContent
n'est pas pris en charge par IE<9 et il aurait besoin d'un contrôle conditionnel à l'utilisation.innerText
ou.text
à la place.+=
?+=
de cours. Je voulais juste être plus explicite et expresive ici..css()
sur eux. J'ai mis à jour les cas de test dans la question.newDiv.textContent = x;
?Depuis $.fn.ajouter prend un nombre variable d'éléments que nous pouvons utiliser
apply
pour passer le tableau en tant qu'arguments à elle:Cela fonctionne si vous avez un tableau d'objets jQuery. Selon la spécification si vous pouvez ajouter un tableau d'éléments si vous avez les éléments du DOM. Si vous avez un tableau de chaînes html, vous pouvez simplement .join(") et ajouter tout à la fois.
De mise à niveau de jQuery 1.8, cela fonctionne comme prévu:
Une légère modification à votre deuxième approche:
$.append() ne peut certainement ajouter un tableau: http://api.jquery.com/append/
Parfois, jQuery n'est pas la meilleure solution. Si vous avez beaucoup d'éléments à ajouter à la DOM,
documentFragment
est une solution viable:Si vous allez pour la performance brute alors je suggère pure JS, bien que certains prétendent que votre performance en matière de développement est plus important que votre site/le rendement du programme.
Cochez cette lien de repères et une vitrine des différents DOM techniques d'insertion.
edit:
Comme une curiosité,
documentFragment
s'avère être l'un des plus faibles des méthodes.documentFragment
dans un$()
appel, ce qui est probablement ce qui est de le ralentir.documentFragment
est toujours utile si vous allez pour un pur JS solution.Je voudrais utiliser Javascript natif, normalement beaucoup plus rapide:
EDIT:
Là vous allez un jsfiddle avec différentes options de mise en œuvre. Le @jackwander la solution est, clairement, la plus efficace.
appendChild
opérations, qui sera lente.