2012-12-17 11 views
5

Ich beginne mit JavaScript und dem DOM und versuche, zumindest für eine Weile absichtlich von jQuery und ähnlichem Abstand zu halten. Mit dem im Verstand, Tutorials im Allgemeinen ein Beispiel geben, wie dies:Grundlegende DOM-Verkettung verstehen

h = document.createElement("h1"); 
t = document.createTextNode("Hello."); 
h.appendChild(t); 
document.body.appendChild(h); 

In einem Versuch, diese zu optimieren und Variablen zu vermeiden, ich folgende erfolgreich angekettet:

document.body.appendChild(document.createElement("h1")).appendChild(document.createTextNode("Hello.")); 

Während das funktioniert, habe ich versucht, zu verkürzen, die folgende Operation prepend:

h = document.createElement("h1"); 
t = document.createTextNode("Put this on top."); 
h.appendChild(t); 
document.body.insertBefore(h,document.body.firstChild); 

mit folgendem:

document.body.insertBefore(document.createElement("h1")).appendChild(document.createTextNode("Put this on top."),document.body.firstChild); 

Diesmal funktionierte es jedoch nicht wie gewünscht: Der Text wurde am Ende des BODY-Elements platziert, um einen Anhang anstelle eines Vorsatzes zu erhalten.

Ich stelle mir vor, der erfolgreiche erste Fall ist nur ein Zufall, aber ich kann nicht sehen, was mit dieser Verkettungspraxis nicht stimmt.

+1

Sie haben Ihre 'insert geschlossen () 'parens nach dem' createElement() '. Also scheint die Kette mit der 'appendChild()' Methode weitergegangen zu sein. Was mich überrascht, hätte ich einen Fehler erwartet. –

+1

Obwohl die Verkettung so interessant ist, um zu verstehen, wie diese Methoden funktionieren, ist das Ergebnis schwerer zu lesen. Nach rechts scrollen, um die ganze Aussage zu sehen, ist irgendwie ärgerlich, aber Sie können einen Zeilenumbruch vor '.appendChild()' oder nach dem öffnenden Parens von einer oder mehreren Methoden einfügen ... – nnnnnn

+1

Verwenden Sie ein Verkleinerungstool, um "zu rationalisieren und Vermeiden Sie Variablen "- Sie machen Ihren Code nur schwieriger zu lesen, zu pflegen und zu erweitern. – jbabey

Antwort

6

Sie haben Klammern an den falschen Stellen. Ihre Linie:

document.body.insertBefore(document.createElement("h1")) 
.appendChild(document.createTextNode("Put this on top."), document.body.firstChild); 

Wie es sein sollte:

document.body.insertBefore(
    document.createElement("h1").appendChild(
     document.createTextNode("Put this on top.")), document.body.firstChild); 

Jetzt verstehen Sie, warum dies ist in der Regel eine schlechte Idee, alles in einer Zeile zu verschmelzen.

Ok, diese feste Linie gibt Ihnen nicht genaues Verhalten Ihres Codes 'mit Variablen'. Dies liegt daran, dass .appendChild das untergeordnete DOM-Element (in Ihrem Fall <INPUT>) zurückgibt, nicht das übergeordnete Element (<H1> in Ihrem Fall). Aber Sie wollen, dass alle DOM-Element am Anfang des Dokuments hinzugefügt wurde. Um dies zu erreichen in einer Zeile müssen Sie .parentNode Eigenschaft verwenden:

document.body.insertBefore(
    document.createElement("h1").appendChild(
     document.createTextNode("Put this on top.")).parentNode, document.body.firstChild) 

Jungs, bitte einen solchen Code nicht verwenden, das ist nur für Bildungszwecke)))

+0

Beachten Sie, dass '.appendChild()' das Element _child_ zurückgibt, so dass das Umgehen der Klammern das Problem nicht lösen kann. – nnnnnn

+0

das ist kein "Problem")) Ich habe ihm gerade seinen Fehler in Klammern gezeigt. Alle anderen Code hier ist "Variablen zu vermeiden", die sinnlos ist mindestens – SergeyS

+0

siehe aktualisierte Antwort, um alle OP "Anforderungen" zu erfüllen – SergeyS