Pregunta:
¿Cuál es la forma más eficiente de crear elementos HTML usando jQuery?
Responder:
Como se trata de jQueryeso, creo que es mejor usar este enfoque (limpio) (que está usando)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
MANIFESTACIÓN.
De esta manera, incluso puede usar controladores de eventos para el 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');
MANIFESTACIÓN.
Pero cuando se trata de muchos elementos dinámicos, debe evitar agregar eventos handlersen un elemento en particular, en su lugar, debe usar un controlador de eventos delegado, 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');
}
MANIFESTACIÓN.
Por lo tanto, si crea y agrega cientos de elementos con la misma clase, es decir ( myClass), se consumirá menos memoria para el manejo de eventos, ya que solo un controlador estará allí para hacer el trabajo para todos los elementos insertados dinámicamente.
Actualización: ya que podemos usar el siguiente enfoque para crear un elemento dinámico
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
Pero el sizeatributo no puede establecerse usando este enfoque usando jQuery-1.8.0o más tarde y aquí hay un informe de error antiguo , mire este ejemplo usando jQuery-1.7.2que muestra que el sizeatributo está configurado para 30usar el ejemplo anterior pero usando el mismo enfoque que no podemos establecer sizeusando el atributo jQuery-1.8.3, aquí es un violín que no funciona . Entonces, para establecer elsize atributo, podemos usar el siguiente enfoque
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
O este
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
Podemos pasar attr/propcomo un objeto hijo, pero funciona en jQuery-1.8.0 and laterversiones, consulte este ejemplo pero no funcionará en jQuery-1.7.2 or earlier(no probado en todas las versiones anteriores).
Por cierto, tomado del jQueryinforme de error
Hay varias soluciones Lo primero es no usarlo en absoluto, ya que no le ahorra espacio y esto mejora la claridad del código:
Aconsejaron utilizar el siguiente enfoque ( funciona también en los anteriores , probado en 1.6.4)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
Entonces, es mejor usar este enfoque, OMI. Esta actualización se realiza después de leer / encontrar esta respuesta y en esta respuesta muestra que si usa en 'Size'(capital S)lugar de 'size'eso, funcionará bien , incluso enversion-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
Lea también sobre el accesorio , porque hay una diferencia, Attributes vs. Propertiesvaría según las versiones.