Javascript İle Tarayıcı Tabanlı Bir Dinamik Tablo Arama Filtresi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeyi gerçekleştirmek için özel bir kurulum yapmanıza gerek yoktur. Modern bir web tarayıcısı (Chrome, Firefox veya Edge) ve bir kod editörü (VS Code gibi) yeterlidir. Projeniz için bir index.html dosyası oluşturarak başlayabilirsiniz. JavaScript kodlarımızı etiketleri arasına veya harici bir .js dosyasına yazacağız.

Modern JavaScript (ES6+ ve sonrası) standartlarını kullanacağız. Bu, const, let, ok fonksiyonları (arrow functions) ve Array.prototype.filter() gibi güncel yöntemlerin kullanımını içerir. Eski tarayıcı destekleri (Internet Explorer gibi) 2026 itibarıyla artık dikkate alınmamaktadır.

HTML Yapısını Oluşturma

Dinamik bir tablo filtresi için öncelikle aranabilir bir tabloya ve bir giriş (input) alanına ihtiyacımız var. Tablonun tbody kısmına bir id vererek, JavaScript ile bu bölüme kolayca erişim sağlayacağız.


İsim Görev
Ahmet YılmazYazılımcı
Ayşe DemirTasarımcı

Burada input alanı, kullanıcının sorgusunu yazacağı yerdir. table ise verilerin görüntülendiği temel yapıdır. tbody etiketine verdiğimiz tabloGovdesi kimliği, satırları tek tek kontrol edip gizleyip göstermemizi sağlayacak anahtar noktadır.

JavaScript ile Arama Mantığını Kurma

Arama mantığı, kullanıcının girdiği metni dinlemek ve her tuş vuruşunda tablodaki satırları karşılaştırmak üzerine kuruludur. keyup olay dinleyicisi (event listener), kullanıcı klavyeden elini çektiği anda tetiklenir.

const aramaInput = document.getElementById('aramaInput');
const tabloGovdesi = document.getElementById('tabloGovdesi');
const satirlar = tabloGovdesi.getElementsByTagName('tr');

aramaInput.addEventListener('keyup', function() {
  const aramaTerimi = aramaInput.value.toLowerCase();

  for (let i = 0; i < satirlar.length; i++) {
    const satirMetni = satirlar[i].textContent.toLowerCase();
    satirlar[i].style.display = satirMetni.includes(aramaTerimi) ? "" : "none";
  }
});

Bu kod bloğunda, textContent ile satırın içindeki tüm metni alıyoruz ve toLowerCase() ile büyük/küçük harf duyarlılığını ortadan kaldırıyoruz. Eğer satır metni arama terimini içeriyorsa display özelliğini boş bırakarak görünür kılıyor, içermiyorsa none yaparak gizliyoruz.

Kodun Performansını Optimize Etme

Büyük veri setlerinde (yüzlerce satır) her tuş vuruşunda DOM'u doğrudan güncellemek performans sorunlarına yol açabilir. Bu noktada "debounce" (gecikmeli işlem) tekniği devreye girer. Debounce, fonksiyonun çok sık çağrılmasını engelleyerek belirli bir süre beklemesini sağlar.

function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => func.apply(this, args), delay);
  };
}

const filtrele = debounce(() => {
  // Arama mantığı buraya gelir
  console.log("Filtreleme çalıştı");
}, 300);

aramaInput.addEventListener('keyup', filtrele);

Bu yöntem, kullanıcı yazmayı bitirdikten 300 milisaniye sonra aramanın tetiklenmesini sağlar. Bu, özellikle veri yoğunluğu yüksek sayfalarda tarayıcının takılmasını engeller ve daha akıcı bir kullanıcı deneyimi sunar.

Karşılaştırmalı Yöntemler

Yöntem Avantajı Dezavantajı
DOM Manipülasyonu Basit, kütüphane gerektirmez. Çok büyük veride yavaş kalabilir.
Dizi Filtreleme Veri odaklı, çok hızlıdır. Tabloyu yeniden oluşturmayı gerektirir.

Güvenlik ve Hataları Yönetme

Kritik Uyarı: Kullanıcıdan alınan verileri (input) doğrudan sayfaya yerleştirirken (örneğin tablo satırlarını dinamik oluşturuyorsanız) mutlaka XSS (Cross-Site Scripting) saldırılarına karşı veriyi temizleyin. Doğrudan innerHTML kullanmak yerine textContent veya innerText tercih edin.

Yaygın bir hata, tablonun içindeki başlık satırını (thead) da filtrelemeye dahil etmektir. Bunu engellemek için döngünüzde sadece tbody içindeki satırları hedeflediğinizden emin olun. Ayrıca, boş arama yapıldığında tüm satırların geri gelmesi için style.display = "" kullanmak en temiz yöntemdir.

Sıkça Sorulan Sorular

Arama filtresi neden büyük/küçük harf duyarlı çalışıyor?

JavaScript'in varsayılan karşılaştırma yöntemleri karakter bazlıdır. Bunu engellemek için hem arama terimini hem de hedef metni toLowerCase() veya toUpperCase() ile eşitleyerek karşılaştırmanız gerekir.

Çok büyük tablolarda ne yapmalıyım?

Eğer tablonuz 1000 satırdan fazlaysa, DOM manipülasyonu yerine "Virtual Scrolling" (Sanal Kaydırma) tekniklerini veya veriyi JavaScript dizisinde tutup sadece ekranda görünenleri render eden kütüphaneleri incelemelisiniz.

Arama sonucunda hiçbir şey bulunamazsa ne yapmalıyım?

Tabloya bir "Sonuç bulunamadı" satırı ekleyebilir ve sonuç sayısı sıfır olduğunda bu satırı görünür yapabilirsiniz.

Bu yöntem mobil cihazlarda çalışır mı?

Evet, keyup olayı mobil cihazlardaki sanal klavyelerde de tetiklenir. Ancak mobil cihazlarda daha iyi performans için input olayını dinlemek daha sağlıklı olabilir.

Birden fazla sütunda arama yapabilir miyim?

Evet, yukarıdaki kod örneği textContent kullandığı için satırın içindeki tüm sütunları tek bir metin bloğu olarak görür ve hepsinde arama yapar.

Gelişmiş Filtreleme: Çoklu Kriter ve Dinamik Veri Kaynakları

Temel arama fonksiyonunu kurduktan sonra, kullanıcı deneyimini bir üst seviyeye taşımak için filtreleme mekanizmasını genişletebilirsiniz. Örneğin, sadece metin araması değil, aynı zamanda belirli bir kategoriye veya tarih aralığına göre verileri süzmek, büyük veri kümelerinde kullanıcıya aradığını bulması için çok daha hızlı bir yol sunar.

Aşağıdaki kod örneği, metin girişinin yanı sıra bir "Kategori Seçimi" (dropdown) ile verilerin nasıl eşzamanlı filtreleneceğini göstermektedir:


// Çoklu filtreleme mantığı
function filterTable() {
    const textValue = document.getElementById("searchInput").value.toLowerCase();
    const categoryValue = document.getElementById("categorySelect").value;
    const table = document.getElementById("dataTable");
    const rows = table.getElementsByTagName("tr");

    for (let i = 1; i < rows.length; i++) {
        const textContent = rows[i].textContent.toLowerCase();
        const categoryContent = rows[i].getAttribute("data-category");

        const matchesText = textContent.includes(textValue);
        const matchesCategory = categoryValue === "all" || categoryContent === categoryValue;

        if (matchesText && matchesCategory) {
            rows[i].style.display = "";
        } else {
            rows[i].style.display = "none";
        }
    }
}

Filtreleme İşlemlerinde Hata Ayıklama ve Debugging

Dinamik tablolarla çalışırken en sık karşılaşılan sorun, DOM öğelerinin yanlış seçilmesi veya tablo yapısındaki düzensizliklerdir. Filtreleme çalışmadığında izlemeniz gereken hata ayıklama adımları şunlardır:

  • Konsol Çıktılarını Kontrol Edin: console.log() kullanarak filtreleme fonksiyonuna giren verinin doğruluğunu ve textContent değerinin beklediğiniz metni döndürüp döndürmediğini kontrol edin.
  • DOM Yapısını İnceleyin: Tarayıcı geliştirici araçlarını (F12) kullanarak, filtreleme sırasında satırların display özelliğinin gerçekten none veya "" olarak değişip değişmediğini "Elements" sekmesinden takip edin.
  • Boşluk Sorunları: HTML içindeki fazladan boşluklar veya satır sonu karakterleri textContent değerini etkileyebilir. Veriyi karşılaştırırken .trim() metodunu kullanmayı alışkanlık haline getirin.

Örneğin, bir satırın içeriğini alırken şu şekilde temiz bir veri elde edebilirsiniz:


const cellText = rows[i].cells[0].textContent.trim().toLowerCase();
console.log("İşlenen Satır Verisi:", cellText);

Modern Web Uygulamalarında Alternatif Yaklaşımlar

Eğer projeniz çok karmaşık bir yapıya sahipse ve verileriniz sürekli güncelleniyorsa (örneğin bir API'den geliyorsa), sadece DOM manipülasyonu yapmak yerine modern JavaScript framework'lerinin (React, Vue veya Svelte) "state-driven" (durum odaklı) yaklaşımını kullanmak daha sürdürülebilir olacaktır. Bu yöntemlerde veriyi doğrudan DOM üzerinde değil, bir dizi (array) içerisinde filtreler ve tabloyu bu diziye göre yeniden render edersiniz.

Ancak saf JavaScript (Vanilla JS) ile devam edecekseniz, performans için DocumentFragment kullanarak tabloyu yeniden oluşturmak, tek tek satırları gizleyip göstermekten daha yüksek performans sunabilir. Özellikle 1000 satırı aşan tablolarda, DOM'u doğrudan manipüle etmek yerine veriyi filtreleyip tabloyu tek seferde güncellemek, tarayıcının "reflow" (yeniden düzenleme) maliyetini ciddi oranda düşürür.

Sonuç

JavaScript ile tarayıcı tabanlı bir dinamik tablo arama filtresi yapmak, web geliştirme becerilerinizi geliştiren temel bir yetkinliktir. Bu rehberde, DOM manipülasyonu, olay dinleyicileri ve performans optimizasyonu için debounce tekniğini öğrendiniz. Bir sonraki adım olarak, bu tabloya "Sıralama" (Sorting) özelliği ekleyerek kullanıcılarınızın verileri isme veya tarihe göre sıralamasını sağlayabilirsiniz.

Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamındaki uygulamalarınızda, kullanıcı girdilerini her zaman doğrulayın ve modern güvenlik standartlarını (CSP - Content Security Policy gibi) uygulayın. Yazılım güvenliği sorumluluğu geliştiriciye aittir.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik konuları sadeleştirerek geniş kitlelere ulaştırma konusunda tutkuluyum. Ev işleri, bakım ve organizasyon temalı rehberlerimde kaliteyi ön planda tutuyorum.

Yorumlar (0)

Yorum Yaz