Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 7 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

HTML template etiketi ne işe yarar?​


Bu rehber, declarative Shadow DOM özellikleri kullanılmayan klasik HTML template şablonunu anlatır. Bu etiket, sayfa açılırken doğrudan görüntülenmeyen HTML parçalarını hazırlamak için kullanılır. Bu içerik, JavaScript tarafından gerektiğinde kopyalanıp sayfaya eklenir. Böylece kart, tablo satırı, liste öğesi veya modal gibi tekrar kullanılacak arayüz parçalarını HTML içinde bir şablon olarak tutabilirsiniz.

Nasıl çalışır?​


<template> içindeki HTML, normal DOM ağacının görünür bir parçası değildir. Tarayıcı bu içeriği parse eder ancak ekranda göstermez ve içindeki kaynakları normal sayfa içeriği gibi çalıştırmaz. JavaScript, şablonun content özelliğinden bir DocumentFragment alır. Ardından cloneNode(true) ile şablonun kopyasını oluşturup hedef elemana ekler.

Şablonun içindeki öğeleri ararken doğrudan template.querySelector() yerine çoğunlukla template.content.querySelector() kullanılmalıdır. Çünkü şablon içindeki öğeler, <template> öğesinin normal alt öğeleri olarak değerlendirilmez.

Çalışan en küçük örnek​


Aşağıdaki örnek, bir ürün şablonunu iki kez kopyalar ve ürün adını JavaScript ile değiştirir:

Kod:
<ul id="product-list"></ul>

<template id="product-template">
  <li class="product"></li>
</template>

<script>
  const template = document.querySelector('#product-template');
  const list = document.querySelector('#product-list');
  const products = ['Kalem', 'Defter'];

  for (const name of products) {
    const item = template.content.cloneNode(true);
    item.querySelector('.product').textContent = name;
    list.appendChild(item);
  }
</script>

Örneği bir HTML dosyasına yerleştirip tarayıcıda açtığınızda listede “Kalem” ve “Defter” görünür. Sonuç görünmüyorsa önce #product-list ve #product-template seçicilerinin doğru olduğundan emin olun. Ayrıca item.querySelector() çağrısının, şablondaki .product sınıfıyla eşleştiğini kontrol edin.

Uygulama sırası şöyledir:

  1. Tekrar kullanılacak HTML parçasını <template> içine alın.
  2. JavaScript ile şablonu document.querySelector() kullanarak seçin.
  3. Şablon içeriğinin derin kopyasını template.content.cloneNode(true) ile kopyalayın.
  4. Kopyadaki metinleri veya nitelikleri değiştirin.
  5. Kopyayı appendChild() ya da uygun bir DOM ekleme yöntemiyle hedef elemana ekleyin.

Benzer yöntemlerden farkı​


Seçim, içeriğin sayfada başlangıçta görünür olup olmamasına ve kaç kez kullanılacağına göre yapılmalıdır.

YöntemBaşlangıçta görünür mü?Uygun kullanım
<template>HayırJavaScript ile üretilecek tekrar kullanılabilir parçalar
<div hidden>DOM’da bulunur ancak gizlidirGizlenip sonradan gösterilecek mevcut içerik
Sunucu taraflı şablonOluşturulan HTML’ye bağlıdırİçeriği sunucuda üretmek

<template> kullanmak, tek başına veri bağlama, döngü kurma veya otomatik bileşen üretme özelliği sağlamaz. Veriyi doldurma, kopyayı ekleme ve olay davranışlarını tanımlama işlerini JavaScript ya da sunucu tarafı kodu yapmalıdır. Kullanıcı etkileşimi gerekiyorsa olay dinleyicilerini oluşturulan öğelere ekleyin veya uygun durumlarda olay delegasyonu kullanın.

Sık sorulan sorular​


template.content doğrudan eklense de tekrar kullanılabilir mi?​

DocumentFragment’i doğrudan hedefe eklemek içindeki düğümleri taşır ve fragment’i boşaltır. Şablonu tekrar kullanmak için derin kopyasını ekleyin. Custom element içeren şablonlarda hedef belgenin tanımlarıyla kopyalama için document.importNode(template.content, true) tercih edilebilir.

Şablondaki id ve olay dinleyicileri kopyalarda nasıl ele alınır?​

Aynı id değerini her kopyada tekrarlamayın; örnekte bu yüzden .product sınıfı kullanılır. cloneNode, addEventListener ile bağlanan dinleyicileri kopyalamaz; dinleyiciyi yeni öğeye ekleyin veya üstkapsayıcıda olay delegasyonu kullanın. Kullanıcı metnini örnekteki gibi textContent ile doldurmak, onu HTML olarak ayrıştırmaz.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic