DEV Community

Cover image for HTMLCollection ve NodeList Kavramları
Emin Altan
Emin Altan

Posted on

1

HTMLCollection ve NodeList Kavramları

HTMLCollection ve NodeList Kavramları

Merhaba arkadaşlar bugün HTMLCollection ile NodeList konularına değineceğim.

Yazıda:

  • HTMLCollection ve NodeList kavramına
  • Aralarındaki benzerliklere ve farklara
  • live collection ve static collection terimlerine
  • Koleksiyonlara erişim yöntemlerine
  • Koleksiyonların döngülerde kullanımına
  • Neye göre koleksiyonları kullanacağımıza

Değineceğim.

İyi okumalar dilerim.

HTML Collection Nedir?

Belirlediğimiz bir kritere göre DOM elementlerinden bir liste oluşturabiliriz. Bu listeye HMTLCollection adı verilir. Liste spesifik bir içerikten (child elementlerden), aynı tag'a sahip veya aynı class ismini kullanan HTML elementlerinden oluşabilir.

Örnek

Aşağıdaki örnekte üç tane <button> elementinde btn class'ı tanımlanmış. Bu elementleri getElementsByClassName() metoduyla HTML DOM'dan seçiyor ve HTMLCollection haline getiriyoruz.

<button class="btn">First button</button>
<button class="btn">Second button</button>
<button class="btn">Third button</button>

<script>
  const buttonElements = document.getElementsByClassName("btn");
  console.log(buttonElements);
</script>

a HTMLCollection

Dönen değer görünürde array veri türüne benzer ancak bir HTMLCollection array veri türü özelliğine sahip değildir.

NodeList Nedir?

Bir node list DOM ağacındaki bağımsız bir elementtir. Bu elementler attribute veya text içeriklerinden oluşabilir.

Örnek

Aşağıdaki örnekte querySelectorAll() metodu ile HTML ağacındaki btn class'ına sahip elementleri seçerek NodeList şeklinde liste döndürüyoruz.

<button class="btn">First button</button>
<button class="btn">Second button</button>
<button class="btn">Third button</button>

<script>
  const buttonElements = document.querySelectorAll(".btn");
  console.log(buttonElements);
</script>

a NodeList

HTMLCollection ile NodeList Arasındaki Benzerlikler

Her ikisi de array türünde görünse de aslında array özelliğine sahip değillerdir.

Array veri türlerinde olduğu gibi liste içerisindeki öğelere index değerleri ile erişebiliriz ve length property'sini kullanabiliriz. Böylece bir koleksiyonun ne kadar uzun olduğunu öğrenebiliriz.

Örnek

Aşağıdaki örnekte <div> elementi üç tane <p> elementinden oluşuyor. Bu elementler paragraph adında bir class'a sahip. Elementlerden ilkine ulaşalım ve içeriğini konsola yazdıralım. İşlemi gerçekleştirirken elementleri HTMLCollection şeklinde listede tutalım.

<div>
  <p class="paragraph">First paragraph</p>
  <p class="paragraph">Second paragraph</p>
  <p class="paragraph">Third paragraph</p>
</div>

<script>
  // getElementsByClassName() metodu HTMLCollection listesi döndürecektir.
  const paragraphs = document.getElementsByClassName("paragraph");

  // paragraphs değişkeninin içeriği HTMLCollection şeklinde konsola yazdırılacaktır.
  console.log(paragraphs);

  // İlk paragrafı konsola yazdırıyoruz.
  let firstParagraph = paragraphs[0];
  console.log(firstParagraph);

  // paragraphs değişkeninin uzunluğunu konsola yazdırıyoruz.
  console.log(paragraphs.length);
</script>

a HTMLCollection

Örnek

Aynı örneği şimdi NodeList için yapalım. İşlemi gerçekleştirirken getElementsByClassName() metodu yerine querySelectorAll() metodunu seçtiğimize dikkat edin.

<div>
  <p class="paragraph">First paragraph</p>
  <p class="paragraph">Second paragraph</p>
  <p class="paragraph">Third paragraph</p>
</div>

<script>
  // querySelectorAll() metodu NodeList listesi döndürecektir.
  const paragraphs = document.querySelectorAll(".paragraph");
  console.log(paragraphs);

  // İlk paragrafı konsola yazdırıyoruz.
  let firstParagraph = paragraphs[0];
  console.log(firstParagraph);

  // paragraphs değişkeninin uzunluğunu konsola yazdırıyoruz.
  console.log(paragraphs.length);
</script>

a NodeList

HTMLCollection ile NodeList Arasındaki Farklılıklar

Element node'ları bir HTML elementinden (mesela <p>) oluşabileceği gibi attribute veya elementin içeriğinden de oluşabilir.

❗ Bir HMTLCollection yalnızca element node'larından oluşurken NodeList diğer node türlerinden de oluşabilir.

Örnek

Aşağıdaki örnekte <div> elementi üç tane <p> node'undan ve çeşitli text node'larından oluşmuş.

<div> içerisindeki element özellikli (<p>) node'ları HTMLCollection olarak listelenirler.

<div> elementi içerisindeki tüm node'lar (text'ler ve HTML elementleri) NodeList olarak listelenirler.

<div>
  This is a text
  <p class="paragraph">First paragraph</p>
  <p class="paragraph">First paragraph</p>
</div>

<script>
  const divElement = document.querySelector("div");

  console.log(divElement.children); // HTMLCollection listesi döndürecektir.
  console.log(divElement.childNodes); // NodeList listesi döndürecektir.
</script>

a collection of all types

Live Collections ve Static Collections

live collection ve static collection kavramları bir HTML dokümanın içeriğine yeni bir element ekleme, çıkarma gibi işlemler sonucunda veya güncelleme yapıldığında ne şeklide tepki vereceğini ifade eder.

live collection'lar HTML dokümanının yapısında bir değişiklik olduğunda otomatik güncellenirken static collection'lar güncellenmez.

HTMLCollection'lar live collection özelliğine sahiptir.

Örnek

Aşağıdaki örnekte HTML DOM tree'ye yeni bir <p> elementi ekleniyor. HTMLCollection otomatik güncellenecektir.

<p>Paragraph One</p>
<p>Paragraph Two</p>
<p>Paragraph Three</p>

<script>
  // HTMLCollection geri döndürür.
  const paragraphs = document.getElementsByTagName("p");

  console.log("BEFORE UPDATE: ", paragraphs);

  const newParagraph = document.createElement("p");
  document.body.appendChild(newParagraph);

  console.log("AFTER UPDATE: ", paragraphs);
</script>

Güncelleme öncesi HTMLCollection üç tane <p> elementinden oluşuyordu. Yeni element eklendikten sonra HTMLCollection otomatik olarak güncellenecektir ve HTMLCollection listesi dört öğeden oluşacaktır.

a HTMLCollection

NodeList'ler genelde static collection özelliklidir fakat duruma göre live collection olarak da kullanılabilir. Bir NodeList'i static collection olarak oluşturmak için querySelectorAll() metodundan faydalanırız.

💡 Bir NodeList'in live collection şeklinde oluşmasını istiyorsak getElementByName() metodunu kullanırız.

Örnek

<p>Paragraph One</p>
<p>Paragraph Two</p>
<p>Paragraph Three</p>

<script>
  // HTMLCollection geri döndürür.
  const paragraphs = document.getElementsByTagName("p");

  console.log("BEFORE UPDATE: ", paragraphs);

  const newParagraph = document.createElement("p");
  document.body.appendChild(newParagraph);

  console.log("AFTER UPDATE: ", paragraphs);
</script>

Güncelleme öncesi NodeList üç tane <p> elementinden oluşuyordu. Yeni element eklendikten sonra NodeList güncellenmeyecektir.

a NodeList

Koleksiyonlara Erişim Yöntemi

HTMLCollection listesi ile NodeList listesi içerisindeki öğelere erişim yöntemleri birbirinden farklılık gösterir.

HTMLCollection listesindeki öğelere:

  • Elementin index değeri ile

  • id attribute ile birlikte indexItem() metodunu birlikte kullanarak

  • Herhangi bir attribute ile birlikte indexItem() metodunu birlikte kullanarak

Örnek

<div id="container">
  <button
    id="btn1"
    name="first-name"
  >
    First Button
  </button>
  <button id="btn2">Second Button</button>
  <button id="btn3">Third Button</button>

  <script>
    const container = document.querySelector("#container");
    const buttons = container.children; // HTMLCollection geri döndürecektir.

    console.log(buttons[0]); // Index ile erişim yöntemi
    console.log(buttons.namedItem("btn1")); // id attribute ile erişim yöntemi
    console.log(buttons.namedItem("first-name")); // name attribute üzerinden erişim yöntemi
  </script>
</div>

a HTMLCollection

NodeList'deki bir elemente erişim sadece index değerini kullanarak yapılabilmektedir.

Örnek

<div id="container">
  <button
    id="btn1"
    name="first-name"
  >
    First Button
  </button>
  <button id="btn2">Second Button</button>
  <button id="btn3">Third Button</button>

  <script>
    const container = document.querySelector("#container");
    const buttons = container.childNodes; // NodeList listesi döndürüyor.

    console.log(buttons[1]); // Index değeri ile NodeList içerisindeki ilk element konsola yazdırılır.
    console.log(buttons.namedItem("btn1")); // Hata mesajı döndürür.
    console.log(buttons.namedItem("first-name")); // Hata mesajı döndürür.
  </script>
</div>

a NodeList

Koleksiyonları Döngülerde Nasıl Kullanırız.

HTMLCollection'lar array veri türüne dönüştürülmediği sürece array metotları ile birlikte veya döngülerde kullanılamazlar.

Ancak NodeList'de forEach() metodu kullanılabilir. Diğer array metotlarını NodeList array veri türüne dönüştürülmediği sürece kullanamayız.

Örnek

HTMLCollection döngüde kullandığımızda hata mesajı alırız.

<button class="btn">First button</button>
<button class="btn">Second button</button>
<button class="btn">Third button</button>

<script>
  // Sonuç HTMLCollection şeklinde döndürülecektir.
  const allButtons = document.getElementsByClassName("btn");

  // Hata mesajı ile karşılaşırız.
  allButtons.forEach((button) => console.log(button));
</script>

an error HTMLCollection

Aynı örneği NodeList için yapalım.

Örnek

<button class="btn">First button</button>
<button class="btn">Second button</button>
<button class="btn">Third button</button>

<script>
  // Sonuç NodeList şeklinde döndürülecektir.
  const allButtons = document.querySelectorAll(".btn");

  // forEach() metodu NodeList için çalışacaktır.
  allButtons.forEach((button) => console.log(button));
</script>

a HTMLCollection

💡 Eğer HTMLCollection'larını array veri türüne dönüştürmeden döngü içerisinde kullanmak istersek for..of statement'dan faydalanabiliriz.

Örnek

<button class="btn">First button</button>
<button class="btn">Second button</button>
<button class="btn">Third button</button>

<script>
  // Sonuç HTMLCollection şeklinde döndürülecektir.
  const allButtons = document.getElementsByClassName("btn");

  for (button of allButtons) {
    console.log(button);
  }
</script>

a HTMLCollection

Sonuç

Eğer HTML dokümanının otomatik olarak güncellenmesini istiyorsak HTMLCollection kullanmalıyız. Şayet döküman içeriğini otomatik güncellenmesini istemiyorsak NodeList kullanmalıyız.

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay