jQuery bağımlılığınızdan kurtulmak ve web uygulamalarınızın performansını artırmak mı istiyorsunuz? Bu kapsamlı rehberde, modern JavaScript seçicilerini kullanarak performanslı ve bakımı kolay web uygulamaları geliştirmeyi adım adım öğrenecek, gerçek dünya senaryolarıyla bilginizi pekiştireceksiniz. Sayfa yükleme hızından kod temizliğine kadar birçok alanda fark yaratacak bu yaklaşıma derinlemesine dalmaya hazır olun.
Yıllar boyunca jQuery, web geliştiricileri için vazgeçilmez bir araç oldu. DOM manipülasyonu, olay yönetimi ve AJAX istekleri gibi karmaşık görevleri basitleştirerek geliştirme sürecini hızlandırdı. Ancak modern web tarayıcılarının hızla gelişmesiyle birlikte, jQuery’nin sunduğu pek çok özelliğin artık tarayıcıların yerel JavaScript motorları tarafından doğrudan ve daha verimli bir şekilde desteklendiğini görüyoruz. Bu durum, “jQuery’ye hala ihtiyacımız var mı?” sorusunu gündeme getiriyor.
jQuery kullanmanın getirdiği en büyük dezavantajlardan biri, projenize eklediği dosya boyutudur. Her ne kadar sıkıştırılmış ve CDN’lerden servis edilebilen küçük bir kütüphane olsa da, her bir kilobyte mobil cihazlarda sayfa yükleme süresi üzerinde önemli bir etki yaratabilir. Vanilla JavaScript (yani saf JavaScript) kullanmak, bu bağımlılığı ortadan kaldırarak sayfa boyutunu küçültür ve dolayısıyla uygulamanızın daha hızlı yüklenmesini sağlar. Performans optimizasyonu günümüz web dünyasında kritik bir öneme sahiptir ve her geçen gün kullanıcılar daha hızlı deneyimler beklemektedir. jQuery’nin sunduğu birçok kolaylık artık Vanilla JS’in yerleşik özellikleriyle eşdeğer veya onlardan daha iyi hale geldi. Örneğin, querySelector ve querySelectorAll gibi DOM seçici metodları, jQuery’nin $() fonksiyonuna benzer bir kolaylık sunarken, fetch API’si AJAX isteklerini çok daha modern ve esnek bir şekilde ele almamızı sağlıyor.
Ayrıca, büyük bir kütüphaneye olan bağımlılık, potansiyel güvenlik açıklarını veya kütüphanenin gelecekteki bakım durumunu da beraberinde getirir. Vanilla JS ile çalışmak, kod tabanınız üzerinde tam kontrol sahibi olmanızı sağlar ve projenizi gereksiz dış bağımlılıklardan arındırır. Bu durum, uzun vadede projenin sürdürülebilirliğini ve bakım kolaylığını artırır. Geliştiriciler olarak, sürekli değişen web standartlarına ayak uydurmak ve en güncel teknolojileri benimsemek önemlidir. Modern JavaScript ekosistemi, ES6+ özellikleriyle birlikte çok daha güçlü, okunabilir ve yönetilebilir bir kod yazma imkanı sunuyor. Bu özellikler sayesinde, eskiden jQuery ile yapılan birçok işlem artık çok daha zarif ve performanslı bir şekilde Vanilla JS ile gerçekleştirilebilmektedir. Mobil uyumluluk ve Progressive Web Apps (PWA) gibi konuların giderek daha fazla önem kazandığı bir dönemde, performansı ve bağımsızlığı ön planda tutan bir geliştirme yaklaşımı benimsemek kaçınılmaz hale geliyor. Bu nedenle, jQuery’den uzaklaşarak Vanilla JS’in gücünü keşfetmek, hem kişisel gelişiminiz hem de projelerinizin geleceği için atabileceğiniz en iyi adımlardan biridir.
Modern JavaScript Seçicilerin Temelleri: querySelector ve querySelectorAll
jQuery’nin en çok kullanılan özelliklerinden biri, CSS seçicilerini kullanarak DOM’daki elementleri kolayca seçebilme yeteneğiydi. Modern JavaScript bu özelliği document.querySelector() ve document.querySelectorAll() metodlarıyla doğrudan tarayıcılara entegre etmiştir. Bu iki metod, herhangi bir harici kütüphaneye ihtiyaç duymadan, güçlü CSS seçicileri kullanarak web sayfanızdaki elementleri hedeflemenizi sağlar. Aslında, jQuery’nin arkasındaki motorlardan biri de bu yerel DOM seçici API’leri kullanmaktadır, bu yüzden Vanilla JS’e geçmek, performans açısından bir avantaj sağlayabilir çünkü aradaki soyutlama katmanını ortadan kaldırmış olursunuz. Bu sayede, tarayıcının yerel ve optimize edilmiş kodunu doğrudan kullanmış olursunuz.
Bu metodların temel prensibi oldukça basittir: CSS seçicilerini parametre olarak alırlar ve eşleşen DOM elementlerini döndürürler. Bu sayede, HTML yapınızda ne kadar karmaşık olursa olsun, belirli bir ID’ye, sınıfa, etikete veya attribute’a sahip elementleri kolayca bulabilirsiniz. Örneğin, bir formdaki tüm input elementlerini seçmek, belirli bir navigasyon menüsündeki linkleri yakalamak veya belirli bir veri özelliğine sahip elementleri filtrelemek artık standart JavaScript ile çok daha erişilebilir hale gelmiştir. Bu metodlar sadece document nesnesi üzerinde değil, aynı zamanda herhangi bir elementin kendisi üzerinde de çağrılabilir. Bu, belirli bir kapsayıcının (parent element) altındaki elementleri aramak istediğinizde oldukça kullanışlıdır ve arama kapsamını daraltarak performansı artırabilir.
Vanilla JavaScript’in bu seçici metodları, sadece element seçmekle kalmaz, aynı zamanda bu elementler üzerinde çeşitli manipülasyonlar yapmanıza da olanak tanır. Seçilen elementlerin içeriğini değiştirebilir, stil özelliklerini güncelleyebilir, yeni elementler ekleyebilir veya mevcut elementleri silebilirsiniz. Tüm bu işlemler, doğrudan tarayıcının sunduğu yerel DOM API’leri aracılığıyla gerçekleştirilir. Bu, gereksiz bağımlılıklardan kaçınarak daha hafif, daha hızlı ve daha güvenilir web uygulamaları geliştirmenizi sağlar. Geliştirme sürecinde esneklik kazanmak ve daha güncel web standartlarını benimsemek isteyen herkes için querySelector ve querySelectorAll, temel taşlardan biridir. Bu metodları etkin bir şekilde kullanabilmek, modern web geliştirme yeteneklerinizin vazgeçilmez bir parçası haline gelmiştir ve sizi bir adım öne taşıyacaktır.
Tekil Element Seçimi: document.querySelector() Nasıl Kullanılır?
document.querySelector() metodu, sağladığınız CSS seçiciyle eşleşen *ilk* elementi döndürür. Eğer hiçbir element eşleşmezse null değerini döndürür. Bu, özellikle benzersiz bir ID’ye sahip bir elementi veya bir sınıfa sahip birden fazla element arasından sadece ilkini hedeflemek istediğinizde kullanışlıdır. ID seçicileri (#myId) genellikle en hızlı olanlardır çünkü tarayıcılar bu elementleri doğrudan bir hash tablosu gibi bir yapı üzerinden erişebilirler.
Kullanımı oldukça basittir:
const baslikElementi = document.querySelector('#anaBaslik');
console.log(baslikElementi); // Ana başlık elementini döndürür
const ilkParagraf = document.querySelector('.metin-paragraf');
console.log(ilkParagraf); // 'metin-paragraf' sınıfına sahip ilk paragrafı döndürür
const ilkDiv = document.querySelector('div');
console.log(ilkDiv); // Sayfadaki ilk div elementini döndürür
const ozellikliElement = document.querySelector('[data-id="urun-123"]');
console.log(ozellikliElement); // data-id="urun-123" özniteliğine sahip elementi döndürür
Yukarıdaki örneklerde görüldüğü gibi, querySelector ile CSS'te kullandığımız tüm seçicileri kullanabiliriz: ID (#), sınıf (.), etiket adı, öznitelik seçiciler ve hatta daha karmaşık birleşik seçiciler (örneğin, div > p.highlight). Bu esneklik, belirli bir elementi hedefleme konusunda bize büyük bir güç sağlar. Unutulmamalıdır ki, querySelector her zaman ilk eşleşmeyi döndürür. Eğer aynı seçiciye sahip birden fazla element varsa ve siz hepsine erişmek istiyorsanız, o zaman querySelectorAll kullanmanız gerekecektir. Bu metodun hızlı ve doğrudan erişim sağlaması, özellikle tekil element manipülasyonları için idealdir.
Çoklu Element Seçimi: document.querySelectorAll() ve Dizi Benzeri Koleksiyonlar
document.querySelectorAll() metodu, sağladığınız CSS seçiciyle eşleşen *tüm* elementleri içeren bir NodeList nesnesi döndürür. Eğer hiçbir element eşleşmezse, boş bir NodeList döndürür. NodeList, bir dizi (Array) gibi görünse de, aslında bir dizi değildir; daha doğrusu dizi benzeri bir koleksiyondur. Bu, doğrudan dizi metodlarını (.map(), .filter(), .reduce()) kullanamayacağınız anlamına gelir. Ancak NodeList üzerinde döngü (for...of, .forEach()) yapabilir ve elementlere indeks numaralarıyla erişebilirsiniz.
Eğer bir NodeList'i gerçek bir diziye dönüştürmek isterseniz, JavaScript'in modern özelliklerinden faydalanabilirsiniz:
const tumParagraflar = document.querySelectorAll('.metin-paragraf');
console.log(tumParagraflar); // 'metin-paragraf' sınıfına sahip tüm paragrafları içeren NodeList
// NodeList üzerinde döngü yapmak
tumParagraflar.forEach(p => {
p.style.backgroundColor = '#e0ffe0';
});
// NodeList'i gerçek bir diziye dönüştürme (yayma operatörü ile)
const paragrafDizisi = [...tumParagraflar];
paragrafDizisi.map(p => console.log(p.textContent));
// Veya Array.from() metodu ile
const paragrafDizisi2 = Array.from(tumParagraflar);
paragrafDizisi2.filter(p => p.textContent.length > 50).forEach(p => p.style.border = '1px solid blue');
Bu metod, bir sayfadaki belirli bir kategorideki tüm ürünleri seçmek, bir menüdeki tüm bağlantılara olay dinleyicileri eklemek veya belirli bir stile sahip tüm öğeleri güncellemek gibi durumlarda oldukça güçlüdür. querySelectorAll ile elde ettiğiniz NodeList canlı bir koleksiyon değildir, yani sayfa üzerinde DOM değişiklikleri yapsanız bile, NodeList içeriği otomatik olarak güncellenmez. Bu, bazı durumlarda beklenen davranıştan farklı olabilir; bu nedenle dinamik olarak değişen DOM üzerinde işlem yaparken bu özelliği göz önünde bulundurmak önemlidir. Örneğin, bir liste öğesi eklediğinizde veya sildiğinizde, querySelectorAll'ı tekrar çağırmanız gerekebilir. Bu, jQuery'nin bazı "canlı" koleksiyon davranışlarından farklıdır ve bu farkın farkında olmak hataların önüne geçecektir. Gerçek dünya uygulamalarında bu durum, özellikle kullanıcı etkileşimiyle DOM'un sık sık değiştiği yerlerde önemli hale gelir. Dolayısıyla, querySelectorAll ile elde edilen sonuçların anlık bir "snapshot" olduğunu anlamak, doğru ve performanslı kod yazımı için kritik bir bilgidir.
Gerçek Dünya Senaryolarında Seçiciler: Pratik Uygulamalar ve Vaka Analizleri
jQuery'den vazgeçip Vanilla JavaScript seçicilerine geçişin pratik faydalarını görmek için, günlük geliştirme görevlerinde sıkça karşılaşılan senaryolara yakından bakalım. Bu senaryolar, sadece elementleri nasıl seçeceğimizi değil, aynı zamanda seçilen elementler üzerinde nasıl etkileşim kuracağımızı ve DOM'u nasıl manipüle edeceğimizi de gösterecek. Bu, sadece teorik bilgiden öteye geçerek, gerçek projelerde karşılaşabileceğiniz sorunlara çözüm üretmenizi sağlayacaktır.
Bir e-ticaret sitesi geliştirdiğinizi düşünün. Kullanıcılar bir ürün listesinde filtreleme yapmak istiyor, sepetlerine ürün ekliyorlar veya bir form dolduruyorlar. Tüm bu etkileşimler, DOM elementlerinin seçilmesini, özelliklerinin değiştirilmesini ve olaylara tepki verilmesini gerektirir. jQuery ile bu işlemler genellikle tek bir $() fonksiyonu çağrısı ile başlardı. Vanilla JS'te ise, querySelector ve querySelectorAll ile elementleri seçip, ardından standart DOM API metodlarını kullanarak işlemlerimizi gerçekleştiririz. Bu yaklaşım, kodu daha şeffaf hale getirir ve tarayıcının yerel yeteneklerinden tam olarak faydalanmamızı sağlar.
Örneğin, bir filtreleme işlemi için, tüm filtre seçeneklerini seçip her birine bir olay dinleyicisi ekleyebiliriz. Ya da bir sepete ekle butonuna tıklandığında, ilgili ürün bilgilerini alıp bir HTML şablonu oluşturarak sepet div'ine ekleyebiliriz. Tüm bu işlemler, doğrudan tarayıcının sunduğu araçlarla, ek bir soyutlama katmanı olmaksızın yapılabilir. Bu, sadece performans avantajı sağlamakla kalmaz, aynı zamanda kodun daha temiz, daha kolay anlaşılır ve daha sürdürülebilir olmasına da yardımcı olur. Ayrıca, bu yaklaşımla, tarayıcıların gelecekteki performans iyileştirmelerinden doğrudan faydalanabilirsiniz, çünkü kodunuz doğrudan tarayıcının en optimize edilmiş API'lerini kullanacaktır. Bu bölümde, form yönetimi ve dinamik listeler gibi yaygın senaryolar üzerinde durarak, seçicilerin ne kadar güçlü ve esnek olduğunu detaylı örneklerle gözler önüne sereceğiz. Bu vaka analizleri, Vanilla JS ile neler yapabileceğinizi somutlaştıracak ve kendi projelerinizde benzer çözümleri uygulamanız için size ilham verecektir.
Form Yönetiminde Seçicilerin Gücü
Web formları, kullanıcı etkileşiminin temel taşlarından biridir ve JavaScript ile dinamik olarak yönetilmeleri gerekir. Vanilla JS seçicileriyle form elementlerini seçmek ve onların değerlerini okumak veya değiştirmek oldukça kolaydır. Örneğin, bir kayıt formundaki tüm input alanlarını veya sadece belirli bir türe sahip inputları seçebiliriz.
Bu örnekte, kayitFormu ID'sine sahip formu seçip bir 'submit' olay dinleyicisi ekledik. Ardından, formun içindeki farklı input elementlerini, name özniteliklerini veya type özniteliklerini kullanarak seçtik. querySelector metodunu bir elementin üzerinde çağırdığımızda, arama sadece o elementin alt elementleri arasında yapılır. Bu, daha spesifik ve performanslı seçimler yapmamızı sağlar. Son olarak, tüm form elementlerini seçip bir NodeList elde ettik ve bu liste üzerinde döngü yaparak tüm form verilerini bir objede topladık. Bu yaklaşım, form doğrulama, dinamik alan ekleme/çıkarma veya çoklu adım formları gibi karmaşık senaryolarda oldukça güçlüdür.
Dinamik Liste ve Tablo İşlemleri
Web uygulamalarında sıkça karşılaşılan bir başka senaryo da dinamik olarak listeler veya tablolar oluşturmak ve bu elementler üzerinde işlem yapmaktır. Örneğin, bir ürün listesini filtrelemek, sıralamak veya pagination (sayfalama) uygulamak isteyebiliriz. Vanilla JS seçicileri ve DOM manipülasyonu ile bu işlemleri kolayca yapabiliriz.
- Laptop
- T-shirt
- Tablet
- Roman
- Ceket
Bu vaka analizinde, ürün listesindeki öğeleri data-kategori özniteliğine göre filtreleyebilir veya data-fiyat özniteliğine göre sıralayabiliriz. querySelectorAll ile tüm ürün öğelerini seçtikten sonra, forEach döngüsü ile her bir öğe üzerinde işlem yapabiliriz. dataset özelliği, HTML5'in data- özniteliklerine kolayca erişmemizi sağlar. Sıralama örneğinde, NodeList'i önce gerçek bir diziye dönüştürdük (Array.from() kullanarak), ardından sort() metodunu uyguladık ve son olarak sıralanmış elementleri DOM'a tekrar ekledik. DOM manipülasyonu yaparken, appendChild() veya insertBefore() gibi metodları kullanarak elementlerin konumunu değiştirebiliriz. Bu tür dinamik işlemler, kullanıcı deneyimini zenginleştirir ve uygulamanın interaktifliğini artırır.
DocumentFragment üzerinde yapıp tek seferde DOM'a eklemek, yeniden çizim (reflow/repaint) sayısını azaltarak performansı artırır.
Performans İpuçları ve En İyi Uygulamalar: Hızlı ve Verimli Kod Yazımı
Vanilla JavaScript ile element seçimi ve DOM manipülasyonu yaparken performans, her zaman göz önünde bulundurmamız gereken kritik bir faktördür. Yanlış uygulamalar, özellikle büyük ve karmaşık web sayfalarında ciddi performans sorunlarına yol açabilir. Bu nedenle, seçicileri ve DOM işlemlerini en verimli şekilde kullanmanın yollarını anlamak, modern web geliştiriciliğinin temelini oluşturur. jQuery'den Vanilla JS'e geçiş yaparken elde ettiğiniz performans avantajını korumak ve hatta daha da artırmak için bazı önemli ipuçları ve en iyi uygulamalar mevcuttur. Bu bölümde, kodunuzu hızlandırmanın ve gereksiz kaynak tüketimini önlemenin yollarını detaylı olarak inceleyeceğiz. Ayrıca, mobil cihazlarda da sorunsuz bir deneyim sunmak için CSS ve JavaScript seçicilerini bir arada nasıl kullanacağımızı da ele alacağız.
Performansı etkileyen temel faktörlerden biri, DOM'da ne sıklıkla arama yaptığınız ve ne kadar geniş bir alanda arama yaptığınızdır. Her querySelector veya querySelectorAll çağrısı, tarayıcının DOM ağacında gezinmesini gerektirir. Bu işlem, özellikle çok sayıda element içeren sayfalarda pahalı olabilir. Bu nedenle, seçici çağrılarını minimize etmek ve mümkün olduğunca belirli bir kapsamda (örneğin, bir elementin altındaki diğer elementleri seçmek) arama yapmak önemlidir. Ayrıca, seçicilerinizin ne kadar özgül olduğu da performansı etkiler; çok genel seçiciler (* gibi) veya çok karmaşık birleşik seçiciler, daha fazla işleme süresi gerektirebilir. Performans optimizasyonu sadece kodunuzun hızlı çalışmasını sağlamakla kalmaz, aynı zamanda kullanıcıların daha akıcı bir deneyim yaşamasını ve sayfa yükleme sürelerinin kısalmasını da sağlar. Bu da SEO açısından da olumlu bir etki yaratır, çünkü arama motorları hızlı yüklenen sayfaları daha üst sıralarda gösterebilir. Dolayısıyla, sadece fonksiyonellik değil, performans da göz önünde bulundurularak kod yazmak, modern web geliştirmenin vazgeçilmez bir parçasıdır.
Seçici Performansını Artırmak İçin Nelere Dikkat Etmeli?
- En Özgül Seçiciyi Kullanın: Mümkünse ID seçicilerini (
#myId) kullanın, bunlar en hızlısıdır. Ardından sınıf seçicileri (.myClass) ve son olarak etiket seçiciler (div). Daha karmaşık seçiciler (örneğin,div.container > p.item[data-status="active"]) daha yavaş olabilir. - Arama Kapsamını Daraltın:
documentyerine, mümkünse daha küçük bir kapsayıcı element üzerindequerySelectorveyaquerySelectorAllkullanın. Örneğin:const container = document.querySelector('#sidebar'); const items = container.querySelectorAll('.menu-item'); // Sadece #sidebar içindeki .menu-item'ları arar - Seçici Sonuçlarını Önbelleğe Alın: Aynı elementi veya element koleksiyonunu birden fazla kez kullanacaksanız, ilk seçimden sonra bir değişkende saklayın. Her seferinde DOM'u tekrar sorgulamaktan kaçının.
const myButton = document.querySelector('#myButton'); // Sadece bir kez seçildi myButton.addEventListener('click', () => { // İşlem yap }); // Başka bir yerde myButton'ı tekrar kullanmak için tekrar sorgulamaya gerek yok myButton.textContent = 'Tıklandı!'; - Canlı Koleksiyonlardan Kaçının (Gereksizse):
document.getElementsByClassName()veyadocument.getElementsByTagName()gibi metodlar "canlı"HTMLCollection'lar döndürür, yani DOM değiştiğinde koleksiyon otomatik olarak güncellenir. Bu, bazı durumlarda avantajlı olsa da, her erişimde koleksiyonun yeniden hesaplanmasına neden olabileceği için performans maliyeti oluşturabilir.querySelectorAll'ın döndürdüğüNodeListise "statiktir" ve performans genellikle daha tahmin edilebilirdir. - Minimum DOM Manipülasyonu: Birden fazla DOM değişikliği yapmanız gerektiğinde, bu değişiklikleri bir araya getirin. Örneğin, bir liste elemanına 10 adet
ekleyecekseniz, her'yi ayrı ayrı eklemek yerine, önce birDocumentFragmentoluşturup tüm'leri ona ekleyin ve sonraDocumentFragment'i tek seferde DOM'a ekleyin. Bu, tarayıcının yeniden çizim (reflow ve repaint) işlemlerini minimize eder. - Debouncing ve Throttling Kullanın: Özellikle
scroll,resizeveyamousemovegibi sık tetiklenen olay dinleyicilerinde, performans sorunlarını önlemek için debouncing veya throttling tekniklerini kullanın. Bu, olay işleyicilerinin belirli bir zaman aralığında sadece bir kez veya maksimum bir kere tetiklenmesini sağlar.
Bu ipuçlarını uygulayarak, Vanilla JS kodunuzu hem daha hızlı hem de daha verimli hale getirebilirsiniz. Unutmayın, iyi performans sadece teknik bir gereklilik değil, aynı zamanda daha iyi bir kullanıcı deneyimi sunmanın anahtarıdır.
Mobil Uyumluluk İçin CSS ve JS Seçicileri Bir Arada Kullanmak
Mobil öncelikli tasarım (mobile-first design) yaklaşımı günümüz web geliştirmenin temelini oluşturuyor. Mobil cihazlarda, daha kısıtlı işlem gücü ve bant genişliği olduğundan, performans optimizasyonları daha da kritik hale geliyor. CSS medya sorguları (media queries) ve JavaScript seçicilerini bir arada kullanarak mobil uyumlu ve performanslı uygulamalar geliştirebiliriz.
Bir örnekle açıklayalım: Geniş ekranlarda bir navigasyon menüsünü yatay olarak göstermek, mobil ekranlarda ise dikey olarak açılır (hamburger menü) şekilde gizleyip göstermek isteyebiliriz. CSS medya sorguları ile menünün görünümünü değiştirebilirken, JavaScript ile hamburger butonuna tıklama olayını yönetiriz.
Bu örnekte, CSS medya sorgularıyla menünün varsayılan görünümünü (mobil için gizli, masaüstü için görünür) ayarlıyoruz. JavaScript tarafında ise, querySelector ile hamburger butonunu ve navigasyon listesini seçip, butona tıklama olayında navList elementinin active sınıfını toggle ediyoruz. Bu sınıfın varlığı veya yokluğu, CSS ile menünün görünürlüğünü kontrol ediyor. aria-expanded gibi erişilebilirlik özniteliklerini güncellemek de iyi bir pratiktir.
window.addEventListener('resize') ile ekran boyutu değiştiğinde menünün durumunu sıfırlayarak, cihaz dikeyden yataya veya tersine döndüğünde kullanıcı deneyiminin tutarlı kalmasını sağlıyoruz. Bu yaklaşım, hem görsel tutarlılık hem de performans açısından oldukça etkilidir. JavaScript'i sadece etkileşim için kullanırken, görünüm ve yerleşimi CSS'e bırakmak, tarayıcının render motorunu daha verimli kullanmasını sağlar ve gereksiz JavaScript hesaplamalarından kaçınırız. Bu birleşme, modern, responsive ve yüksek performanslı web siteleri oluşturmanın anahtarıdır.
jQuery Kodunu Vanilla JS'e Dönüştürme: Adım Adım Rehber
Mevcut bir jQuery projeniz varsa veya eski jQuery kodlarını modern Vanilla JavaScript'e taşımak istiyorsanız, bu bölüm size yol gösterecektir. Dönüşüm süreci korkutucu görünse de, jQuery'nin yaptığı çoğu şeyin arkasında aslında tarayıcının yerel DOM API'leri yatar. Bu nedenle, jQuery kodunu anlamak ve onu eşdeğer Vanilla JS koduna çevirmek genellikle düşündüğünüzden daha kolaydır. Anahtar nokta, jQuery'nin sunduğu her bir metodun Vanilla JS'deki karşılığını bilmek ve bu geçişi adım adım, kontrollü bir şekilde yapmaktır. Bu dönüşüm, projenizin bağımlılıklarını azaltacak, performansını artıracak ve modern web standartlarına uygun hale getirecektir. Ayrıca, Vanilla JS'e hakim olmak, React, Vue veya Angular gibi modern kütüphane ve framework'leri öğrenmeniz için de sağlam bir temel oluşturacaktır.
jQuery, birçok fonksiyonu zincirleme (chaining) imkanı sunarak kod yazmayı kolaylaştırır. Vanilla JS'de bu tür zincirleme her zaman mümkün olmasa da, modern JavaScript'in getirdiği kolaylıklarla (örneğin, yayma operatörü, forEach gibi Array metodları) benzer sonuçlara ulaşabiliriz. Dönüşüm sürecinde dikkat etmeniz gereken en önemli noktalardan biri, jQuery'nin her zaman bir "jQuery nesnesi" döndürmesidir. Bu nesne, üzerinde birden fazla eleman olsa bile tek bir elemanmış gibi işlem yapmanızı sağlar. Vanilla JS'de ise querySelector tek bir element, querySelectorAll ise bir NodeList (dizi benzeri bir koleksiyon) döndürür. Bu farklılığı göz önünde bulundurarak kod yazmanız gerekmektedir. Şimdi, sıkça kullanılan jQuery metodlarının Vanilla JS karşılıklarına ve dönüşüm stratejilerine bakalım.
| jQuery Kodu | Vanilla JS Karşılığı | Açıklama |
|---|---|---|
$('#id') |
document.querySelector('#id') |
ID ile tekil element seçimi. |
$('.class') |
document.querySelectorAll('.class') |
Sınıf ile çoklu element seçimi. Bir NodeList döndürür. |
$('div') |
document.querySelectorAll('div') |
Etiket adı ile çoklu element seçimi. |
$('#id').text() |
element.textContent |
Elementin metin içeriğini alma/ayarlama. |
$('#id').text('Yeni Metin') |
element.textContent = 'Yeni Metin' |
Elementin metin içeriğini ayarlama. |
$('#id').html() |
element.innerHTML |
Elementin HTML içeriğini alma/ayarlama. |
$('#id').html('Yeni HTML') |
element.innerHTML = 'Yeni HTML' |
Elementin HTML içeriğini ayarlama. |
$('#id').val() |
element.value |
Form elementlerinin değerini alma/ayarlama. |
$('#id').val('yeniDeger') |
element.value = 'yeniDeger' |
Form elementlerinin değerini ayarlama. |
$('#id').attr('href') |
element.getAttribute('href') |
Öznitelik değerini alma. |
$('#id').attr('href', '/yeni-link') |
element.setAttribute('href', '/yeni-link') |
Öznitelik değerini ayarlama. |
$('#id').addClass('aktif') |
element.classList.add('aktif') |
Sınıf ekleme. |
$('#id').removeClass('aktif') |
element.classList.remove('aktif') |
Sınıf kaldırma. |
$('#id').toggleClass('aktif') |
element.classList.toggle('aktif') |
Sınıfı açıp kapama. |
$('#id').hasClass('aktif') |
element.classList.contains('aktif') |
Elementin sınıf içerip içermediğini kontrol etme. |
$('#id').css('color') |
getComputedStyle(element).color |
Hesaplanmış stil değerini alma. |
$('#id').css('color', 'red') |
element.style.color = 'red' |
Elementin stilini ayarlama. |
$('#id').hide() |
element.style.display = 'none' |
Elementi gizleme. |
$('#id').show() |
element.style.display = '' (veya uygun bir değer) |
Elementi gösterme. |
$('#id').on('click', handler) |
element.addEventListener('click', handler) |
Olay dinleyicisi ekleme. |
$('#id').click(handler) |
element.addEventListener('click', handler) |
Kısayol olay dinleyicisi. |
$('#id').off('click', handler) |
element.removeEventListener('click', handler) |
Olay dinleyicisi kaldırma. |
$('div').each(function() { ... }) |
document.querySelectorAll('div').forEach(element => { ... }) |
Koleksiyon üzerinde döngü. |
$('
|
document.createElement('div') |
Yeni element oluşturma. |
$('#parent').append($newEl) |
parentEl.appendChild(newEl) |
Element ekleme. |
$('#element').remove() |
element.remove() |
Elementi kaldırma. |
Bu tablo, en yaygın jQuery metodlarının Vanilla JS karşılıklarını göstermektedir. Dönüşüm yaparken bu tabloyu bir başvuru noktası olarak kullanabilirsiniz. jQuery'nin data() metodu, Vanilla JS'de element.dataset ile kolayca erişilebilen data- öznitelikleriyle eşdeğerdir. Animasyonlar gibi daha karmaşık jQuery efektleri için ise CSS geçişleri (transitions) ve anahtar kare animasyonları (keyframe animations) veya Web Animations API gibi modern tarayıcı API'leri kullanılabilir. Bu API'ler, tarayıcının yerel hızlandırmalarını kullanarak daha akıcı ve performanslı animasyonlar sunar.
$().ajax() veya $().animate()) Vanilla JS muadilleriyle (fetch API, Web Animations API) değiştirerek kademeli bir geçiş yapabilirsiniz. Bu, daha büyük kod tabanlarında daha güvenli bir yaklaşımdır.
Sonuç ve Sıkça Sorulan Sorular
Modern web geliştirme dünyasında, jQuery gibi kütüphanelere olan bağımlılığın azalması bir trend haline gelmiştir. Tarayıcıların yerel JavaScript yeteneklerinin gelişmesiyle birlikte, document.querySelector() ve document.querySelectorAll() gibi güçlü seçiciler aracılığıyla DOM manipülasyonu, olay yönetimi ve diğer birçok görev artık Vanilla JavaScript ile daha verimli ve doğrudan gerçekleştirilebilmektedir. Bu makale boyunca, jQuery'den vazgeçmenin nedenlerini, Vanilla JS seçicilerinin temellerini, gerçek dünya senaryolarında nasıl kullanılacağını, performans optimizasyon ipuçlarını ve jQuery kodunu Vanilla JS'e nasıl dönüştüreceğimizi detaylı bir şekilde inceledik. Amacımız, web geliştiricilerine daha hafif, daha hızlı ve daha sürdürülebilir uygulamalar oluşturmaları için gerekli bilgi ve araçları sunmaktı. Bağımlılıklardan arınmak, projenizin uzun vadeli bakımını kolaylaştırırken, aynı zamanda tarayıcıların sunduğu en güncel ve optimize edilmiş API'lerden faydalanmanızı sağlar. Bu dönüşüm, sadece bir teknoloji seçimi değil, aynı zamanda web geliştirme felsefenizin bir evrimidir.
Sıkça Sorulan Sorular
- S: jQuery'siz JavaScript seçicileri kullanmak performansımı ne kadar artırır?
C: Performans artışı, projenizin büyüklüğüne ve jQuery kullanım yoğunluğuna bağlı olarak değişir. Ancak, jQuery'nin getirdiği ek dosya boyutunu ortadan kaldırmak ve tarayıcının yerel DOM API'lerini doğrudan kullanmak genellikle sayfa yükleme süresini hızlandırır ve çalışma zamanı performansını iyileştirir. Büyük projelerde bu fark daha belirgin olabilir.
- S:
querySelectorvequerySelectorAllarasındaki temel fark nedir?C:
querySelector()sağlanan CSS seçiciyle eşleşen *ilk* elementi döndürür veya eşleşme yoksanulldöndürür.querySelectorAll()ise eşleşen *tüm* elementleri içeren birNodeListnesnesi döndürür veya eşleşme yoksa boş birNodeListdöndürür. - S:
NodeListbir dizi (Array) midir? Dizi metodlarını kullanabilir miyim?C:
NodeListbir dizi benzeri (array-like) koleksiyondur, ancak doğrudan bir JavaScript dizisi değildir. Bu nedenle,map(),filter()gibi doğrudan dizi metodlarını kullanamazsınız. AncakforEach()metodu ile üzerinde döngü yapabilir veyaArray.from(nodeList)ya da yayma operatörü ([...nodeList]) kullanarak gerçek bir diziye dönüştürebilirsiniz. - S: Eski tarayıcı uyumluluğu için ne yapmalıyım?
C:
querySelectorvequerySelectorAllgibi metodlar modern tarayıcıların çoğunda geniş çaplı desteğe sahiptir (IE8+). Daha eski tarayıcılar için (eğer projenizin hedef kitlesi bunu gerektiriyorsa),document.getElementById(),document.getElementsByClassName()veyadocument.getElementsByTagName()gibi daha eski DOM API'lerini kullanmanız veya bir polifil (polyfill) kütüphanesi entegre etmeniz gerekebilir. Ancak çoğu modern web projesi için bu endişeler geçerli değildir. - S: Animasyonlar ve AJAX istekleri gibi karmaşık jQuery özelliklerini nasıl Vanilla JS'e dönüştürebilirim?
C: AJAX istekleri için
fetch APIveyaXMLHttpRequestobjesini kullanabilirsiniz. Animasyonlar için CSS geçişleri (transition), CSS anahtar kare animasyonları (@keyframes) veya daha gelişmiş animasyonlar içinWeb Animations APIkullanılabilir. Bu yerel API'ler genellikle jQuery'den daha performanslı ve esnektir.
