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’te defer, harici bir <script> dosyasının HTML ayrıştırılırken indirilmesini, ancak HTML belgesi tamamen ayrıştırıldıktan sonra çalıştırılmasını sağlayan boolean bir HTML niteliğidir. Böylece JavaScript dosyası HTML ayrıştırmasını gereksiz yere durdurmaz; ayrıca defer kullanılan klasik script’ler, HTML içindeki sıralarını koruyarak çalışır.

En yaygın kullanım şekli şöyledir:

Kod:
<script defer src="/js/app.js"></script>

Bu etiketi <head> içinde kullanabilirsiniz. Tarayıcı app.js dosyasını HTML ayrıştırması devam ederken indirebilir; dosyayı çalıştırmayı ise HTML ayrıştırması bittikten sonraya bırakır. Script çalıştıktan sonra DOMContentLoaded olayı tetiklenir. Bu nedenle defer, DOM içindeki buton, form veya diğer elementlere erişmesi gereken harici dosyalar için uygundur.

Somut örnek​


Kod:
<!doctype html>
<html lang="tr">
<head>
  <meta charset="utf-8">
  <title>Defer örneği</title>
  <script defer src="/js/app.js"></script>
</head>
<body>
  <button id="selamla">Tıkla</button>
</body>
</html>

Kod:
// /js/app.js
const buton = document.querySelector("#selamla");

buton.addEventListener("click", () => {
  console.log("Buton çalıştı");
});

console.log("HTML ayrıştırıldı ve script çalıştı");

Uygulama adımları:
  1. Harici JavaScript dosyanızı oluşturun ve dosyanın gerçekten /js/app.js adresinden sunulduğunu kontrol edin.
  2. HTML içine <script defer src="/js/app.js"></script> ekleyin. Harici dosyanın src niteliği olmalıdır; yalnızca satır içi script’e defer eklemek beklenen etkiyi oluşturmaz.
  3. Sayfayı açıp tarayıcı geliştirici konsolunda HTML ayrıştırıldı ve script çalıştı mesajını kontrol edin.
  4. Butona tıklayın. Konsolda Buton çalıştı görünüyorsa script DOM elementini doğru zamanda bulmuştur.
Beklenen çıktı oluşmuyorsa önce geliştirici araçlarında app.js isteğinin 404 vermediğini ve JavaScript konsolunda sözdizimi hatası bulunmadığını kontrol edin. buton değeri null ise genellikle seçici yanlıştır veya beklenen element HTML içinde hiç yoktur.

defer, async ve type="module" farkı​


Karar verirken temel fark çalıştırma zamanı ve script’lerin birbirine bağımlı olup olmadığıdır.
YöntemHTML ayrıştırmasıÇalıştırma sırasıUygun kullanım
Normal harici scriptİndirme ve çalıştırma sırasında durabilirKarşılaşıldığı andaÇalışması mutlaka hemen gereken kod
deferScript indirilirken devam ederHTML ayrıştırmasından sonra, belge sırasıylaDOM’a ve başka script’lere bağlı kod
asyncİndirme sırasında devam ederİndirme biter bitmez; sıra garanti edilmezBağımsız analiz veya reklam script’leri
type="module"Varsayılan olarak ertelenmiş davranırModül kurallarına göreModern import/export kullanan kod
Birden fazla harici dosya arasında bağımlılık varsa defer kullanıp etiketleri bağımlılık sırasına göre yazın:

Kod:
<script defer src="/js/vendor.js"></script>
<script defer src="/js/app.js"></script>

Bu örnekte klasik, HTML tarafından eklenen script’lerde app.js, vendor.js dosyasından sonra çalışır. Aynı etikette async de varsa async davranışı geçerli olur; dinamik eklenen script’lerin zamanlamasını bu örnekle aynı varsaymayın. Dosyalar birbirinden bağımsızsa async daha uygun olabilir; ancak async dosyaların hangi sırada çalışacağını garanti etmez.

Sık yapılan hatalar​

  • defer niteliğini satır içi script’te kullanmak: <script defer>...</script> için bu özellik beklenen şekilde çalışmaz; harici src dosyası kullanın.
  • async ile defer değerlerini eş anlamlı sanmak: async bağımlı dosyaların sırasını bozabilir.
  • Script’in çalışmasını sayfanın tamamen yüklenmesine bağlamak: defer için resimlerin ve diğer tüm kaynakların bitmesini beklemek gerekmez; esas olarak HTML ayrıştırmasının tamamlanması beklenir.
  • Klasik script’e defer ekleyip type="module" ile fark olmadığını düşünmek: modül script’leri zaten varsayılan olarak ertelenmiş çalışır; defer modül script’lerinin davranışını değiştirmez.

Sık sorulan sorular​


defer="false" yazarak bu davranışı kapatabilir miyim?​


Hayır. Boolean niteliklerde niteliğin bulunması etkin olduğu anlamına gelir; false sözcüğüyle kapatılmaz. Erteleme niteliğini kaldırmak istiyorsanız etiketten defer kısmını tamamen çıkarın. Sonrasında script’in HTML ayrıştırmasını durdurma ve DOM’a erişim zamanını yeniden değerlendirin.

defer ile script’i body sonuna koymak aynı şey midir?​


Sonuçları benzer olabilir; ancak head içindeki defer script’i daha erken keşfedilip indirilebilirken HTML ayrıştırması tamamlanana kadar çalıştırılmaz. Bu nedenle harici ve DOM’a bağlı script’lerde genellikle daha düzenli bir yerleşim sağlar.
 

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