Merak ediyorum, JavaScript herhangi bir öğeden ilk alt öğeyi almak için çeşitli yöntemler sunuyor, ama hangisi en iyisi? En iyisi, yani: davranışlar söz konusu olduğunda, tarayıcılar arası en uyumlu, en hızlı, en kapsamlı ve öngörülebilir. Takma ad olarak kullandığım yöntemlerin / özelliklerin listesi:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Bu her iki durumda da işe yarar:
var child = elem.childNodes[0]; // or childNodes[1], see below
Bu formlar veya <div>
yineleme durumunda. Metin öğeleriyle karşılaşabilirsem:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Çalışabildiğim kadarıyla firstChild
, NodeList'i kullanır childNodes
ve firstElementChild
kullanır children
. Bu varsayımı MDN referansına dayandırıyorum:
childNode
öğesi, öğe düğümünün ilk alt öğesine veya bir öğenull
yoksa başvurudır .
Hız açısından, eğer varsa, farkın hiçbir şeyin yanında olmayacağını tahmin ediyorum, çünkü firstElementChild
etkili bir şekilde referanstır children[0]
ve children
nesne zaten hafızadadır.
Beni fırlatan şey, childNodes
nesnedir. Bir tablo elemanındaki bir forma bakmak için kullandım. İken children
listeleri tüm form elemanları, childNodes
ayrıca HTML kodundan boşluk içerecek şekilde görünüyor:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Her iki günlük <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Tüm günlükler <input type="text"
… >
. Nasıl olur? Bir nesnenin "ham" HTML koduyla çalışmama izin verdiğini anlıyorum, diğeri DOM'ye yapışıyor, ancak childNodes
öğe her iki düzeyde de çalışıyor gibi görünüyor.
İlk soruma geri dönmek için tahminim şu olurdu: En kapsamlı nesneyi istiyorsam, childNodes
gitmenin yolu budur, ancak kapsamlı olması nedeniyle, istediğim öğeyi döndürmesi açısından en öngörülebilir olmayabilir / herhangi bir anda bekliyoruz. Çapraz tarayıcı desteği de bu durumda zor olabilir, ancak yanlış olabilirim.
Herkes elindeki nesneler arasındaki ayrımı açıklığa kavuşturabilir mi? Eğer ihmal edilebilir bir hız farkı varsa, ben de bilmek isterim. Eğer bunların hepsini yanlış görürsem, beni eğitmekten çekinmeyin.
Not: Lütfen, lütfen, JavaScript'i seviyorum, bu yüzden evet, bu tür şeylerle uğraşmak istiyorum. “JQuery sizin için bununla ilgileniyor” gibi cevaplar aradığım şey değil, dolayısıyla hayırjQuery etiket.