Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

JavaScript preventDefault nedir?​


event.preventDefault(), tarayıcının bir olay için varsayılan davranışını iptal eden JavaScript yöntemidir. Örneğin bir formun gönderilmesini, bir bağlantının başka sayfaya gitmesini veya sürüklenen bir öğenin tarayıcının varsayılan işlemine bırakılmasını engelleyebilir. Yöntem yalnızca olay iptal edilebilirse etkili olur; olayın JavaScript dinleyicilerinin diğerlerine ulaşmasını durdurmaz.

Nasıl çalışır?​


Tarayıcı bir olay meydana geldiğinde önce o olay için yerleşik bir davranış planlar. Form gönderiminde sayfayı yenilemek, bağlantı tıklamasında hedefe gitmek ve bazı fare olaylarında tarayıcı işlemlerini sürdürmek buna örnektir. Olay dinleyicisi içinde event.preventDefault() çağrılırsa bu varsayılan işlem iptal edilir.

Bu yöntem, olayın yayılmasını durdurmaz. Yani aynı olay üst öğelere ulaşmaya devam edebilir. Yayılmayı durdurmak gerekiyorsa ayrı bir işlem olan event.stopPropagation() değerlendirilir. İki yöntemi aynı amaç sanmak, özellikle olay devretme (event delegation) kullanılan kodlarda hatalı sonuçlara yol açar.

Çalışan en küçük örnek: form gönderimini kontrol etmek​


Aşağıdaki dosyayı index.html adıyla kaydedip tarayıcıda açın. Tarayıcının yerleşik e-posta doğrulaması geçince normal gönderim iptal edilir ve yalnız yerel sonuç metni gösterilir. Bu örnek sunucuya veri göndermez veya üyelik oluşturmaz.

Kod:
<!doctype html>
<html lang="tr">
<head>
  <meta charset="utf-8">
  <title>preventDefault örneği</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>input, button { border-radius: 4px; }</style>
</head>
<body>
  <form id="signup-form">
    <label>
      E-posta:
      <input id="email" type="email" required>
    </label>
    <button type="submit">Gönder</button>
  </form>
  <p id="result" role="status"></p>

  <script>
    const form = document.querySelector('#signup-form');
    const email = document.querySelector('#email');
    const result = document.querySelector('#result');

    form.addEventListener('submit', function (event) {
      event.preventDefault();

      result.textContent = `Yerel demo: ${email.value}`;
    });
  </script>
</body>
</html>

Beklenen sonuç, form gönderildiğinde sayfanın yenilenmemesi ve result paragrafında girilen e-posta adresinin görünmesidir. Sayfa yenileniyorsa dinleyicinin gerçekten submit olayına bağlandığını ve preventDefault() çağrısının olay işleyicisi içinde çalıştığını kontrol edin. required gibi yerleşik doğrulama alanları geçersizse tarayıcı submit olayını çalıştırmadan önce kullanıcıdan alanı düzeltmesini isteyebilir.

Hangi durumda kullanılmalı?​


preventDefault() kullanmadan önce tarayıcının davranışını gerçekten değiştirmek istediğinizden emin olun. Yaygın kararlar şöyledir:

İhtiyaçOlayKullanım amacı
Özel form doğrulaması veya AJAX gönderimisubmitSayfanın normal form gönderimini durdurup kendi işlemini yapmak
Bağlantıyı yalnızca belirli koşullarda çalıştırmakclickHedef sayfaya gitmeyi koşula bağlamak
Özel sürükle-bırak davranışıFare veya sürükleme olaylarıTarayıcının varsayılan sürükleme işlemini engellemek
Özel klavye kısayolukeydownBir tuşun tarayıcıdaki varsayılan etkisini değiştirmek

Aşağıdaki ayrı parçada HTML içinde id="details-link" olan bir bağlantı bulunduğu varsayılır; yoksa seçici null döner ve dinleyici bağlanamaz. Sahte oturum koşulu yalnız olay davranışını gösterir; gerçek yetki denetimi sunucuda yapılmalıdır:

Kod:
document.querySelector('#details-link').addEventListener('click', function (event) {
  const isLoggedIn = false;

  if (!isLoggedIn) {
    event.preventDefault();
    console.log('Önce oturum açılmalı.');
  }
});

Buradaki önemli nokta, preventDefault() çağrısının koşulun dışına konulmamasıdır. Aksi durumda oturum açmış kullanıcı da bağlantının hedef sayfasına gidemez.

Sık yapılan hatalar​


  1. Yanlış olayı dinlemek: Form gönderimindeki varsayılan davranışı engellemek için genellikle düğmenin click olayını değil, formun submit olayını dinlemek daha doğrudur. Böylece kullanıcı gönderimi klavyeyle yaptığında da aynı mantık çalışır.
  2. Her durumda iptal etmek: Kullanıcının beklediği gezinme, gönderim veya klavye davranışını gereksiz yere engellemek kullanılabilirliği bozar. İptali yalnızca gerçek koşul oluştuğunda yapın.
  3. Yayılmayı durdurduğunu sanmak: preventDefault() üst öğelerdeki dinleyicilerin çalışmasını engellemez. Bunun amacı varsayılan tarayıcı davranışıdır; olay akışını yönetmek farklı bir konudur.
  4. İptal edilemeyen olayda sonuç beklemek: Bazı olaylar iptal edilebilir değildir. Böyle bir durumda event.cancelable değeri false olabilir ve çağrı varsayılan davranışı değiştirmez.
  5. Asenkron işlemden sonra çağırmak: Varsayılan davranışın zamanında iptal edilmesi gerektiğinden await sonrasında yapılan çağrı güvenilir değildir. Gerekirse yöntemi dinleyicinin başında çağırıp işlemin sonucunu daha sonra yönetin.

Sonraki adım, iptal edilen davranışın yerine ne konacağını açıkça belirlemektir. Formu AJAX ile gönderecekseniz doğrulama, istek gönderme, hata gösterme ve başarı durumunu ayrıca uygulayın; yalnızca preventDefault() çağırıp başka işlem yapmamak formu çalışmıyor gibi gösterir.

Sık sorulan sorular​


Cancelable true iken kaydırma neden iptal edilmeyebilir?​


Dinleyici passive olarak kaydedildiyse preventDefault etkili olmaz ve konsolda uyarı görülebilir. Kaydırmayı gerçekten iptal etmeniz gereken olayda dinleyici seçeneğini bilinçli belirleyin; gereksiz kaydırma engellemesi kullanılabilirliği bozabilir.

preventDefault() ile return false aynı şey midir?​


Hayır. return false kullanılan bağlama göre farklı davranabilir ve modern addEventListener dinleyicilerinde varsayılan davranışı kendiliğinden iptal etmez. Açık ve anlaşılır çözüm, gerektiğinde doğrudan event.preventDefault() çağırmaktır.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic