Questão:
Qual é a maneira mais eficiente de criar elementos HTML usando jQuery?
Responda:
Como é sobre jQuery
isso, acho melhor usar essa abordagem (limpa) (você está usando)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
DEMO.
Dessa forma, você pode até usar manipuladores de eventos para o elemento específico, como
$('<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.
Mas quando você lida com muitos elementos dinâmicos, evite adicionar eventos handlers
em um elemento específico. Em vez disso, use um manipulador de eventos delegados, como
$(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.
Portanto, se você criar e anexar centenas de elementos com a mesma classe, ou seja, ( myClass
), menos memória será consumida para manipulação de eventos, porque apenas um manipulador estará lá para fazer o trabalho para todos os elementos inseridos dinamicamente.
Atualização: Como podemos usar a seguinte abordagem para criar um elemento dinâmico
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
Mas o size
atributo não pode ser configurado usando essa abordagem usando jQuery-1.8.0
ou mais tarde e aqui está um relatório de bug antigo , veja este exemplo usando o jQuery-1.7.2
que mostra que o size
atributo está configurado para 30
usar o exemplo acima, mas usando a mesma abordagem que não podemos definir o size
atributo usando jQuery-1.8.3
, aqui é um violino que não funciona . Então, para definir o size
atributo, podemos usar a seguinte abordagem
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
Ou este
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
Podemos passar attr/prop
como um objeto filho, mas ele funciona em jQuery-1.8.0 and later
versões, verifique este exemplo, mas não funcionará emjQuery-1.7.2 or earlier
(não testado em todas as versões anteriores).
BTW, retirado do jQuery
relatório de erro
Existem várias soluções. O primeiro é não usá-lo, pois não economiza espaço e isso melhora a clareza do código:
Eles recomendaram o uso da seguinte abordagem ( funciona também nas anteriores , testadas em 1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Portanto, é melhor usar essa abordagem, IMO. Esta atualização é feita depois que eu li / encontrei esta resposta e, nesta resposta, mostra que se você usar em 'Size'(capital S)
vez de 'size'
, simplesmente funcionará bem , mesmo emversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Leia também sobre prop , porque há uma diferença, Attributes vs. Properties
varia de acordo com as versões.