Web tasarımı

Yeni başlayanlar için JavaScript

JavaScript sayfaya davranış katar: ziyaretçinin yaptığına tepki vermek, sayfayı yenilemeden içeriği değiştirmek ve sunucudan veri almak. Sayfanın iskeleti HTML'in, görünümü CSS'in işidir; JavaScript yalnızca sayfanın bir şey yapması gerektiğinde gerekir.

  • Ders 4 / 12
  • Başlangıç
  • Ücretsiz, kayıt yok

Bir sayfayı birlikte döndüren üç dil

Her birinin tek bir işi var ve hiçbiri diğerinin işini yapmaz.

  • HTML, yapı

    Her parçanın ne olduğunu söyler: başlık, paragraf, düğme, form. Tarayıcı, ekran okuyucu ve tarayıcı botu bunu okur.

  • CSS, görünüm

    Renk, boşluk, boyut ve yerleşim. Durumları da o çizer: hover, focus, açık ve kapalı.

  • JavaScript, davranış

    Sayfa açıldıktan sonra olanlar: kullanıcıya tepki, içeriği değiştirme, sunucuyla konuşma.

çalışan bir sayfa

Ağırlıkları eşit değil. JavaScript olmadan sayfa yine çalışır, CSS olmadan yine okunur; ama HTML olmadan sayfa diye bir şey yoktur.

Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.

JavaScript tam olarak ne işe yarar?

Sayfa açıldıktan sonra olan her şey için. JavaScript, her tarayıcının yerel olarak çalıştırdığı tek dildir ve işi, HTML'in kurduğu ve CSS'in boyadığı sayfayı canlandırmaktır.

Sayfanın üstündeki şekil üç dişlidir ve bu iş bölümünü gösterir. HTML bunun bir başlık, şunun bir düğme olduğunu söyler; CSS düğmenin rengini söyler; JavaScript de birisi ona bastığında ne olacağını söyler.

Yalnızca JavaScript'in yapabildiği dört iş var: sayfa yüklendikten sonra ziyaretçinin yaptığına tepki vermek, şu anda ekranda olan bir şeyi değiştirmek, sayfayı yeniden yüklemeden sunucuyla konuşmak ve bir şeyi bir dahaki sefere kadar tarayıcının kendisinde tutmak. JavaScript gerektirdiğini düşündüğünüz başka her şeyi bir kez daha kontrol etmeye değer; bu dersin altıncı bölümü somut bir listeyle oraya dönüyor.

Bir de onun işi olmayan ve yeni başlayanların sık karıştırdığı bir iş var: tarayıcıda çalışan JavaScript bir sunucu programı değildir. Bir siparişi kaydetmek, e-posta göndermek ve parola denetlemek sunucuda olur. Tarayıcı kodu yalnızca isteği gönderir.

Kodu nereye yazarız ve sayfaya nasıl bağlarız?

Ayrı bir .js dosyasında; sayfaya head içindeki tek satırla bağlanır:

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

Bu bölümde öğreneceğiniz en önemli şey o defer kelimesidir. Anlamı şu: dosyayı HTML okunurken indir, ama çalıştırmayı sayfa tümüyle kurulana kadar beklet. O olmadan head içindeki bir betik öğeler var olmadan çalışır ve bir düğmeyi bulma girişimi null döner. Yeni başlayanların en yaygın "neden çalışmıyor" sorusu budur ve yanıtı tek kelimedir.

İkinci aracınız tarayıcı konsoludur. F12 ile açın ve açık tutun: her JavaScript hatası satır numarasıyla oraya yazılır ve console.log istediğiniz her şeyi size gösterir. Konsolu açmadıkça karanlıkta kod yazıyorsunuz.

const title = document.querySelector("h1");
console.log(title.textContent);

Değişkenler için: değerin değişmesi gerektiğini bilmiyorsanız const, biliyorsanız let yazın. var kelimesi JavaScript'in önceki bir döneminden kalmadır ve yeni kodda yazmak için bir sebep yoktur.

DOM nedir ve neden her şey oradan başlar?

Tarayıcı HTML'inizi okurken ondan bellekte bir nesne ağacı kurar. Bu ağaca DOM denir ve JavaScript dosyanız üzerinde değil onun üzerinde çalışır. Bu yüzden kodla bir şeyi değiştirdiğinizde sayfa anında güncellenirken diskteki dosya olduğu gibi kalır; bir yenileme her şeyi geri getirir.

Bir öğeyi bulmak tek bir fonksiyon ister ve biri yeter. document.querySelector CSS ile aynı seçicileri alır:

const btn  = document.querySelector(".btn");
const rows = document.querySelectorAll(".row");

Bulduktan sonra üç günlük işiniz var. Metni textContent ile değiştirir, sınıfları classList ile ekleyip kaldırır, öznitelikleri setAttribute ile ayarlarsınız.

btn.textContent = "Kaydedildi";
btn.classList.add("is-done");

Bunların arasında ilk günden doğru öğrenmeye değer bir karar var. textContent verdiğiniz şeyi düz metin sayar; innerHTML ise onu işaretleme sayar ve işletir. Eklediğiniz metin bir kullanıcıdan geldiyse, o kullanıcıya sayfanıza etiket yazma imkânı vermişsiniz demektir. Kural basit: gerçekten HTML kurmuyorsanız textContent kullanın.

Bir de işi temiz tutan bir alışkanlık: renkleri ve boyutları JavaScript'ten değiştirmek yerine bir sınıf ekleyin ve görünümü CSS çizsin. JavaScript durumu değiştirir, CSS o durumu gösterir.

Olaylar: ziyaretçi bir şey yaptığında

Ziyaretçinin yaptığı her şey bir olay üretir: tıklama, yazma, form gönderme, kaydırma. Hangi öğede hangi olayı istediğinizi ve hangi fonksiyonun çalışacağını tarayıcıya siz söylersiniz:

btn.addEventListener("click", function () {
  console.log("someone pressed it");
});

İşte gerçekten çalışan ve HTML ile CSS'te mümkün olmayan tam bir örnek: bir metin alanının altındaki karakter sayacı.

<label for="msg">Mesajınız</label>
<textarea id="msg" maxlength="200"></textarea>
<p id="left">200</p>
const box  = document.querySelector("#msg");
const left = document.querySelector("#left");

box.addEventListener("input", function () {
  left.textContent = 200 - box.value.length;
});

Beş satır ve bu beş satıra sığmış birkaç nokta. keyup yerine input olayını seçtik, çünkü keyup yalnızca klavyeyi dinler ve fareyle ya da telefondan yapıştırılan metni kaçırır. value alanın o anki içeriği, length ise uzunluğudur. Sınırlamayı etiketin üzerindeki maxlength yapar; JavaScript yalnızca sayıyı gösterir.

Formlarda bir olay daha gerekir. Gönderimi kendiniz yönetmek istiyorsanız tarayıcının varsayılan davranışını durdurmanız gerekir:

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

Sonraki şekil bu döngüyü adım adım gösteriyor. Orada önemli olan son adımdır: DOM'u siz değiştirirsiniz, sayfayı yeniden çizmek tarayıcının işidir, sizin değil.

Ziyaretçinin tıklamasından ekrandaki değişikliğe

Siz yalnızca üçüncü adımı yazarsınız. Gerisi tarayıcının işidir.

  1. 1

    Ziyaretçi bir şey yapar

    Tıklama, yazma, form gönderme ya da kaydırma.

  2. 2

    Tarayıcı olayı oluşturur

    Tüm ayrıntıyı taşıyan bir nesne: nerede, hangi öğede, hangi tuşla.

  3. 3

    Fonksiyonunuz çalışır

    addEventListener ile kaydettiğiniz fonksiyon.

  4. 4

    DOM değişir

    Bir metin, bir sınıf ya da bir öznitelik. Diskteki dosyaya dokunulmaz.

  5. 5

    Tarayıcı yeniden çizer

    Bu adımı siz yazmazsınız ve yazmanız da gerekmez.

Bir öğeyi silip yeniden kurarsanız dinleyicisi de onunla gitmiştir. Bir düğmenin güncellemeden sonra çalışmayı bırakmasının en yaygın sebebi budur.

fetch: sayfayı yeniden yüklemeden veri almak

Buraya kadar her şey sayfanın içinde oluyordu. fetch, sayfanın dışarıyla konuştuğu yerdir: bir adresi çağırırsınız, sunucu yanıtlar ve yanıtı sayfaya koyarsınız. Sayfa yeniden yüklenmeden.

async function loadPrice() {
  const res  = await fetch("/api/price.json");
  const data = await res.json();
  document.querySelector("#price").textContent = data.toman;
}

await kelimesi, yanıtı bekle ve ancak ondan sonra bir sonraki satırı çalıştır demektir ve yalnızca async işaretli bir fonksiyonun içinde anlam taşır. JavaScript'in gerçekten zorlaştığı ilk yer burasıdır, çünkü işler artık satır satır arka arkaya değildir. İlk gün buraya kadar geldiyseniz yeter; gerisi bekleyebilir.

Vakit kaybetmemek için şimdiden üç şeyi bilin. Birincisi, çağırdığınız adres gerçekten var olmalı ve yanıt vermelidir; konsoldaki Network sekmesi isteğin gidip gitmediğini ve hangi kodun döndüğünü gösterir. İkincisi, adres başka bir alan adına aitse, o sunucu izin vermedikçe tarayıcı yanıtı okumanızı engeller. Üçüncüsü ve en önemlisi: bu kod ziyaretçinin tarayıcısında çalışır ve o kişi kodun tamamını okuyabilir. Bu dosyada hiçbir anahtarın ve parolanın yeri yoktur.

Gerçekte ne kadar JavaScript gerekiyor?

Düşündüğünüzden az ve bu bir tercih değil, bizim konumumuz. Yeni başlayanların JavaScript ile yaptığının büyük bölümünü bugün HTML ile CSS kendisi yapıyor; daha iyi ve daha az kodla:

  • bir bölümü details ve summary ile açıp kapatmak, tek satır kod olmadan
  • alanın kendisindeki required ve type="email" ile temel form doğrulaması
  • loading="lazy" ile görsellerin tembel yüklenmesi
  • dialog öğesiyle bir kalıcı pencere
  • CSS'teki hover, focus-visible ve has ile öğe durumuna tepki
  • scroll-snap ile yatay kaydırıcı; parmakla da doğru davranır

Bu neden önemli: her JavaScript dosyası indirilmeli, ayrıştırılmalı ve çalıştırılmalıdır; çalıştırma da kullanıcının dokunuşuna yanıt veren aynı iş parçacığında olur. Kod çalışırken sayfa kimsenin parmağına yanıt vermez. Ağır bir görsel kaliteyi düşürür; ağır JavaScript sayfayı yavaşlatır. Bunun gerçek site hızına ne yaptığını görmek isterseniz site hızı sayfası ve hız yolunun dersleri bunu ölçümlerle gösteriyor.

Şimdi bu iddianın sınırı; her önerinin bir sınırı vardır. Kurduğunuz şey bir içerik sitesi değil de bir ürünse, bir gösterge paneli, bir düzenleyici ya da canlı bir sohbetse, gerçekten bolca JavaScript gerekir ve bunda yanlış bir şey yoktur. Bizim konuştuğumuz şey kurumsal siteler, sade mağazalar ve bloglar: orada yazmadığınız her kilobayt kazançtır.

Bu sayfadan bir örnek: bu derste gördüğünüz şekiller sıfır satır JavaScript ile çizildi. HTML ve CSS, hepsi bu.

İlk satırdan önce tek bir soru

JavaScript ile yapılanların büyük bölümünün bugün HTML ve CSS içinde bir karşılığı var.

İstediğiniz şey gerçekten JavaScript gerektiriyor mu?

HTML ya da CSS yapabiliyorsa

Yazmayın

  • details ve summary ile açılıp kapanan bölümler
  • Alanın kendi öznitelikleriyle temel form doğrulaması
  • Tek öznitelikle görsellerin tembel yüklenmesi
  • CSS'te scroll-snap ile yatay kaydırıcı
Yüklemeden sonra bir şey olmalıysa

JavaScript yazın

  • Sayaç, canlı filtre, kullanıcı yazdıkça değişen her şey
  • Sayfayı yeniden yüklemeden sunucudan veri almak
  • Bir şeyi bir sonraki ziyarete kadar tarayıcıda tutmak
  • Kullanıcı girdisi üzerinde hesap yapması gereken her şey

Bu kural içerik siteleri içindir. Gösterge paneli ya da düzenleyici gibi etkileşimli bir üründe yanıt neredeyse hep evettir ve bunda sorun yoktur.

Yapay zekayla hızlı yol

Dil modelleri JavaScript öğrenmek için alışılmadık ölçüde iyidir, çünkü yeni başlayanın ihtiyacı kod değil, "neden" sorusunun yanıtıdır; arka arkaya beş kez ve utanmadan. Ama hızlı yol "kod al" değildir; "çalışan en küçük sürümü al, sonra onu sana soru sordur" demektir. Bu ikisi arasındaki fark, koda sahip olmakla onu anlamak arasındaki farktır. Burada hızlı ve ucuz bir model yeter; güncel tercihimiz <a class="text-link" href="/tr/ai/">yapay zeka bölümünde</a>.

  1. Ne olması gerektiğini tek cümleyle yazın. Cümlenizde iki tane "ve" varsa bu iki iştir; ayırın ve birer birer ilerleyin.
  2. Aşağıdaki tarifi çalıştırın ve içine tarifini değil, kendi gerçek işaretlemenizi koyun.
  3. Kodu dosyaya koyun ve tarayıcı konsolunu açık tutun. Çalışmazsa hata satırı orada satır numarasıyla yazar.
  4. Şimdi kopyalamayı öğrenmeden ayıran adım: aynı kodu geri verin ve bir satırını silip neyin bozulduğunu size sormasını isteyin. Yanıtınız doğru olana kadar o kod henüz sizin değildir.

Kopyalamaya hazır şablon

Rol: yeni başlamış biri için JavaScript öğretmeni.

Ne olması gerekiyor:
{tek cümleyle yazın}
Mevcut işaretleme:
{HTML'i buraya yapıştırın}

Kurallar:
- Çalışan en küçük sürümü ver, eksiksiz profesyonel sürümü değil.
- Modern JavaScript: const ve let, addEventListener, fetch. jQuery yok, var yok, etiket içinde onclick özniteliği yok.
- Kütüphane ve çerçeve yok. Kütüphanesiz gerçekten olmuyorsa önce bunu söyle ve nedenini yaz.
- Aynı iş yalnızca HTML ya da CSS ile mümkünse önce o yolu göster ve neden daha iyi olduğunu söyle.
- Kodun ardından her satırı tek cümleyle açıkla.
- Kullandığın her özellik için MDN sayfasının adını yaz ki tarayıcı destek tablosuna kendim bakabileyim.
- Girdimde olmayan hiçbir metni, sayıyı ya da ismi yazma; yerine {...} bırak.

Sonda: kodun bir satırını sil ve o satır olmadan neyin bozulduğunu bana sor. Ben istemeden doğru yanıtı yazma.

Çıktıya güvenmeden önce: Modelin tarayıcısı yok. "Çalışması gereken" bir kod, onun göremediği bir sebeple sizin sayfanızda çalışmayabilir: öğe henüz yoktu, betik erken çalıştı ya da seçici hiçbir şeyle eşleşmedi. Bu tür sorularda önce konsol, sonra sohbet. Bir de daha ciddi bir sınır: ödemeye, kullanıcı girişine ya da kişisel verilere dokunan hiçbir kod, dili anlayan biri okumadan yayına çıkmamalı. JavaScript'iniz ziyaretçinin cihazında çalışır; içine ne koyduysanız onu göndermişsinizdir.

Bu işte yapay zeka

Yapay zekanın yeni başlayana en çok yardım ettiği konu budur ve konumumuz açık: onu bir tedarikçi değil, bir öğretmen olarak kullanın. Gerçekten iyi yaptığı üç şey: bir işin çalışan en küçük sürümünü yazmak, anlamadığınız bir kod bloğunu satır satır açıklamak ve bir hata mesajını okuyup nereden geldiğini söylemek. Devretmediğimiz şey: kodun güvenli olup olmadığına hüküm vermek.

Gerçekten işe yarayan araçlar

  • Claude Satır satır açıklama için ve aynı "bir satır sil ve bana sor" oyunu için iyi. İran, Anthropic'in desteklenen ülkeler listesinde yok; bunu Anthropic'in kendi sayfasında okuduk.
  • Gemini Temel sorular ve bir fonksiyonun ilk sürümü için yeter; Farsçayı da iyi anlar. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
  • Claude Code Kendi düzenleyicinizde ve terminalinizde çalışır, dosyaları görür; bu yüzden birkaç dosyaya büyümüş bir projeye sohbet penceresinden daha uygundur. Yeni başlayanın ilk gün buna ihtiyacı yok. Kurulumu ücretsizdir ama Anthropic aboneliği ister ve İran desteklenen ülkeler listesinde değil.

Nerede geri teper

İki belirgin risk ve hiçbiri "yanlış kod" değil. Birincisi eski kalıplar: model istediğiniz şeyi verir ve modern JavaScript istediğinizi söylemezseniz var ile etiket içindeki onclick özniteliğini hiçbir şey engellemez. Bunu denetlemek elle yapılır ve on saniye sürer: özelliğin adını MDN'de aratıp tarayıcı destek tablosuna bakın. İkincisi ve daha önemlisi: okuyamadığınız kod bir borçtur. Bozulduğu gün, ki ona ihtiyaç duyduğunuz gün bozulur, onu onarmanın bir yolu olmaz. Bir de öğrenmeyle ilgisi olmayan bir sınır: bir sohbet penceresine yapıştırdığınız her şey makinenizden çıkmıştır; anahtarların, jetonların ve müşteri verilerinin orada yeri yoktur. Her aracın İran'dan nasıl ödenebileceği için satın alma rehberine bakın.

Kaynaklar: MDN: The script element MDN: Using the Fetch API Anthropic: supported countries Google: where Gemini Apps are available

Bu tavsiyenin sınırı

Tarayıcıda çalışan JavaScript güvenilmezdir ve bu bir kusur değil, tanımıdır: ziyaretçi kodu okuyabilir, değiştirebilir ve tümüyle kapatabilir. Bu yüzden gerçekten önemli olan her şey, form doğrulamasından fiyata ve erişime kadar, sunucuda yeniden denetlenmelidir; tarayıcıdaki denetim güvenlik için değil kullanıcı rahatlığı içindir. Bir sınır daha var: bu ders zemindir. React ve Vue gibi çerçeveler ayrı bir konudur ve bir içerik sitesi genelde onlara hiç ulaşmaz. Amacınız öğrenmek değil de bir siteyi hızla ayağa kaldırmaksa WordPress'e gidin; orada bu kodu başkası yazmış, sizin işiniz seçmek.

Kendi işimizden

Kendi çalıştığımız gerçek sayılar, tam da bu sitede ve kaynağı görüntüle ile denetlenebilir. rgb.ir temasının tüm istemci tarafı JavaScript'i iki dosyadır, yaklaşık on altı ve beş kilobayt, ikisi de defer ile; okuduğunuz bu sayfa da tam olarak o ikisini ve analitik dosyasını yükler. Bu bölümün şekilleri sıfır bayt JavaScript taşır: şekil motoru sekiz PHP dosyasıdır ve hiçbirinde tek bir script etiketi yoktur, hepsi HTML ve CSS'tir. Şimdi bu iddiayı tamamlayan dürüstlük: bütün bu hesaba rağmen aynı sitenin ana sayfası jQuery 3.7.1 sürümünü de yüklüyor. Onu biz yazmadık ve çağırmadık; sitenin güvenlik eklentisi kendi captcha betiğini jQuery bağımlılığıyla kaydediyor ve o tek satır sayfaya koca bir kütüphane sokuyor. Asıl ders bu: JavaScript bütçeniz yalnızca kendi kodunuz değildir.

Gerçek devam soruları

JavaScript, Java'dan farklı mı?

Tamamen ayrı iki dildir ve adlarının benzerliği tarihseldir. JavaScript tarayıcının dilidir; Java ise çoğunlukla kurumsal yazılımlarda ve Android'de kullanılır. Web sitesi kurmak için buradaysanız ihtiyacınız olan JavaScript'tir.

Önce jQuery mi yoksa saf JavaScript mi öğrenmeliyim?

Saf olanı. jQuery'nin yapıldığı işleri bugün JavaScript'in kendisi querySelector, addEventListener ve fetch ile yapıyor. Yine de eski WordPress projelerinde, hatta bu sitede, onunla karşılaşacaksınız; okumayı öğrenin, yazmanız gerekmez.

Kodum hata vermiyor ama hiçbir şey de yapmıyor. Nereden başlamalıyım?

Önce seçicinizin gerçekten bir şey bulduğunu doğrulayın: o değişkeni console.log ile yazdırın ve null olmadığından emin olun. Sonra betiğin sayfa kurulmadan çalışmadığını kontrol edin; bunu defer çözer. Bu ikisi ilk günün "çalışmıyor" durumlarının çoğunu yanıtlar.