2010-05-24 11 views
9

¿Cuál es la diferencia entreappendChild + createElement

var div = document.createElement('div');//output -> [object HTMLDivElement] 

document.getElementById('container').appendChild(div); 

y

var div = '<div></div>'; 

document.getElementById('container').appendChild(div);//output -> <div></div> 

debe ser ambos del mismo? y si no, ¿cómo consigo que funcione la segunda versión?

Respuesta

17

Lo último es html puro para un elemento, mientras que el primero es el objeto. Para el primero, necesita appendChild, mientras que para el posterior, necesita innerHTML.

no deberían ser iguales? y si no es , ¿cómo obtengo la 2da versión para ?

var div = '<div></div>'; 
document.getElementById('container').innerHTML = div; 
+6

si está satisfecho con la respuesta, debe marcarla como aceptada. tenga en cuenta que '+ =' es el operador que más se aproxima al comportamiento 'append', no' = '. –

+0

"El último es html puro ...". Es solo una cadena. – Yay295

2

appendChild está a la espera de un elemento de modo que cuando se envía el texto, que no sabe qué hacer. Es posible que desee considerar el uso de una biblioteca de JavaScript para facilitar parte de ese trabajo, como jQuery. El código sería:

$('#container').append('<div></div>'); 
+2

Hay _so_ tiene que ser un mensaje 'espera, otras 2 personas están escribiendo respuestas ahora mismo' al escribir la respuesta, lol –

+0

mientras que creo que sería sobrecarga incluir jquery * solo * para esto, todavía se puede argumentar que * si * OP ya estaba usando jQuery, esta podría haber sido la solución más cercana a lo que OP quería, así que creo que es una alternativa digna, que no debería perderse solo porque alguien más haya ofrecido una solución. –

3

appendChild realmente hace esperar una HTMLDomNode de algún tipo, como por ejemplo un HTMLDivElement, y no una cadena. No sabe cómo lidiar con una cadena. Usted puede hacer

document.getElementById('container').innerHTML += div; 

pero realmente prefiero la primera versión; y confío más en que se comporte igual en todos los navegadores.

+0

¿Hay alguna desventaja en este método? Así es como típicamente logro esto. – SwankyLegg

+0

esto no se prefiere ya que esto eliminó los detectores de eventos y también el estado de los elementos anteriores. – Kurkula

5

Con su motor JS/DOM, llamando al Element.appendChild con un string como argumento, se crea un nuevo nodo Text y luego se agrega.

Su primer ejemplo crea un elemento <div>. Su segundo ejemplo crea un nodo de texto con <div></div> como su contenido.

Su segundo ejemplo es equivalente a:

var div = '<div></div>'; 

document.getElementById('container').appendChild(document.createTextNode(div));//output -> <div></div> 

Como Sarfraz Ahmed mentioned in his answer, puede hacer que el segundo trabajo de ejemplo cómo desea que funcione por escrito:

var div = '<div></div>'; 

document.getElementById('container').innerHTML = div; 
+0

¿Existe realmente algún navegador donde pasar un argumento de cadena cause que se cree y añada un nuevo nodo de texto? en Firefox y Chrome, esto solo causa una excepción de argumento ilegal, y no se agrega nada: http://jsbin.com/omofo3/edit –

+0

@David Hedlund, estaba explicando el comportamiento que estaba experimentando el póster. No probé ningún navegador (probablemente debería haberlo hecho). Tienes razón; esto parece ser un caso excepcional. – strager

1

La solución más simple y apoyar todas las navegadores es:

var div = '<div></div>'; 
var parser = new DOMParser(); 
var myDiv = parser.parseFromString(html, "text/xml"); 

Otra solución puede ser:

var div = '<div></div>'; 
var tmpDiv = document.createElement('div'); 
    tmpDiv.innerHTML = div; 

    elDiv = tmpDiv.childNodes[0]; //Now it can be used as an element 
0

También puede utilizar estos para anexar/prepend un elemento a la DOM respectivamente:

var elem = document.documentElement.appendChild(document.createElement(element)); 
var elem = document.documentElement.prepend(document.createElement(element)); 

y utilizar la variable elem para orientar el elemento (por ejemplo):

elem.style.display = "block"; 
elem.style.remove(); 
elem.style.id = ...; 

etc.

Cuestiones relacionadas