CodeBlanks Logo Icon CodeBlanks

Proje sonu - Galeri

JavaScript kursu · Orta seviye · Ders 99/134

Galeri uygulamasını tamamlayıp çekme, ızgara ve büyük görünüm akışını çalıştırırsın.

Proje sonu: ana akış

Üç parça hazır: fetchImages veri çekiyor, renderGrid ızgarayı kuruyor, modal büyük görünümü açıyor. Şimdi hepsini bir main fonksiyonunda birleştireceğiz.

main, async olur çünkü fetchImages'ı await ile bekleyebilir. Akış:

  • görsel listesini çek
  • ızgarayı çiz
  • modal dinleyicileri hazır (önceki ders)

Son olarak main() çağrısıyla uygulamayı başlatırız.

Uygulamayı başlatma

main fonksiyonunu yazdıktan sonra dosyanın sonunda main() ile çağırırız. Tarayıcı kodu yukarıdan aşağı okuduğu için tüm tanımlar hazır olduktan sonra main() çalışır.

İçinde renderGrid(images) ile ızgarayı çizeriz. Bu örnekte hazır images dizisini kullandık; gerçek bir uygulamada önce await fetchImages(url) ile veriyi çekip sonra renderGrid'e verebilirsin.

Bu, projeyi tamamlayan son adımdır.

Uygulama main fonksiyonunu yaz ve çağır

Önceki dersin çözümünün üzerine devam et. async function main() yaz. İçinde renderGrid(images) çağrısı yap. Sonra fonksiyon dışında main() çağrısı ekle.

Örnek çözümü göster
async function main() ile başla, içinde renderGrid(images); çağır. Sonra fonksiyonun dışında main(); yazarak uygulamayı başlat.

Örnek çözüm:
// Galeri uygulaması
const app = document.getElementById("app");
const title = document.createElement("h1");
title.textContent = "Galeri";
app.appendChild(title);

const gallery = document.createElement("div");
gallery.className = "gallery";
app.appendChild(gallery);

const images = [
  { url: "https://picsum.photos/id/1/200/200", title: "Dağ manzarası", author: "Ayşe" },
  { url: "https://picsum.photos/id/2/200/200", title: "Şehir sokakları", author: "Mehmet" },
  { url: "https://picsum.photos/id/3/200/200", title: "Göl kıyısı", author: "Zeynep" }
];

async function fetchImages(url) {
  try {
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error("HTTP " + response.status);
    }
    return await response.text();
  } catch (error) {
    console.log(error.message);
  }
}

function renderGrid(images) {
  images.forEach(function(image) {
    const card = document.createElement("figure");
    const img = document.createElement("img");
    const caption = document.createElement("figcaption");
    img.src = image.url;
    img.alt = image.title;
    caption.textContent = image.author;
    card.appendChild(img);
    card.appendChild(caption);
    gallery.appendChild(card);
  });
}

// Büyük görünüm modalı
const modal = document.createElement("div");
modal.classList.add("hidden");
const modalImg = document.createElement("img");
app.appendChild(modal);
modal.appendChild(modalImg);

gallery.addEventListener("click", function(event) {
  if (event.target.tagName === "IMG") {
    modalImg.src = event.target.src;
    modal.classList.remove("hidden");
  }
});

modal.addEventListener("click", function() {
  modal.classList.add("hidden");
});

async function main() {
  renderGrid(images);
}

main();

Kendini test et

  1. main neden async olmalı?

    async function main() {
      const data = await fetchImages(url);
      // ...
    }
    • Çünkü daha hızlı çalışır
    • Çünkü await fetchImages kullanır
    • Çünkü modal gerektirir
    • Çünkü async olmazsa hata verir
    Cevabı göster

    Çünkü await fetchImages kullanır — Doğru! await kullanmak için fonksiyon async olmalı.

  2. renderGrid çağrısını tamamla

    async function main() {
      ____;
    }
    
    main();
    Cevabı göster
    async function main() {
      renderGrid(images);
    }
    
    main();
  3. Dersi özelliğine eşleştir

    1. ders
    İskelet ve başlık
    2. ders
    API'den çekme
    3. ders
    Izgara kurma
    4. ders
    Büyük görünüm
    5. ders
    main ile başlatma

Orta seviye bölümündeki tüm dersler