422 votes

Ce qui est le moyen le plus efficace pour créer des éléments HTML à l’aide de jQuery ?

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

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

Cependant, je me fais de la insidieux sentiment que ce n'est pas la meilleure ou la méthode la plus efficace de le faire. Quelle est la meilleure façon de créer des éléments dans jQuery à partir d'un point de vue des performances?

http://stackoverflow.com/a/268520/32943 a la référence pour les réponses ci-dessous

307voto

strager Points 41713

J’utilise `` analyse comparative montre cette technique est le 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 courir les repères avec différents moteurs Javascript et peser votre public avec les résultats. A partir de là, prendre une décision.

163voto

Owen Points 36009

personnellement, je dirais (pour plus de lisibilité) :

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

154voto

WereWolf - The Alpha Points 49671
What is the most efficient way to create HTML elements using jQuery?

Comme il s'agit de jQuery alors je pense que c'est mieux de l'utiliser (propre) approche (que vous utilisez)

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

La 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');

La DÉMO.

Mais quand vous avez affaire avec beaucoup d'éléments dynamiques, vous devez éviter d'ajouter de l'événement handlers , en particulier de l'élément, au lieu de cela, vous devez utiliser un délégué du gestionnaire d'événement, 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');
}

La DÉMO.

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

Mise à jour : Depuis que nous pouvons utiliser l'approche suivante pour créer un élément dynamique de la

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

Mais l' size d'attribut ne peut pas être défini à l'aide de cette approche à l'aide de jQuery-1.8.0 ou plus tard, et voici un vieux rapport de bug, regardez cet exemple à l'aide de jQuery-1.7.2 ce qui montre que size de définir l'attribut 30 à l'aide de l'exemple ci-dessus mais en utilisant la même approche, nous ne pouvons configurer size d'attribut à l'aide de jQuery-1.8.3, ici, c'est un non-travail violon. Donc, pour définir l' size d'attribut, on peut 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 comme un enfant de l'objet, mais il fonctionne en jQuery-1.8.0 and later versions vérifier cet exemple , mais il ne fonctionne pas en jQuery-1.7.2 or earlier (pas testé dans toutes les versions antérieures).

BTW, prises à partir d' jQuery rapport de bug

Il existe plusieurs solutions. La première est de ne pas l'utiliser à tous, depuis il ne vous économiser de l'espace et améliore la clarté de la code:

Ils conseillé d'utiliser l'approche suivante (travaux dans les précédents ainsi, testé en 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, de l'OMI. Cette mise à jour est faite après que j'ai lu/trouvé cette réponse et cette réponse montre que si vous utilisez 'Size'(capital S) au lieu de 'size' alors il sera juste , beau travail, même dans version-2.0.2

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

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

37voto

edwin Points 1497

En fait, si vous vous débrouillez $('<div>'), jQuery va également utiliser document.createElement().

(Il suffit de prendre un coup d'oeil à la ligne 117).

Il y a une certaine fonction-appel de la surcharge, à moins que la performance est critique (vous êtes en train de créer des centaines [en milliers] des éléments), il n'y a pas beaucoup de raisons de revenir à la plaine de DOM.

Juste de créer les éléments d'une nouvelle page web est probablement un cas dans lequel vous allez mieux s'en tenir à la jQuery façon de faire les choses.

20voto

Irshad Points 101

Ce n’est pas la bonne réponse pour la question, mais encore, je tiens à partager cette...

En utilisant juste `` et sauter JQuery améliorera les performances beaucoup quand vous voulez faire beaucoup d’éléments à la volée et ajouter à Dom

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X