Domanda:
Qual è il modo più efficiente per creare elementi HTML usando jQuery?
Risposta:
Dato che si tratta jQuery
quindi penso che sia meglio usare questo approccio (pulito) (che stai usando)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
DEMO.
In questo modo, puoi persino usare i gestori di eventi per l'elemento specifico come
$('<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.
Ma quando hai a che fare con molti elementi dinamici, dovresti evitare di aggiungere un evento handlers
in un particolare elemento, invece, dovresti usare un gestore di eventi delegato, come
$(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.
Pertanto, se si creano e accodano centinaia di elementi con la stessa classe, ovvero ( myClass
), verrà consumata meno memoria per la gestione degli eventi, poiché sarà presente un solo gestore per fare il lavoro per tutti gli elementi inseriti dinamicamente.
Aggiornamento: poiché possiamo utilizzare il seguente approccio per creare un elemento dinamico
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
Ma l' size
attributo non può essere impostato usando questo approccio usando jQuery-1.8.0
o successivamente e qui c'è una vecchia segnalazione di bug , guarda questo esempio usando jQuery-1.7.2
quale mostra che l' size
attributo è impostato 30
sull'esempio sopra ma usando lo stesso approccio non possiamo impostare l' size
attributo usando jQuery-1.8.3
, qui è un violino non funzionante . Quindi, per impostare l' size
attributo, possiamo usare il seguente approccio
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
O questo
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
Siamo in grado di passare attr/prop
come un oggetto figlio ma funziona in jQuery-1.8.0 and later
versioni controllare questo esempio , ma non funzionerà in jQuery-1.7.2 or earlier
(non testato in tutte le versioni precedenti).
A proposito, tratto dal jQuery
bug report
Esistono diverse soluzioni. Il primo è di non usarlo affatto, poiché non ti fa risparmiare spazio e questo migliora la chiarezza del codice:
Hanno consigliato di usare il seguente approccio ( funziona anche in quelli precedenti , testato in 1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Quindi, è meglio usare questo approccio, IMO. Questo aggiornamento viene effettuato dopo aver letto / trovato questa risposta e in questa risposta mostra che se si utilizza 'Size'(capital S)
invece di 'size'
allora funzionerà correttamente , anche inversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Leggi anche su prop , perché c'è una differenza, Attributes vs. Properties
varia attraverso le versioni.