2012-12-17 18 views
5

JavaScript ve DOM ile çalışmaya başladım, en azından bir süre için jQuery ve benzerinden uzak durmaya çalışıyorum. Bunu göz önünde bulundurarak, öğreticiler, genellikle bu gibi bir örnek sağlar:Temel DOM zincirini anlama

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

bu düzene ve değişkenleri önlemek için bir girişim olarak, başarıyla aşağıdaki zincirleme: Bu çalışır

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

, denedim aşağıdaki ile

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

:

aşağıdaki başa getirebilir operasyonu kısaltmak için

Ancak bu sefer istenildiği gibi çalışmadı: metin, BODY öğesinin sonuna yerleştirildi ve bir ekleme yerine bir ekleme elde edildi.

Başarılı ilk durumda sadece bir fluke olduğunu hayal ediyorum ama bu zincirleme uygulamasında neyin yanlış olduğunu göremiyorum. Yanlış yerlerde paranteziniz var demektir

+1

: Eğer .parentNode özelliğini kullanmak gerekir tek satırda Bunu başarmak için) 'createElement()' den sonra parantezler. Yani zincir appendChild() yöntemi ile devam etmiş gibi görünüyor. Beni şaşırtan, bir hata beklerdim. –

+1

Böyle bir zincirleme, bu yöntemlerin nasıl çalıştığını anlamanın bir yolu olarak ilginç olsa da, sonuç okumak daha zordur. Tüm ifadeyi görmek için sağa kaydırmak biraz can sıkıcı bir şey olsa da, '.appendChild()' den önce veya bir veya daha fazla yöntemle açılış parantezinden sonra bir satır sonu koyabilirsiniz ... – nnnnnn

+1

"Aktarmak için bir küçültme aracı kullanın ve değişkenlerden kaçının "- kodunuzu okumak, sürdürmek ve uzatmak için daha da zorlaştırıyorsunuz. – jbabey

cevap

6

Satır:

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

olması gerektiği Nasıl:

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

Şimdi bu genellikle bir satırda tüm birleştirmek için kötü bir fikir olduğunu anlamak.

Tamam, bu sabit satır size kodunuzun 'değişkenlerle' davranışını tam olarak vermeyecektir. Bunun nedeni, .appendChild öğesinin alt öğelerini (sizin durumunuzda <H1>) değil, alt DOM öğesini (sizin durumunuzda <INPUT>) döndürmesidir. Ancak, <H1> DOM öğesinin tümünün belgenin başında eklenmiş olmasını istiyorsunuz.

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

Çocuklar, bu eğitim amaçlı sadece böyle kodu kullanabilirsiniz etmeyiniz))) Size `insertBefore (kapattığım

+0

'.appendChild()' ın _child_ öğesini döndürdüğünü unutmayın, bu nedenle yalnızca parantezler arasında geçiş yapmak sorunu çözmeyecektir. – nnnnnn

+0

bu bir "sorun" değil). Sadece parantez içinde onun hatasını gösterdi. Buradaki tüm diğer kodlar "değişkenlerden kaçınmak" dır, bu da en az – SergeyS

+0

sayısının hatasız olup olmadığını, tüm OP "gereksinimlerini" – SergeyS