Tüm blog yazıları

JavaScript DOM Events: Event Handler'larda "this" Anahtar Kelimesi

JavaScript DOM Events'te this anahtar kelimesinin sırrını çözün! Event handler'larda this'in olayı tetikleyen elementi nasıl ifade ettiğini, çoklu buton yönetimi ve tekrar kullanılabilir fonksiyonlar için pratik kullanımını öğrenin. this karmaşasına son verin!

eminbasbayan4 dk okuma
JavaScript kodunda 'this' anahtar kelimesi vurgulanmış, arka planda DOM elementleri ve event tetikleyicileri.

JavaScript'te this anahtar kelimesi birçok geliştiricinin kafasını karıştırır. Ancak event handler'larda kullanıldığında aslında oldukça mantıklı ve kullanışlıdır. Bu makalede, this kelimesinin event callback fonksiyonlarında nasıl çalıştığını öğreneceğiz ve bunu pratikte nasıl kullanabileceğimizi göreceğiz.

Event Handler'larda "this" Neyi İfade Eder?

Bir event handler callback fonksiyonu içinde this anahtar kelimesi, olayın tetiklendiği elementi ifade eder. Yani hangi elemente tıkladıysanız, hangi elementin üzerine fare ile geldiyseniz, this o elementi gösterir.

javascript
const buton = document.querySelector('#benimButon');

buton.addEventListener('click', function() {
    console.log(this); // Tıklanan buton elementini gösterir
});

Pratik Örnek: Çoklu Butonlar

Diyelim ki sayfada birden fazla renk değiştirme butonumuz var:

HTML

html
<button class="renk-btn">Kırmızı</button>
<button class="renk-btn">Mavi</button>
<button class="renk-btn">Yeşil</button>
<button class="renk-btn">Sarı</button>
<button class="renk-btn">Mor</button>

JavaScript (this kullanmadan - Kötü Yöntem)

javascript
const butonlar = document.querySelectorAll('.renk-btn');

butonlar.forEach(function(buton) {
    buton.addEventListener('click', function() {
        // buton değişkenini kullanıyoruz
        buton.style.backgroundColor = 'orange';
        buton.style.color = 'white';
    });
});

JavaScript (this kullanarak - İyi Yöntem)

javascript
const butonlar = document.querySelectorAll('.renk-btn');

butonlar.forEach(function(buton) {
    buton.addEventListener('click', function() {
        // this kullanıyoruz
        this.style.backgroundColor = 'orange';
        this.style.color = 'white';
    });
});

Her iki yöntem de çalışır, ama this kullanmanın avantajını birazdan göreceğiz.

Neden "this" Kullanmalıyız?

Avantaj 1: Tekrar Kullanılabilir Fonksiyonlar

this kullanarak, aynı fonksiyonu birden fazla element için kullanabiliriz:

javascript
// Tek bir fonksiyon tanımlıyoruz
function vurgula() {
    this.style.backgroundColor = '#f0f0f0';
    this.style.boxShadow = '0 4px 8px rgba(0,0,0,0.2)';
    this.style.transform = 'scale(1.05)';
}

function vurguyuKaldir() {
    this.style.backgroundColor = '';
    this.style.boxShadow = '';
    this.style.transform = '';
}

// Tüm kartlara uygulayalım
const kartlar = document.querySelectorAll('.urun-karti');
kartlar.forEach(function(kart) {
    kart.addEventListener('mouseenter', vurgula);
    kart.addEventListener('mouseleave', vurguyuKaldir);
});

// Tüm menü öğelerine de uygulayalım
const menuOgeleri = document.querySelectorAll('.menu-item');
menuOgeleri.forEach(function(oge) {
    oge.addEventListener('mouseenter', vurgula);
    oge.addEventListener('mouseleave', vurguyuKaldir);
});

Gördüğünüz gibi, vurgula ve vurguyuKaldir fonksiyonlarını hem ürün kartlarına hem de menü öğelerine uyguladık. this sayesinde fonksiyon, hangi elemente uygulandıysa onu etkiliyor.

Avantaj 2: Daha Temiz Kod

javascript
// this kullanmadan
butonlar.forEach(function(buton) {
    buton.addEventListener('click', function() {
        buton.classList.toggle('aktif');
        buton.textContent = buton.classList.contains('aktif') ? 'Açık' : 'Kapalı';
    });
});

// this kullanarak
butonlar.forEach(function(buton) {
    buton.addEventListener('click', function() {
        this.classList.toggle('aktif');
        this.textContent = this.classList.contains('aktif') ? 'Açık' : 'Kapalı';
    });
});

Gerçek Hayat Örneği: Renk Paleti Uygulaması

Kullanıcının tıkladığı rengi seçtiği bir renk paleti yapalım:

HTML

html
<div class="palet">
    <div class="renk" style="background-color: #e74c3c;"></div>
    <div class="renk" style="background-color: #3498db;"></div>
    <div class="renk" style="background-color: #2ecc71;"></div>
    <div class="renk" style="background-color: #f1c40f;"></div>
    <div class="renk" style="background-color: #9b59b6;"></div>
    <div class="renk" style="background-color: #1abc9c;"></div>
</div>
<div id="secilen-renk">Seçilen: Henüz seçilmedi</div>

JavaScript

javascript
const renkKutulari = document.querySelectorAll('.renk');
const secilenRenkDiv = document.querySelector('#secilen-renk');

function renkSec() {
    // Tüm kutulardan "secili" class'ını kaldır
    renkKutulari.forEach(function(kutu) {
        kutu.classList.remove('secili');
    });
    
    // Tıklanan kutuya "secili" class'ını ekle
    this.classList.add('secili');
    
    // Seçilen rengi göster
    const renk = this.style.backgroundColor;
    secilenRenkDiv.textContent = 'Seçilen: ' + renk;
    secilenRenkDiv.style.backgroundColor = renk;
}

renkKutulari.forEach(function(kutu) {
    kutu.addEventListener('click', renkSec);
});

Gerçek Hayat Örneği: Akordeon Menü

Tıklanan bölümün açılıp kapandığı bir akordeon menü:

javascript
function akordeonToggle() {
    // Tıklanan başlığın içerik kısmını bul
    const icerik = this.nextElementSibling;
    
    // Açık/kapalı durumunu değiştir
    if (icerik.style.maxHeight) {
        icerik.style.maxHeight = null;
        this.classList.remove('aktif');
    } else {
        icerik.style.maxHeight = icerik.scrollHeight + 'px';
        this.classList.add('aktif');
    }
}

const akordeonBasliklari = document.querySelectorAll('.akordeon-baslik');
akordeonBasliklari.forEach(function(baslik) {
    baslik.addEventListener('click', akordeonToggle);
});

Gerçek Hayat Örneği: Yapılacaklar Listesi

Tıklanan görevin tamamlandı olarak işaretlenmesi:

javascript
function gorevToggle() {
    this.classList.toggle('tamamlandi');
    
    // Üzerini çiz veya çizgiyi kaldır
    if (this.classList.contains('tamamlandi')) {
        this.style.textDecoration = 'line-through';
        this.style.opacity = '0.6';
    } else {
        this.style.textDecoration = 'none';
        this.style.opacity = '1';
    }
}

const gorevler = document.querySelectorAll('.gorev');
gorevler.forEach(function(gorev) {
    gorev.addEventListener('click', gorevToggle);
});

⚠️ Dikkat: Arrow Function'larda "this"

Arrow function'lar (ok fonksiyonları) kendi this değerini oluşturmaz. Bu yüzden event handler'larda arrow function kullanırken dikkatli olmalısınız:

javascript
// ❌ YANLIŞ - Arrow function this'i farklı yorumlar
buton.addEventListener('click', () => {
    console.log(this); // Window objesini gösterir, butonu değil!
});

// ✅ DOĞRU - Normal function this'i doğru yorumlar
buton.addEventListener('click', function() {
    console.log(this); // Buton elementini gösterir
});

Alternatif: event.target Kullanımı

Arrow function kullanmak istiyorsanız, event.target veya event.currentTarget kullanabilirsiniz:

javascript
buton.addEventListener('click', (event) => {
    console.log(event.target); // Tıklanan elementi gösterir
    console.log(event.currentTarget); // Event listener'ın bağlı olduğu elementi gösterir
});

this vs event.target vs event.currentTarget

ÖzellikAçıklama
thisEvent listener'ın bağlı olduğu element
event.targetOlayı başlatan gerçek element
event.currentTargetEvent listener'ın bağlı olduğu element (this ile aynı)
javascript
// Örnek: Bir div içindeki butona tıklama
const container = document.querySelector('.container');

container.addEventListener('click', function(event) {
    console.log('this:', this);                    // .container div
    console.log('event.target:', event.target);    // Tıklanan element (belki iç buton)
    console.log('event.currentTarget:', event.currentTarget); // .container div
});

Özet

Bu makalede öğrendiklerimiz:

✅ Event handler'larda this, olayın tetiklendiği elementi ifade eder
✅ this sayesinde tekrar kullanılabilir fonksiyonlar yazabiliriz
✅ Arrow function'lar this'i farklı yorumlar, dikkatli olun
✅ Alternatif olarak event.target veya event.currentTarget kullanılabilir
✅ this ve event.currentTarget genellikle aynı elementi gösterir

Bir sonraki makalede Keyboard Events (Klavye Olayları) ve Event Object (Olay Nesnesi) konularını inceleyeceğiz.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele