Question:
Quelle est la façon la plus efficace de créer des éléments HTML à l'aide de jQuery?
Réponse:
Puisqu'il s'agit jQuery
alors je pense qu'il vaut mieux utiliser cette approche (propre) (vous utilisez)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
DEMO.
De cette façon, vous pouvez même utiliser des gestionnaires d'événements 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');
DEMO.
Mais lorsque vous traitez avec beaucoup d'éléments dynamiques, vous devez éviter d'ajouter un événement handlers
dans un élément particulier, à la place, vous devez 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');
}
DEMO.
Donc, si vous créez et ajoutez des centaines d'éléments avec la même classe, c'est-à-dire ( myClass
), alors 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.
Mise à jour: 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 l' 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 l' size
attribut est défini en 30
utilisant l'exemple ci-dessus mais en utilisant la même approche, nous ne pouvons pas définir d' size
attribut en utilisant jQuery-1.8.3
, ici est un violon qui ne travaille pas . Donc, pour définir l' size
attribut, 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
comme un objet enfant mais il fonctionne dans les jQuery-1.8.0 and later
versions vérifier cet exemple , mais il ne fonctionnera pas dans jQuery-1.7.2 or earlier
(non testé dans toutes les versions antérieures).
BTW, extrait du jQuery
rapport de bogue
Il existe plusieurs solutions. La première consiste à ne pas l'utiliser du tout, car cela ne vous fait pas économiser d'espace et cela améliore la clarté du code:
Ils ont conseillé d'utiliser l'approche suivante ( fonctionne également dans les versions antérieures , testé dans 1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Il est donc préférable d'utiliser cette approche, l'OMI. Cette mise à jour est effectuée après avoir lu / trouvé cette réponse et dans cette réponse montre que si vous utilisez à la 'Size'(capital S)
place, 'size'
cela fonctionnera bien , même dansversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Lisez également à propos de prop , car il y a une différence Attributes vs. Properties
, elle varie selon les versions.