Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

JavaScript ile DOM Manipülasyonu Temelleri: Web Sayfalarını Dinamik Hale Getirin

Web sayfaları, başlangıçta statik belgeler olarak tasarlanmış olsa da, günümüz modern web uygulamaları kullanıcılarla etkileşim kurabilen, içerikleri anında güncelleyebilen ve adeta canlı birer organizma gibi davranabilen yapılar haline gelmiştir. Bu dinamizmin temelinde yatan en önemli kavramlardan biri, JavaScript ile gerçekleştirilen DOM (Document Object Model) manipülasyonudur.

DOM Nedir?

DOM, bir web sayfasının (HTML veya XML belgesinin) programatik bir temsilidir. Tarayıcılar, bir HTML belgesini yüklediğinde, bu belgeyi bir nesne ağacı olarak bellekte saklar. Bu ağaç yapısı, belgedeki her bir öğeyi (element, metin, nitelik vb.) birer nesne olarak sunar ve JavaScript gibi programlama dillerinin bu nesneler üzerinde işlem yapmasına olanak tanır. Yani, HTML kodunuzu bir yapı iskelesi olarak düşünürseniz, DOM bu iskelenin her bir parçasını erişilebilir birer nesneye dönüştürür. Tarayıcı, DOM'u kullanarak bir web sayfasının içeriğini, yapısını ve stilini görsel olarak oluşturur.

Bir örnekle açıklamak gerekirse:

Kod:
<!DOCTYPE html>
<html>
<head>
    <title>Örnek Sayfa</title>
</head>
<body>
    <h1 id="baslik">Merhaba Dünya</h1>
    <p class="paragraf">Bu bir örnek paragraftır.</p>
</body>
</html>

Yukarıdaki HTML kodu, tarayıcı tarafından bir DOM ağacına dönüştürülür. Bu ağacın tepesinde `document` nesnesi bulunur, onun altında `html`, `head`, `body` gibi elementler ve onların altında da `title`, `h1`, `p` gibi elementler yer alır. Her bir elementin kendine ait nitelikleri (id, class) ve içeriği (text) vardır.

DOM Manipülasyonu Neden Gereklidir?

DOM manipülasyonu, bir web sayfasını statik olmaktan çıkarıp dinamik ve etkileşimli hale getirmenin anahtarıdır. İşte bazı temel gereklilikler:

  • Dinamik İçerik Güncelleme: Sayfayı yeniden yüklemeden yeni içerik ekleme, mevcut içeriği değiştirme veya kaldırma (örneğin, bir haber sitesinde yeni makalelerin yüklenmesi).
  • Kullanıcı Etkileşimi: Kullanıcının tıklamalarına, klavye girişlerine veya fare hareketlerine yanıt verme (örneğin, bir butona tıklandığında bir menünün açılması).
  • Form Doğrulaması: Form gönderilmeden önce kullanıcı girişlerini kontrol etme ve hatalı girişlerde uyarı mesajları gösterme.
  • Görsel Efektler ve Animasyonlar: Elementlerin stilini (rengini, boyutunu, konumunu) değiştirerek görsel efektler ve animasyonlar oluşturma.
  • Tek Sayfa Uygulamaları (SPA'lar): Sayfalar arası geçişi sayfa yenilemesi olmadan sağlayarak daha akıcı bir kullanıcı deneyimi sunma (örneğin, Gmail, Facebook).

Temel DOM Seçim Metotları

DOM'u manipüle etmeden önce, üzerinde işlem yapacağımız elementleri seçmemiz gerekir. JavaScript, bunun için çeşitli metotlar sunar:

1. document.getElementById('idAdı'): Belirli bir `id` niteliğine sahip tek bir elementi seçer. `id`'ler bir belgede benzersiz olmalıdır.
Kod:
    const baslikElementi = document.getElementById('baslik');
    console.log(baslikElementi.textContent); // Çıktı: Merhaba Dünya
2. document.getElementsByClassName('sınıfAdı'): Belirli bir sınıf adına sahip tüm elementleri içeren bir `HTMLCollection` döndürür. Bu bir diziye benzese de doğrudan dizi metotları uygulanamaz (forEach kullanmak için Array.from() ile dönüştürmek gerekebilir).
Kod:
    const paragraflar = document.getElementsByClassName('paragraf');
    for (let i = 0; i < paragraflar.length; i++) {
        console.log(paragraflar[i].textContent);
    }
3. document.getElementsByTagName('etiketAdı'): Belirli bir etiket adına sahip tüm elementleri içeren bir `HTMLCollection` döndürür (örneğin, 'div', 'p', 'a').
Kod:
    const divler = document.getElementsByTagName('div');
    console.log(`Sayfada ${divler.length} adet div elementi var.`);
4. document.querySelector('CSS_seçici'): Belirtilen CSS seçicisiyle eşleşen ilk elementi döndürür. Bu, id, sınıf, etiket veya daha karmaşık CSS seçicilerini kullanmanıza olanak tanır. Modern web geliştirmede en sık kullanılan metotlardan biridir.
Kod:
    const ilkParagraf = document.querySelector('p');
    const baslik = document.querySelector('#baslik');
    const ilkOge = document.querySelector('.liste-item:first-child');
5. document.querySelectorAll('CSS_seçici'): Belirtilen CSS seçicisiyle eşleşen tüm elementleri içeren bir `NodeList` döndürür. `NodeList`ler, `forEach` gibi dizi metotlarını doğrudan destekler.
Kod:
    const tumParagraflar = document.querySelectorAll('p');
    tumParagraflar.forEach(p => {
        p.style.color = 'blue';
    });

Element Oluşturma ve Ekleme/Kaldırma

DOM'a yeni elementler ekleyebilir, mevcutları kaldırabilir veya yerlerini değiştirebilirsiniz.

1. document.createElement('etiketAdı'): Yeni bir HTML elementi oluşturur.
Kod:
    const yeniDiv = document.createElement('div');
    yeniDiv.textContent = 'Bu yeni bir div elementi.';
2. parentNode.appendChild(childElement): Bir elementin son çocuk elementi olarak başka bir elementi ekler.
Kod:
    document.body.appendChild(yeniDiv);
3. parentNode.insertBefore(newElement, referenceElement): Bir elementi, belirtilen referans elementinden önce ekler.
Kod:
    const ilkParagraf = document.querySelector('p');
    const yeniH2 = document.createElement('h2');
    yeniH2.textContent = 'Ara Başlık';
    document.body.insertBefore(yeniH2, ilkParagraf);
4. parentNode.removeChild(childElement): Belirtilen çocuk elementi, ebeveyninden kaldırır.
Kod:
    const kaldirilacakParagraf = document.querySelector('.eski-paragraf');
    if (kaldirilacakParagraf) {
        kaldirilacakParagraf.parentNode.removeChild(kaldirilacakParagraf);
    }
5. parentNode.replaceChild(newElement, oldElement): Bir çocuk elementi, başka bir elementle değiştirir.
Kod:
    const eskiBaslik = document.getElementById('baslik');
    const yeniBaslik = document.createElement('h1');
    yeniBaslik.textContent = 'Yeni Başlık İçeriği';
    yeniBaslik.id = 'yeni-baslik';
    document.body.replaceChild(yeniBaslik, eskiBaslik);

Element İçeriğini ve Niteliklerini Değiştirme

Seçtiğiniz elementlerin içeriğini veya niteliklerini kolayca değiştirebilirsiniz.

1. textContent: Bir elementin metin içeriğini alır veya ayarlar. HTML etiketlerini güvenli bir şekilde metin olarak işler.
Kod:
    baslikElementi.textContent = 'Merhaba JavaScript!';
2. innerHTML: Bir elementin HTML içeriğini alır veya ayarlar. Yeni HTML etiketlerini parse eder ve DOM'a ekler. Ancak, kullanıcıdan alınan verileri doğrudan innerHTML'e atamak güvenlik açıkları (XSS) oluşturabilir.
Kod:
    const kapsayiciDiv = document.getElementById('kapsayici');
    kapsayiciDiv.innerHTML = '<p>Bu <b>kalın</b> bir metin içerir.</p>';
3. setAttribute('nitAdı', 'değer'), getAttribute('nitAdı'), removeAttribute('nitAdı'): Elementlerin niteliklerini (örneğin, `href`, `src`, `class`, `id`) yönetir.
Kod:
    const link = document.querySelector('a');
    link.setAttribute('href', 'https://www.example.com');
    link.setAttribute('target', '_blank');
    console.log(link.getAttribute('href'));
    // link.removeAttribute('target');
4. classList (add, remove, toggle, contains): Elementlerin CSS sınıflarını yönetmenin modern ve esnek bir yoludur.
Kod:
    const kutu = document.getElementById('kutu');
    kutu.classList.add('aktif'); // 'aktif' sınıfını ekler
    kutu.classList.remove('pasif'); // 'pasif' sınıfını kaldırır
    kutu.classList.toggle('gizli'); // 'gizli' sınıfı varsa kaldırır, yoksa ekler
    if (kutu.classList.contains('aktif')) {
        console.log('Kutu aktif durumda.');
    }

Olay Dinleyicileri (Event Listeners)

Web sayfalarını etkileşimli hale getirmenin en önemli yollarından biri, kullanıcı eylemlerine yanıt vermektir. Olay dinleyicileri (event listeners) bunu sağlar.

element.addEventListener('olayTürü', fonksiyon): Bir elemente belirli bir olay türü (örneğin 'click', 'mouseover', 'submit') gerçekleştiğinde çalışacak bir fonksiyon (geri arama fonksiyonu) ekler.

Kod:
const buton = document.getElementById('tikla-buton');
buton.addEventListener('click', function() {
    alert('Butona tıklandı!');
});

// Daha modern bir yaklaşım (ok fonksiyonu)
const inputAlan = document.getElementById('kullanici-girisi');
inputAlan.addEventListener('keydown', (event) => {
    console.log(`Tuşa basıldı: ${event.key}`);
    if (event.key === 'Enter') {
        alert('Enter tuşuna basıldı!');
    }
});

Sık Kullanılan Olay Türleri:
  • `click`: Element tıklandığında.
  • `mouseover`: Fare elementin üzerine geldiğinde.
  • `mouseout`: Fare elementin üzerinden ayrıldığında.
  • `submit`: Bir form gönderildiğinde.
  • `keydown`, `keyup`, `keypress`: Klavyede tuş basıldığında/bırakıldığında.
  • `change`: Bir input, select veya textarea elementinin değeri değiştiğinde.
  • `load`: Sayfa veya element tamamen yüklendiğinde.

DOM Manipülasyonunda En İyi Uygulamalar ve Performans

Büyük ve karmaşık uygulamalarda, DOM manipülasyonu performansı olumsuz etkileyebilir. İşte bazı öneriler:

  • Minimal Manipülasyon: Gereğinden fazla DOM manipülasyonundan kaçının. Birçok değişikliği tek seferde yapmak yerine, değişiklikleri gruplandırın.
  • Document Fragments Kullanımı: Birden fazla elementi DOM'a eklerken, her bir elementi ayrı ayrı eklemek yerine bir `DocumentFragment` oluşturup tüm elementleri buraya ekleyin ve ardından fragment'ı tek seferde DOM'a ekleyin. Bu, tarayıcının yeniden çizim (reflow/repaint) işlemlerini azaltır.
    Kod:
        const liste = document.getElementById('urun-listesi');
        const fragment = document.createDocumentFragment();
        for (let i = 0; i < 100; i++) {
            const listItem = document.createElement('li');
            listItem.textContent = `Ürün ${i + 1}`;
            fragment.appendChild(listItem);
        }
        liste.appendChild(fragment); // Tek bir reflow tetiklenir
  • Olay Delegasyonu (Event Delegation): Özellikle dinamik olarak oluşturulan veya çok sayıda benzer elementin olduğu durumlarda, her bir elemente ayrı ayrı olay dinleyici eklemek yerine, ortak bir ebeveyn elementine bir olay dinleyici ekleyerek çocuk elementlerdeki olayları yönetin. Bu, bellek kullanımını azaltır ve performansı artırır.
  • innerHTML Güvenli Kullanımı: `innerHTML` kullanırken dikkatli olun. Kullanıcıdan gelen verileri veya bilinmeyen kaynaklardan gelen HTML'i doğrudan `innerHTML`'e atamaktan kaçının. Bunun yerine `textContent` kullanın veya güvenlik önlemleri alın.
  • JavaScript'i defer veya async ile Yükleme: JavaScript dosyalarınızı `<head>` kısmına eklerken `defer` veya `async` niteliklerini kullanarak HTML parse etme işlemini engellemeyin. Ya da script'lerinizi `</body>` etiketinden hemen önce yükleyin.

Örnek Senaryo: Dinamik Bir Not Defteri

Basit bir not defteri uygulaması ile DOM manipülasyonunun nasıl çalıştığını görelim. Bir input alanı ve bir 'Ekle' butonu olsun. Butona tıklandığında inputtaki metin bir listeye eklenmeli.

Kod:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Not Defteri</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        #notInput { padding: 8px; width: 300px; border: 1px solid #ccc; }
        #ekleButton { padding: 8px 15px; background-color: #007bff; color: white; border: none; cursor: pointer; }
        #notListesi { list-style: decimal; padding-left: 20px; }
        #notListesi li { margin-bottom: 5px; }
    </style>
</head>
<body>
    <h1>Basit Not Defteri</h1>
    <input type="text" id="notInput" placeholder="Yeni notunuzu buraya yazın...">
    <button id="ekleButton">Not Ekle</button>
    <ul id="notListesi"></ul>

    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const notInput = document.getElementById('notInput');
            const ekleButton = document.getElementById('ekleButton');
            const notListesi = document.getElementById('notListesi');

            ekleButton.addEventListener('click', () => {
                const notMetni = notInput.value.trim();
                if (notMetni !== '') {
                    const yeniNotOgesi = document.createElement('li');
                    yeniNotOgesi.textContent = notMetni;
                    notListesi.appendChild(yeniNotOgesi);
                    notInput.value = ''; // Input alanını temizle
                } else {
                    alert('Lütfen bir not girin!');
                }
            });

            notInput.addEventListener('keydown', (event) => {
                if (event.key === 'Enter') {
                    ekleButton.click(); // Enter tuşuna basıldığında butona tıklama olayını tetikle
                }
            });
        });
    </script>
</body>
</html>

Bu örnekte, `DOMContentLoaded` olay dinleyicisi ile sayfa yüklendikten sonra JavaScript kodunun çalışmasını sağlıyoruz. Elementleri `getElementById` ile seçiyor, `createElement` ile yeni `li` elementleri oluşturuyor, `textContent` ile içeriklerini belirliyor ve `appendChild` ile listeye ekliyoruz. Ayrıca, butona ve input'a `addEventListener` ile olay dinleyicileri ekleyerek kullanıcı etkileşimini yönetiyoruz.

Sık Yapılan Hatalar ve Çözümleri

DOM manipülasyonu yaparken, elementlerin henüz yüklenmemiş olması gibi durumlarla sıkça karşılaşılabilir. Bu durum 'null' veya 'undefined' hatalarına yol açar.

1. Elementler Yüklenmeden JavaScript Çalıştırmak: Eğer JavaScript kodunuz `<head>` etiketinde ve `<script>` etiketinde `defer` veya `async` niteliği olmadan yer alıyorsa, sayfa yüklenmeden önce çalışmaya başlayabilir. Bu durumda, JavaScript'iniz henüz DOM'da var olmayan elementleri seçmeye çalışır ve `null` döndürür. Çözüm: Script'inizi `</body>` kapanış etiketinden hemen önce yerleştirin veya `DOMContentLoaded` olay dinleyicisini kullanın.
2. querySelector/querySelectorAll ile Yanlış Seçiciler Kullanmak: CSS seçicilerinin doğruluğundan emin olun. `id` için `#`, `class` için `.` kullanmayı unutmayın.
3. HTMLCollection ve NodeList Farkları: `getElementsByClassName` veya `getElementsByTagName` tarafından döndürülen `HTMLCollection` doğrudan `forEach` metodunu desteklemezken, `querySelectorAll` tarafından döndürülen `NodeList` destekler. Eğer `HTMLCollection` üzerinde `forEach` kullanmak istiyorsanız, onu `Array.from()` ile bir diziye dönüştürmeniz gerekebilir.

Sonuç

DOM manipülasyonu, modern web geliştirmenin vazgeçilmez bir parçasıdır. JavaScript ile DOM üzerinde yapılan işlemler sayesinde, kullanıcılarla etkileşimli, dinamik ve zengin web deneyimleri oluşturabiliriz. Temel seçim, oluşturma, değiştirme ve olay dinleme metotlarını öğrenmek, web geliştirme yolculuğunuzda size büyük bir güç katacaktır. Unutmayın, iyi performanslı uygulamalar için en iyi uygulamaları takip etmek ve gereksiz manipülasyonlardan kaçınmak önemlidir.

Daha fazla bilgi ve örnek için MDN Web Docs - DOM Introduction adresini ziyaret edebilirsiniz.
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected