Dado que tengo que insertar varias etiquetas, parece tener sentido usar innerHTML.
Solo "several"? Entonces la velocidad no es un problema. Cuando creas cien tienes que pensar en lo que estás haciendo. El problema no es realmente la creación, sino la manipulación de la lista de nodos secundarios que se vuelve cada vez más lenta a medida que se agregan cada elemento adicional.
En cuanto a anexar, realmente no tiene otra opción. No puedes configurar el innerHTML sin perder el contenido existente, así que a menos que estés satisfecho con serializarlo y volver a analizarlo (lo que borra cualquier información no serializable como el contenido del formulario, las propiedades/referencias de JavaScript y los manejadores de eventos) terminas estableciendo el innerHTML de otro elemento y moviendo a cada niño más de uno por uno. Esto es lo que hacen muchos frameworks y generalmente termina más lento que el manual create-and-appendChild.
Dependiendo de su situación (específicamente: ¿cuántos nodos secundarios ya están en el elemento de destino y cuántos va a agregar?) Puede ser más rápido descomponer la operación en manipulaciones más pequeñas en un Fragmento de documento, cuyos hijos se puede agregar a los elementos de un elemento de una vez en vez de uno por uno. Esto es mucho más rápido. Desafortunadamente, no es posible configurar innerHTML
en un DocumentFragment.
También puede haber hacks más rápidos utilizando objetos Range para mover una carga de HTML a la vez, pero desafortunadamente los Rangos son altamente variables entre navegadores. Me parece, sin embargo, que alguien debería ser capaz de construir un append-html rápido de IE's range.pasteHTML y W3's range.extractContents. ¿Alguien listo para eso?
Por lo que yo puedo decir, crear/añadir nodo simplemente le impide crear código no válido
marcado potencialmente no válidos no sólo significa pausas de aplicación en algunos navegadores. Cuando estás ciegamente empalmando juntos HTML sin escapar como un idiota:
element.innerHTML= '<a href="'+url+'">'+title+'</a>';
entonces usted tiene un agujero de seguridad-site-scripting cruz de cliente que es tan malo como del lado del servidor uno.
Puede, por supuesto, comprometerse, creando los elementos y configurando su contenido en pasos separados. Por ejemplo:
element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
var row= element.firstChild.rows[i];
row.cells[0].firstChild.data= urls[i];
row.cells[1].firstChild.href= urls[i];
}
(string.repeated no es de JavaScript estándar, pero su uso aquí es obvio.)
Usando el enlace de prueba de velocidad innerHTML vs fragmentos en Win7: - Firefox 10.0.2 ambos métodos realizaron aproximadamente el mismo (¡uno diferente fue ligeramente más rápido cada vez!) - Chrome (16.0.912.75 m) innerHtml fue consistentemente 50% más rápido. –