Quel est le moyen le plus efficace de créer des éléments HTML en utilisant jQuery?

Récemment, j'ai fait beaucoup de pop-ups de fenêtre modale et ce qui ne l'est pas, pour lequel j'ai utilisé jQuery. La méthode que j'ai utilisée pour créer les nouveaux éléments sur la page a été massivement le long des lignes de:

$("<div></div>");

Cependant, j'ai le sentiment que ce n'est pas la meilleure ou la méthode la plus efficace pour le faire. Quelle est la meilleure façon de créer des éléments dans jQuery du point de vue des performances?

Cette réponse a les repères aux suggestions ci-dessous.

402
demandé sur Community 2008-11-29 05:15:53

12 réponses

J'utilise $(document.createElement('div')); l'analyse comparative montre cette technique est la plus rapide. Je suppose que c'est parce que jQuery n'a pas à l'identifier comme un élément et à créer l'élément lui-même.

Vous devriez vraiment exécuter des benchmarks avec différents moteurs Javascript et peser votre audience avec les résultats. Prenez une décision à partir de là.

290
répondu strager 2013-03-27 05:15:09

Personnellement, je suggère (pour la lisibilité):

$('<div>');

Quelques chiffres sur les suggestions jusqu'à présent (safari 3.2.1 / mac os x):

var it = 50000;

var start = new Date().getTime();
for (i = 0; i < it; ++i)  {
  // test creation of an element 
  // see below statements
}
var end = new Date().getTime();
alert( end - start );                

var e = $( document.createElement('div') );  // ~300ms
var e = $('<div>');                          // ~3100ms
var e = $('<div></div>');                    // ~3200ms
var e = $('<div/>');                         // ~3500ms              
160
répondu Owen 2008-11-29 04:44:07

Question:

Quel est le moyen le plus efficace de créer des éléments HTML en utilisant jQuery?

Réponse:

Comme il s'agit de jQuery Alors je pense qu'il est préférable d'utiliser cette approche (propre) (vous utilisez)

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'text':'Text Only',
}).on('click', function(){
    alert(this.id); // myDiv
}).appendTo('body');

Démo.

De Cette façon, vous pouvez même utiliser des gestionnaires d'événement pour l'élément spécifique comme

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'style':'cursor:pointer;font-weight:bold;',
    'html':'<span>For HTML</span>',
    'click':function(){ alert(this.id) },
    'mouseenter':function(){ $(this).css('color', 'red'); },
    'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');

Démo.

Mais lorsque vous avez affaire à beaucoup d'éléments dynamiques, vous devriez éviter d'ajouter event handlers dans un élément particulier, vous devez plutôt utiliser un gestionnaire d'événements délégué, comme

$(document).on('click', '.myClass', function(){
    alert(this.innerHTML);
});

var i=1;
for(;i<=200;i++){
    $('<div/>', {
        'class':'myClass',
        'html':'<span>Element'+i+'</span>'
    }).appendTo('body');
}

Démo.

Donc, si vous créez et ajoutez des centaines d'éléments avec la même classe, c'est-à-dire (myClass), moins de mémoire sera consommée pour la gestion des événements, car un seul gestionnaire sera là pour faire le travail pour tous les éléments insérés dynamiquement.

Update: puisque nous pouvons utiliser l'approche suivante pour créer un élément dynamique

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    'size': '30'
}).appendTo("body");

Mais le size attribut ne peut pas être défini en utilisant cette approche en utilisant jQuery-1.8.0 ou plus tard Et voici un ancien rapport de bogue , regardez cet exemple en utilisant jQuery-1.7.2 qui montre que size attribut est défini sur 30 en utilisant l'exemple ci-dessus mais en utilisant la même approche, nous ne pouvons pas définir size attribut en utilisant jQuery-1.8.3, Voici un violon non fonctionnel. Donc, pour définir l'attribut size, nous pouvons utiliser l'approche suivante

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    attr: { size: "30" }
}).appendTo("body");

Ou celui-ci

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    prop: { size: "30" }
}).appendTo("body");

Nous pouvons passer attr/prop en tant qu'objet enfant mais il travaille dans jQuery-1.8.0 and later versions vérifier cet exemple mais ne fonctionne pas dans jQuery-1.7.2 or earlier (pas testé dans toutes les versions antérieures).

BTW, tiré de jQuery rapport de bogue

Il y a plusieurs solutions. Le premier est de ne pas l'utiliser du tout, puisque il ne vous économiser de l'espace et améliore la clarté de la code:

Ils conseillé d'utiliser l'approche suivante (œuvres dans les précédents ainsi, testé dans 1.6.4)

$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");

Donc, il est préférable d'utiliser cette approche, OMI. Cette mise à jour est faite après avoir lu / trouvé cette réponse et dans cette réponse montre que si vous utilisez 'Size'(capital S) au lieu de 'size' alors il va juste fonctionner correctement , même dans version-2.0.2

$('<input>', {
    'type' : 'text',
    'Size' : '50', // size won't work
    'autofocus' : 'true'
}).appendTo('body');

Lisez aussi à propos de prop , car il y a une différence, Attributes vs. Properties, elle varie selon les versions.

149
répondu The Alpha 2017-05-23 12:02:56

En fait, si vous faites $('<div>'), jQuery utilisera également document.createElement().

(Il suffit de jeter un oeil à ligne 117).

Il y a une surcharge d'appel de fonction, mais à moins que les performances ne soient critiques (vous créez des centaines [des milliers] d'éléments), il n'y a pas beaucoup de raisons de revenir à plain DOM.

Créer simplement des éléments pour une nouvelle page web est probablement un cas dans lequel vous vous en tiendrez le mieux à la façon jQuery de faire les choses.

36
répondu edwin 2014-01-02 18:17:51

Si vous avez beaucoup de contenu HTML (plus qu'un simple div), vous pouvez envisager de construire le HTML dans la page dans un conteneur caché, puis de le mettre à jour et de le rendre visible en cas de besoin. De cette façon, une grande partie de votre balisage peut être pré-analysée par le navigateur et éviter de s'enliser par JavaScript lorsqu'il est appelé. Espérons que cette aide!

20
répondu Collin Allen 2008-11-29 03:00:47

Ce n'est pas la bonne réponse pour la question mais je voudrais partager cela...

En utilisant simplement document.createElement('div') et en sautant JQuery, vous améliorerez beaucoup les performances lorsque vous voulez créer beaucoup d'éléments à la volée et les ajouter à DOM.

20
répondu Irshad 2014-01-02 18:20:02

Je pense que vous utilisez la meilleure méthode, bien que vous puissiez l'optimiser pour:

 $("<div/>");
15
répondu tvanfosson 2008-11-29 02:22:14

Vous n'avez pas besoin de performances brutes d'une opération que vous effectuerez extrêmement rarement du point de vue de la CPU.

11
répondu yfeldblum 2008-11-29 02:42:23

Vous devrez comprendre que la signification des performances de création d'éléments n'est pas pertinente dans le contexte de l'utilisation de jQuery en premier lieu.

Gardez à l'esprit qu'il n'y a pas de but réel de créer un élément à moins que vous ne l'utilisiez réellement.

Vous pouvez être tenté de tester les performances de quelque chose comme $(document.createElement('div')) vs. $('<div>') et obtenir d'excellents gains de performance en utilisant $(document.createElement('div')) mais c'est juste un élément qui n'est pas encore dans le DOM.

Cependant, à la fin de la journée, vous pourrez vous voulez utiliser l'élément de toute façon, donc le test réel devrait inclure f. ex. .appendTo ();

Voyons, si vous testez ce qui suit les uns contre les autres:

var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');

Vous remarquerez que les résultats varient. Parfois, une façon est plus performante que l'autre. Et c'est seulement parce que la quantité de tâches d'arrière-plan sur votre ordinateur change au fil du temps.

Testez-vous ici

Donc, à la fin de la journée, vous voulez choisir le plus petit et le plus lisible de la création d'un élément. De cette façon, au moins, vos fichiers de script seront les plus petits possibles. Probablement un facteur plus important sur le point de performance que la façon de créer un élément avant de l'utiliser dans le DOM.

9
répondu Jani Hyytiäinen 2014-01-02 18:14:43

Quelqu'un a déjà fait un test: document jQuery.createElement équivalent?

$(document.createElement('div')) est le grand gagnant.

8
répondu Erel Segal-Halevi 2017-05-23 12:26:32

Un point est que cela peut être plus facile à faire:

$("<div class=foo id=bar style='color:white;bgcolor:blue;font-size:12pt'></div>")

Ensuite, pour faire tout cela avec des appels jquery.

7
répondu Tobiah 2010-09-23 21:21:37

J'utilise jquery.min v2. 0. 3 . C'est pour moi préférable d'utiliser ce qui suit:

var select = jQuery("#selecter");
jQuery("`<option/>`",{value: someValue, text: someText}).appendTo(select);

Comme suit:

var select = jQuery("#selecter");
jQuery(document.createElement('option')).prop({value: someValue, text: someText}).appendTo(select);

Temps de Traitement du premier code est beaucoup plus faible que le deuxième code.

3
répondu Marcel GJS 2016-11-24 12:26:37