No uses innerHTML, usa DOM

August 20th, 2007 26 comments

A pesar de que innerHTML sea relativamente mucho más rápido, existen ciertas cuestiones que hacen más recomendable el uso de DOM para manejar documentos xHTML.

  • innerHTML no es un estándar, es una propiedad de Microsoft (al igual que outerHTML).
  • Se supone en un futuro innerHTML no funcionará en los documentos xHTML basados en el MIME type application/xhtml+xml.
  • Una de las diferencias principales entre innerHTML y DOM es que el primero es un string y el segundo una estructura de objetos jerárquica (un árbol). Meter un string en un objeto es una auténtica chapuza, por llamarlo de algún modo.
  • Perdemos interacción con el objeto (fijar atributos, cambiar valores, …) al ser un string.

Crear un elemento

innerHTML

document.getElementById("contenedor").innerHTML =
                    "<div id=\"capa\" >Texto<!--comentario--></div>";

DOM

div = document.createElement("div");
div.setAttribute("id", "capa");
texto = document.createTextNode("Texto");
div.appendChild(texto);
div_comentario = document.createComment("comentario");
div.appendChild(div_comentario);
document.getElementById("contenedor").appendChild(div);

Obtener el texto de un elemento

innerHTML

texto = document.getElementById("contenedor").innerHTML

DOM

texto = document.getElementById("contenedor").firstChild.nodeValue;

Crear varios elementos

innerHTML

data = new Array("one","two","three");
mHTML = "<ul>";
for(i=0; i<data.length; i++) {
	mHTML+="<li>" + data[i] + "";
}
mHTML+="</ul>";
document.getElementById("contenedor").innerHTML = mHTML;

DOM

data = new Array("one", "two", "three");
eUL = document.createElement("ul");
for(i=0; i<data .length; i++) {
	eLI = document.createElement("li");
	eLI.appendChild(document.createTextNode(data[i]));
	eUL.appendChild(eLI);
}
document.getElementById("contenedor").appendChild(eUL);

Más información | SlayerOffice
Más información | Mozilla Developer Center

26 Responses to No uses innerHTML, usa DOM

  • Dani

    Hola Alfonso.

    Si no recuerdo mal, el problema de no utilizar innerHTML es que hay muchas cosas del DOM que explorer 6 no soportaba el 7 no lo sé.

    Por poco que nos pueda gustar si el navegador de M$ no soporta algo, toca hacerlo a su manera, no queda otra.

  • Alfonso Jiménez

    Hola Daniel. Esa no es la actitud ni mucho menos. Yo programo usando estándares, si alguien no puede usarlo es su problema (o más bien de su navegador). A veces pienso que es una estragegia comercial de Microsoft, obligar a que programen para su producto. Si programas para Internet Explorer, no estás nada más que haciendo un favor a Microsoft.

    Un saludo

  • Dani

    Te doy toda la razón del mundo, mi problema es que quien paga manda, si les digo a mis jefes o a los clientes que se debe usar un navegador que no sea explorer, ya se sabe donde me mandarían ;)

  • Alfonso Jiménez

    Lo sé, te entiendo perfectamente, pero si el apoyo no es unánime seguirá todo igual.

    Un saludo!

  • LoBo

    Bueno jamas conseguirás ese acorde unanime pq siempre habrá alguien q no este de acuerdo :) pero una cosa simple y tal… yo solo quiero introducir texto a un div q tengo con un id… como lo haría con el dom? pq veo ahi mucha parafernalia de crear elementos y tal… pero solo quiero meterle un texto only eso… lo q sería la primera opción del innerhtml pero en algo más sencillo pq el elemento div ya está creado…

  • Alejandro

    Amigos… no está mal programar en un entorno M$, pero lo cierto es que no todos los navegadores del mundo son IE y es muy grave que nuestros clientes nos digan que nuestra web no corre bien en Firefox u otro navegador, solo por no utilizar un estandar o en su defecto validar el navegador para saber que metodo o eventos utilizar.

    Particularmente me inclino por los estandares y DOM es definitivamente una mejor forma de hacer las cosas…

  • Carlangas

    en mi humilde opinion, el DOM es un coñazo.

    Escribir setenta lineas de código JavaScript, para lo que te supondría una linea de html. Que si crea elemento, asignale atributos, clase, eventos, y ahora appenChild y seguimos con sus hijos….

    Es muy bonita, su estructura gerarquica, pero me cansa muchisimo. Al final acabo recurriendo a HTML2DOM, pero son solo chapuzas.

    En mi opinion, (y soy absolutamente contrario a microsoft, a sus imposiciones, a su güindous, a sus navegadores y a sus IDEs) (y lo dice alguien que programa en php páginas usando el notepad++, y probandolas en Firefox antes que en IE) (PHP, notepad++ y firefox son software libre para el que no lo sepa)…
    pues eso, que en mi opinion, lo del innerHTML es una de las pocas cosas buenas que ha inventado microsoft.
    ala, ahora echaros encima :D

  • tepehuani

    xDDDDDDDDD

    que burrada, entonces algo estoy haciendo mal, en mi script uso el innerHTML y me funciona de maravilla con el firefox, pero si lo pruebo con el IE del moco$oft nomas no jala, no me muestra nada.

  • sss

    bueno es myuy buena a herramienta del innerHTML
    que mas da aun no hay nada definido en estandares de HTML los estandares los estan poniendo las empresas asi que no nos mintamos los pocos estandares de la W3C que e podido leer no me han ayudado de mucho y sigo buscando un estandar definitivo y que en verdadayude en algo pero aun no lo encuentro espero hacerlo pronto y si alguien tiene algun estandar mandemelo pls seria muy importante ese aporte

  • fissha

    En principio soy partidario del software standard. En mi caso siempre he testeado la página web en IE, Firefox y Mac(asi de sofis). Lo bueno de usar software standard es que sirve para todos, y lo malo es que es mas limitadito en efectos. Hay rutinas javascript que detectan el navegador, con lo que una opción es hacer diferentes efectos para diferentes navegadores (o los mismos con diferentes instrucciones). Creo que esto es lo mas profesional, no olvidarse de los otros navegadores. Y mal que nos pese, uno de ellos es IE, de Microsoft.

  • hcrow

    Pues la respuesta es mas que simple, a los que dicen que InnerHTML es mejor pk es mas facil… pues les tengo la respuesta, es la estrategia de m$, una aparente simplificacion hace malos programadores, hace hacer creer que los estandares no funcionan o no sirven para nada, y al final tenemos miles de paginas web mediocres, sin estandares y al que le tienen que estar haciendo “chapuzas” como dicen, para que les funcione aqui o halla, la solucion es simple, yo no me complico la vida, W3C quien fue el ignorante que dijo que no sirve para nada, si es la organizacion mundial que establece los estandares jajajja se escribe el codigo HTML, el CSS y luego los validas con el validador de HTML y CSS respectivamente sin siquiera probarlo en algun navegador!!!! si el validador lo acepta, tiene que verse bien en cualquier navegador que maneje estandares, sin chapuzas ni nada!!!
    Sin un estandar todo es mediocre, miren m$ ni siquiera para sus software’s tienen un estandar y ahi ven los resultados.

  • Roberto

    gracias, para mis propositos el dom me funcionó de maravillas, mientras que el innerhtml no me sirvió

  • Juan de Dios

    Si tu aplicación se demora 10 veces más usando uno u otro cual utilizas tal vez sólo lo utices para crear pocos elementos. pero cuando haces una interface llena de elementos que refrescan buscas la velocidad aún en los navegadores estándares la velocidad es 3 veces más, qué necesito hacer para que mi aplicación sea más rápida si mi refresco de elementos es lenta… Todo buen programador de Javascript que se precie de serlo domina el DOM a su antojo pero para crear una cantidad de elementos que sólo tengan una funcionalidad específica utilizará innerHTML.

  • Juan de Dios

    Tal vez te pueda interesar : http://blog.stevenlevithan.com/archives/faster-tha...
    Una manera de optimizar las cosas. Saludos!

  • hola

    window.location=”http://www.cristalab.com”;

  • Alvaro

    “Yo programo usando estándares, si alguien no puede usarlo es su problema” Es joda no?

  • Miguel

    Bueno para los q no sabian el innerHTML aunq sea obra de microsoft se va aprbar como estandar para el html5 o ya aprobo solo es cuestion de tiempo, aunq forma un mal habito, es mas rapido q el DOM (no en programarlo xq programar en DOM es sencillo, sino en ejecucion es mas lento).

    Saludos.

  • CARLOS

    Quiero comentarles un detalle que me sucedio utilizando DOM y innerHTML, cuando se modifica el valor de un nodo NodeValue con DOM, si se consulta el valor el valor esta cargado, pero no se visualiza en pantalla el cambio cosa que si sucede con innerHTML.
    Esta particularidad me sucedio con IE6 e IE7 (cosa rrara.)

  • ivan.andrade

    Me parece muy atinado tu comentario, pero hace unas semanas estaba desarrolando la creacion dinamica de contenidos y resulta que en IExplorer(mas de 40% de usuarios potenciales) nunca ude hacer que me creara el objeto a través de DOM habra que buscar alguna alternativa que sea crossbrowser y estandar

  • LC

    Una verdadeta estupidez, es cierto que hay que hacer las cosas bien, pero tambien hay que hacerlas compatibles y si no es 100% compatible con IE (aunque este no cumpla los estandares sigue siendo muy usado) y FF no sirve, simple y sencillamente eso.

  • Rene

    Tuve el caso de querer usar innerHTML sobre un objeto table y no funciona en Explorer 7, use el innerHTML sobre un objeto y funciona sin ningun problema.
    Aqui el ejemplo
    la defincion de la tabla era:

    y en una funcion JavaScript usaba algo como esto

    var html = “Hola”;
    document.getElementById(‘tmicros’).innerHTML = html;

    lo cual nunca funciono. Hice el siguiente cambio y funciono sin problemas

     

    y la funcion de Java quedo igual y listo, todo funciono a la perfeccion.

    Todo parece ser que en IE7 la propiedad innerHTML no la soportan las Tablas.

    Espero sirva de algo mi ejemplo.
    Saludos.
    y en mi particular punto de vista Internet Explorer es un asco!! :-P pero es lo que mas usan. Ni hablar.

    Saludos

  • pepito grillo

    tur arguentos son incorrectos a la hora de definir innerHTML

    cuando inyectas un string a traves de innerHTML es el propio navegador el que se encarga de transformar la cadena de texto a los tags que correspondan con sus propias referencias al DOM, con sus atributos, estilos, etc…

    puedes acceder a los nuevos nodos de la forma habitual a traves de javascript si quieres

    curiosamente, esto fue una invención de microsoft para explorer, pero es quien peor lo implementa, porque al inyectar dos veces en el mismo lugar, en el caso de que el string sea largo, hace que el navegador muestre errores en el motor de render, volviendose el este inestable

    un saludo

  • Rene

    Rene cual es el cambio, que no lo escribiste y tengo el mismo probelma

  • Jairo Adolfo

    Estoy absolutamente de acuerdo con tu artículo, y pienso que innerHTML puede ser mas simple de usar en muchas ocasiones (así como en otras puede no funcionar en absoluto), pero no es el camino correcto: tarde o temprano habrá que hacer correcciones.

Leave a Reply