Pregunta:
¿Cuál es la forma más eficiente de crear elementos HTML usando jQuery?
Responder:
Como se trata de jQuery
eso, 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 handlers
en 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 size
atributo no puede establecerse usando este enfoque usando jQuery-1.8.0
o más tarde y aquí hay un informe de error antiguo , mire este ejemplo usando jQuery-1.7.2
que muestra que el size
atributo está configurado para 30
usar el ejemplo anterior pero usando el mismo enfoque que no podemos establecer size
usando 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/prop
como un objeto hijo, pero funciona en jQuery-1.8.0 and later
versiones, consulte este ejemplo pero no funcionará en jQuery-1.7.2 or earlier
(no probado en todas las versiones anteriores).
Por cierto, tomado del jQuery
informe 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. Properties
varía según las versiones.