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ülasyonunun Temelleri ve İleri Teknikleri

DOM (Document Object Model) Manipülasyonu, bir web sayfasının temel yapısını, içeriğini ve stilini JavaScript kullanarak dinamik olarak değiştirme sanatıdır. Web tarayıcıları bir HTML belgesini yüklediğinde, onu bir nesne ağacına dönüştürür; bu ağaç, her bir HTML öğesi (element), metin parçası (text node) ve yorumun (comment) bir 'düğüm' (node) olarak temsil edildiği bir yapıdır. Bu nesne modeline DOM adı verilir. DOM manipülasyonu, bir web sayfasının kullanıcı etkileşimlerine (tıklama, form doldurma), zamanlayıcılara veya dış kaynaklardan gelen verilere göre anında nasıl değiştiğini belirler. Modern, etkileşimli ve kullanıcı odaklı web uygulamalarının geliştirilmesinde kilit bir rol oynar. Örneğin, bir kullanıcının bir butona tıklamasıyla yeni bir yorum kutusu eklemek, bir form gönderildiğinde dinamik bir hata mesajı göstermek, bir slayt gösterisindeki resimleri değiştirmek veya bir kullanıcının tercihine göre temanın rengini ayarlamak gibi sayısız senaryo, DOM manipülasyonu ile hayata geçirilir. Bu teknik, bir web sayfasının statik bir belge olmaktan çıkıp, canlı ve tepkisel bir arayüze dönüşmesini sağlar.

1. HTML Öğelerini Seçmek:
DOM manipülasyonuna başlamanın ilk adımı, üzerinde işlem yapmak istediğiniz HTML öğelerini JavaScript ile seçmektir. JavaScript, bu amaçla çeşitli güçlü yöntemler sunar. Doğru öğeyi seçmek, verimli ve hatasız kod yazmanın temelidir.
  • document.getElementById(id): Belirli bir `id` özelliğine sahip tek bir öğeyi döndürür. ID'ler bir HTML belgesinde benzersiz olmalıdır, bu nedenle bu yöntem her zaman tek bir öğe döndürür veya eşleşen bir öğe bulunamazsa `null` döndürür.
  • document.getElementsByClassName(className): Belirtilen sınıf adına sahip tüm öğeleri bir `HTMLCollection` olarak döndürür. Bu koleksiyon 'canlı'dır, yani DOM'da yapılan değişiklikler koleksiyona otomatik olarak yansır.
  • document.getElementsByTagName(tagName): Belirtilen etiket adına sahip tüm öğeleri (örneğin, 'div', 'p', 'a') bir `HTMLCollection` olarak döndürür. Bu da canlı bir koleksiyondur.
  • document.querySelector(selector): Belirtilen CSS seçicisiyle (örneğin, '#myId', '.myClass', 'div.special') eşleşen ilk öğeyi döndürür. Modern uygulamalarda sıkça tercih edilen, çok esnek bir yöntemdir.
  • document.querySelectorAll(selector): Belirtilen CSS seçicisiyle eşleşen tüm öğeleri bir `NodeList` olarak döndürür. `NodeList`, `HTMLCollection`'ın aksine genellikle 'statiktir' (bazı istisnalar dışında), yani DOM'da sonradan yapılan değişiklikler bu NodeList'i otomatik olarak güncellemez.
Kod:
// ID ile bir başlığı seçme
const anaBaslik = document.getElementById('anaBaslik');
if (anaBaslik) {
  console.log('Ana Başlık Metni:', anaBaslik.textContent);
}

// Sınıf adı ile tüm "kart" öğelerini seçme
const urunKartlari = document.getElementsByClassName('urun-kart');
for (let i = 0; i < urunKartlari.length; i++) {
  console.log('Ürün Kartı ' + (i + 1) + ' ID:', urunKartlari[i].id || 'Yok');
}

// CSS seçici ile bir input alanını seçme (ilk bulunan)
const aramaKutusu = document.querySelector('input[type="search"]');
if (aramaKutusu) {
  console.log('Arama Kutusu Yer Tutucusu:', aramaKutusu.placeholder);
}

// CSS seçici ile tüm liste öğelerini seçme
const tumListeElemanlari = document.querySelectorAll('ul.menu-list > li');
tumListeElemanlari.forEach((item, index) => {
  console.log(index + 1 + '. Menü Öğesi:', item.textContent);
});

2. Öğelerin İçeriğini ve Özelliklerini Değiştirmek:
Seçtiğiniz öğelerin içeriğini ve özelliklerini dinamik olarak değiştirmek, DOM manipülasyonunun kalbinde yer alır.
  • textContent: Bir öğenin ve onun tüm alt öğelerinin sadece görünür metin içeriğini ayarlar veya döndürür. HTML etiketleri metin olarak kabul edilir ve yorumlanmaz. XSS (Cross-Site Scripting) saldırılarına karşı daha güvenlidir çünkü kullanıcıdan gelen verileri saf metin olarak işler.
  • innerHTML: Bir öğenin hem metin hem de HTML içeriğini ayarlar veya döndürür. Bu özelliği kullanarak bir öğenin içine tamamen yeni HTML yapıları enjekte edebilirsiniz. Ancak, kullanıcıdan gelen verileri doğrudan `innerHTML`'e atamak ciddi güvenlik zafiyetlerine yol açabilir.
  • setAttribute(name, value): Bir öğenin belirtilen bir özelliğinin (örneğin, 'src', 'href', 'class', 'id') değerini ayarlar veya yeni bir özellik ekler.
  • getAttribute(name): Bir öğenin belirtilen özelliğinin mevcut değerini döndürür.
  • removeAttribute(name): Bir öğeden belirtilen özelliği kaldırır.
Kod:
const durumMesaji = document.getElementById('durum');
durumMesaji.textContent = 'Veriler başarıyla yüklendi!'; // Sadece metin içeriğini günceller

const uyariKutusu = document.getElementById('uyari');
uyariKutusu.innerHTML = '[b]Dikkat:[/b] Lütfen profil bilgilerinizi güncelleyin! [url=/profil]Buraya tıklayın.[/url]'; // HTML içeriğiyle günceller

const resimOgeleri = document.querySelectorAll('img');
resimOgeleri.forEach(img => {
  const mevcutSrc = img.getAttribute('src');
  if (mevcutSrc.includes('placeholder')) {
    img.setAttribute('src', 'https://example.com/gercek-resim.jpg');
    img.setAttribute('alt', 'Gerçek Resim');
  }
});

const gizliDugme = document.getElementById('gizliDugme');
if (gizliDugme.hasAttribute('disabled')) {
  gizliDugme.removeAttribute('disabled'); // Düğmeyi etkinleştirir
}

3. Öğelere Stil Vermek (CSS Yönetimi):
Bir öğenin görsel stilini değiştirmek, kullanıcı arayüzünü dinamikleştirmek için kritik öneme sahiptir. Bu işlem için genellikle iki ana yaklaşım kullanılır:
  • element.style.propertyName: Bir öğenin doğrudan inline stilini değiştirmek için kullanılır. Örneğin, `element.style.color = 'red';` veya `element.style.display = 'none';`. Bu yöntem hızlı ve doğrudan değişiklikler için kullanışlıdır ancak çok sayıda stil değişikliği veya karmaşık durumlar için tavsiye edilmez çünkü CSS'in gücünü (özellikle seçici özgüllüğünü ve cascade yapısını) bypass eder ve kodun okunabilirliğini azaltabilir.
  • element.classList: Bir öğenin CSS sınıflarını eklemek, çıkarmak veya kontrol etmek için kullanılır. Bu, stil yönetiminde inline stil kullanmaktan çok daha tercih edilen bir yöntemdir. CSS'in gücünü tam olarak kullanmanızı sağlar ve stilin JavaScript'ten ayrılmasına yardımcı olur. `classList` API'si aşağıdaki metotları sunar:
  • `add(...className)`: Bir veya daha fazla sınıf ekler.
  • `remove(...className)`: Bir veya daha fazla sınıfı kaldırır.
  • `toggle(className, force)`: Sınıf varsa kaldırır, yoksa ekler. İkinci parametre `force` `true` ise ekler, `false` ise kaldırır.
  • `contains(className)`: Sınıfın var olup olmadığını kontrol eder (boolean döndürür).
  • `replace(oldClassName, newClassName)`: Eski sınıfı yeniyle değiştirir.
Kod:
const modAnahtari = document.getElementById('modAnahtari');
modAnahtari.addEventListener('click', () => {
  document.body.classList.toggle('dark-mode');
  // Eğer dark-mode sınıfı eklendiyse metni değiştir
  if (document.body.classList.contains('dark-mode')) {
    modAnahtari.textContent = 'Açık Mod';
  } else {
    modAnahtari.textContent = 'Koyu Mod';
  }
});

const fiyatGosterim = document.getElementById('fiyat');
if (parseFloat(fiyatGosterim.textContent) < 50) {
  fiyatGosterim.style.color = 'green';
  fiyatGosterim.style.fontWeight = 'bold';
} else {
  fiyatGosterim.style.color = 'red';
}
MDN Web Docs'ta classList hakkında daha fazla bilgi edinin.

4. Yeni Öğeler Oluşturmak ve Mevcut Öğeleri Kaldırmak:
Web sayfalarını dinamik olarak güncellemenin önemli bir parçası da DOM'a yeni öğeler eklemek veya artık gerekli olmayan öğeleri kaldırmaktır.
  • document.createElement(tagName): Belirtilen etiket adına (örneğin, 'div', 'p', 'li') sahip yeni bir HTML öğesi oluşturur. Bu öğe henüz DOM'a eklenmemiştir, sadece hafızada oluşturulmuştur.
  • document.createTextNode(text): Yeni bir metin düğümü oluşturur. Genellikle bir öğeye metin içeriği eklemek için `appendChild` veya `insertBefore` ile birlikte kullanılır.
  • parentNode.appendChild(child): Belirtilen alt öğeyi (child) `parentNode` öğesinin son çocuğu olarak ekler. Eğer alt öğe zaten DOM'daysa, mevcut konumundan kaldırılır ve yeni konumuna taşınır.
  • parentNode.insertBefore(newNode, referenceNode): Yeni bir öğeyi (newNode) `parentNode` içinde, belirtilen referans düğümünden (referenceNode) hemen önce ekler. `referenceNode` `null` ise, `appendChild` gibi davranır ve sona ekler.
  • parentNode.removeChild(child): `parentNode` öğesinden belirtilen alt öğeyi (child) kaldırır. Kaldırılan öğeye bir referans tutarsanız, daha sonra tekrar DOM'a ekleyebilirsiniz.
  • element.remove(): Öğeyi doğrudan DOM'dan kaldıran daha modern ve kısa bir yöntemdir. `parentNode.removeChild(element)`'in basitleştirilmiş bir alternatifidir.
Kod:
const yorumlarBolumu = document.getElementById('yorumlar');

// Yeni bir yorum öğesi oluştur
const yeniYorumDiv = document.createElement('div');
yeniYorumDiv.className = 'yorum-kutusu';

const yazarAdi = document.createElement('h4');
yazarAdi.textContent = 'Yeni Kullanıcı';
yeniYorumDiv.appendChild(yazarAdi);

const yorumMetni = document.createElement('p');
yorumMetni.textContent = 'Bu harika bir DOM manipülasyon örneği!';
yeniYorumDiv.appendChild(yorumMetni);

// Yorumu yorumlar bölümüne ekle
yorumlarBolumu.appendChild(yeniYorumDiv);

// İlk yorumu kaldır (eğer varsa)
const ilkYorum = yorumlarBolumu.firstElementChild;
if (ilkYorum) {
  yorumlarBolumu.removeChild(ilkYorum);
}

// Belirli bir öğeyi doğrudan kaldırma
const kaldirilacakElement = document.querySelector('.reklam-bandi');
if (kaldirilacakElement) {
  kaldirilacakElement.remove(); // Reklam bandını sayfadan kaldırır
}

5. Olay Dinleyicileri (Event Listeners) ile Etkileşim:
DOM manipülasyonu genellikle kullanıcı etkileşimleriyle tetiklenir. Olay dinleyicileri, belirli bir olay (tıklama, klavye basışı, fare hareketi vb.) meydana geldiğinde belirli bir JavaScript kodunu çalıştırmamızı sağlar. En yaygın yöntem `addEventListener()`'dır.
Kod:
const gonderButonu = document.getElementById('gonderButonu');
gonderButonu.addEventListener('click', (event) => {
  event.preventDefault(); // Formun varsayılan gönderimini engeller
  const kullaniciGirdisi = document.getElementById('kullaniciGirdisi').value;
  if (kullaniciGirdisi.trim() === '') {
    alert('Lütfen bir şeyler yazın!');
  } else {
    const yeniParagraf = document.createElement('p');
    yeniParagraf.textContent = 'Girdiğiniz Metin: ' + kullaniciGirdisi;
    document.body.appendChild(yeniParagraf);
    document.getElementById('kullaniciGirdisi').value = ''; // Inputu temizle
  }
});

const resimKutusu = document.getElementById('resimKutusu');
resimKutusu.addEventListener('mouseover', () => {
  resimKutusu.style.border = '3px solid blue';
});
resimKutusu.addEventListener('mouseout', () => {
  resimKutusu.style.border = '1px solid gray';
});
Bu örnekte, bir butona tıklama olayı dinleniyor ve kullanıcının girdiği metin sayfaya dinamik olarak ekleniyor. Ayrıca bir resim kutusu üzerine fare gelince çerçevesi değişiyor.

6. Performans İpuçları ve En İyi Uygulamalar:
DOM manipülasyonu güçlü olsa da, dikkatsizce yapıldığında web sayfalarının performansını ciddi şekilde etkileyebilir. Tarayıcılar, DOM'da yapılan her değişiklikte sayfayı yeniden düzenlemek (reflow) veya yeniden boyamak (repaint) zorunda kalabilir, bu da özellikle büyük veya karmaşık sayfalarda maliyetli işlemlerdir.
  • Reflow ve Repaint'i Minimumda Tutun: `Reflow` (veya Layout), bir öğenin geometrik pozisyonu veya boyutu değiştiğinde tarayıcının tüm sayfayı yeniden hesaplaması işlemidir. `Repaint`, renk veya görünürlük gibi stil değişiklikleri olduğunda sayfanın sadece görünümünü yeniden çizmesidir. Her ikisi de kaynak yoğun işlemlerdir. Mümkün olduğunca az DOM değişikliği yapmaya çalışın.
  • Tek Seferde Değişiklik Yapın: Birden fazla DOM değişikliği yapmanız gerektiğinde, bu değişiklikleri bir araya getirin ve tek bir operasyonla uygulayın. Örneğin, bir döngü içinde her iterasyonda DOM'a öğe eklemek yerine, `DocumentFragment` kullanarak tüm öğeleri önce bir parçada oluşturup sonra bu parçayı DOM'a tek seferde ekleyin.
  • DocumentFragment Kullanımı: `document.createDocumentFragment()` yöntemi, geçici bir DOM parçası oluşturmanızı sağlar. Bu parçaya öğeler ekleyebilir ve değişiklikleri yapabilirsiniz. Parçayı ana DOM'a eklediğinizde, tarayıcı tüm değişiklikleri tek bir `reflow` işleminde işler, bu da performansı artırır.
    Kod:
    const ulElement = document.getElementById('buyukListe');
    const fragment = document.createDocumentFragment();
    
    for (let i = 0; i < 1000; i++) {
      const li = document.createElement('li');
      li.textContent = 'Liste Öğesi ' + i;
      fragment.appendChild(li);
    }
    ulElement.appendChild(fragment); // Tek seferde 1000 öğeyi ekle
  • Olay Delegasyonu (Event Delegation) Kullanın: Dinamik olarak eklenen veya çok sayıda benzer öğeye sahip olduğunuzda, her birine ayrı olay dinleyicisi eklemek yerine, bu öğelerin ortak üst öğesine tek bir olay dinleyicisi ekleyin. Olay yukarıya doğru kabarcıklanır (bubbling), bu sayede üst öğe, olayın hangi alt öğeden geldiğini kontrol edebilir. Bu, hafıza kullanımını azaltır ve performansı artırır.
  • CSS Sınıflarını Tercih Edin: Yukarıda da belirtildiği gibi, stil değişiklikleri için doğrudan `element.style` yerine CSS sınıflarını kullanmak, tarayıcının stil hesaplamalarını daha verimli yapmasına olanak tanır ve kodunuzu daha yönetilebilir hale getirir.
  • Modern JavaScript Kütüphaneleri ve Çerçeveleri: React, Vue.js, Angular gibi modern frontend kütüphaneleri ve çerçeveleri, DOM manipülasyonunu soyutlar ve kendi "sanal DOM" (Virtual DOM) mekanizmalarıyla optimize ederler. Bu çerçeveler, DOM'daki değişiklikleri minimuma indirerek performansı artırır ve geliştiricilerin doğrudan DOM ile uğraşma yükünü azaltır. Ancak bu, saf JavaScript ile DOM manipülasyonunun temellerini anlamanın önemini azaltmaz; zira bu çerçevelerin altında yatan mantık yine DOM prensiplerine dayanır.
"Web geliştirme dünyasında DOM, kalbin HTML ve damarların CSS olduğu bir vücudun sinir sistemidir. Onu kontrol etmek, web sayfalarınıza hayat vermek demektir."

Sonuç olarak, DOM manipülasyonu, statik HTML ve CSS belgelerini etkileşimli ve dinamik web uygulamalarına dönüştürmek için JavaScript'in en temel ve güçlü yeteneklerinden biridir. HTML'i bir programatik nesne modeli olarak anlamak ve bu modeli JavaScript kullanarak değiştirebilmek, kullanıcı deneyimini zenginleştirmek için vazgeçilmezdir. Güvenlik açıklarına dikkat etmek, performansı optimize etmek ve en iyi uygulamaları takip etmek, daha sağlam ve verimli web uygulamaları geliştirmenizi sağlayacaktır. Bu konudaki bilginizi derinleştirmek için Mozilla Geliştirici Ağı (MDN) üzerindeki DOM belgelerini detaylıca incelemeniz şiddetle tavsiye edilir. Unutmayın, pratik yapmak ve küçük projeler üzerinde çalışmak, DOM manipülasyonu becerilerinizi geliştirmenin en etkili yoludur.
800x450
 
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