2010-05-24 7 views
9

Was ist der Unterschied zwischenappendChild + create

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

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

und

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

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

sollten beide nicht die gleiche sein? und wenn nicht, wie bekomme ich die 2. Version zur Arbeit?

Antwort

17

Das spätere ist reines HTML für ein Element, während zuerst das Objekt ist. Für den ersten brauchen Sie appendChild während für den späteren, benötigen Sie innerHTML.

sollten nicht beide gleich sein? und wenn nicht, wie bekomme ich die 2. Version zu arbeiten?

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

Wenn Sie mit der Antwort zufrieden sind, sollten Sie diese als akzeptiert markieren. Beachten Sie, dass '+ =' der Operator ist, der dem 'append'-Verhalten am nächsten kommt, nicht' = '. –

+0

"Das spätere ist reines HTML ...". Es ist nur eine Zeichenfolge. – Yay295

2

appendChild erwartet, also ein Element, wenn Sie es Text senden, ist es nicht weiß, was zu tun ist. Vielleicht möchten Sie mit einer Javascript-Bibliothek arbeiten, um einige dieser Arbeiten zu erleichtern, wie z. B. jQuery. Ihr Code wäre:

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

Dort _so_ muss ein "festhalten, 2 andere Leute tippen Antworten sofort" Nachricht beim Tippen der Antwort, lol –

+0

, während ich denke, es würde Overhead sein, um jquery * nur * für diese enthalten, es kann immer noch argumentiert werden dass * wenn * OP bereits jQuery verwendet hätte, wäre dies sehr wahrscheinlich die Lösung, die OP am nächsten ist, also denke ich, dass es eine würdige Alternative ist, die nicht verloren gehen sollte, nur weil jemand anderes bereits eine Lösung angeboten hat. –

3

appendChild wirklich tut, erwarten eine HTMLDomNode irgendeiner Art, wie ein HTMLDivElement und kein String. Es kann nicht mit einer Zeichenfolge umgehen. Sie könnten tun

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

aber ich bevorzuge wirklich die erste Version; und ich würde mich mehr darauf verlassen, dass es sich in allen Browsern gleich verhält.

+0

Gibt es Nachteile bei dieser Methode? So erreiche ich das normalerweise. – SwankyLegg

+0

Dies ist nicht bevorzugt, da dies die Ereignis-Listener und auch den Status vorheriger Elemente entfernt hat. – Kurkula

5

Wenn Sie mit Ihrer JS/DOM-Engine Element.appendChild mit einem string als Argument aufrufen, wird ein neuer Knoten Text erstellt und dann hinzugefügt.

Ihr erstes Beispiel erstellt ein <div> Element. Ihr zweites Beispiel erstellt einen Textknoten mit <div></div> als Inhalt.

Ihr zweites Beispiel ist äquivalent zu:

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

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

Als Sarfraz Ahmed mentioned in his answer, können Sie das zweite Beispiel funktioniert, wie Sie es durch Schreiben arbeiten wollen:

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

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

gibt es wirklich einen Browser, bei dem das Übergeben eines String-Arguments dazu führt, dass ein neuer Textknoten erstellt und hinzugefügt wird? in firefox und chrome, dies verursacht nur eine illegale argument ausnahme, und nichts ist hinzugefügt: http://jsbin.com/omofo3/edit –

+0

@ David Hedlund, ich erklärte das Verhalten des Plakats erlebt. Ich habe keine Browser getestet (wahrscheinlich sollte ich haben). Du hast recht; Dies scheint ein Ausnahmefall zu sein. – strager

1

Die einfachste Lösung und unterstützen alle Browser ist:

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

Eine andere Lösung kann sein:

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

Sie auch die/jeweils prepend ein Element zu dem DOM anhängen können:

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

verwenden elem variable das Element (Eg) zum Ziel:

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

etc.