Kısım II · İnşaat · Bölüm 23
HTML ve DOM: Belgenin iskeleti
Belgenin anlamından bellekteki ağaca (HTML and the DOM)
Neden burada: Bölüm 22 web, mobil ve masaüstünü ayırdı. Bugünkü prototipin tarayıcıda yaşadığını biliyoruz; şimdi tarayıcıya verilen belgenin nasıl bir sözleşme kurduğunu açacağız. “İskelet” kelimesi yalnızca görünüm öncesi bir taslak değil: başlık, girdi ve eylemin ne olduğunu bildiren yapı.
Neye dayanıyor: Bölüm 20: tarayıcının dosyaları alıp işleyen bir program olması; Bölüm 16: stil ve betik bağlantılarının göreli yolları; Bölüm 2: byte’ların karakter kodlamasıyla harfe dönüşmesi.
- Kat 10Bizim uygulamamızSorular, puan, günlük seri ve can kuralları.
- Kat 9Web ve tarayıcıHTML belgeyi, CSS sunumu, JavaScript davranışı kurar; bu bölümün çalışma alanı.
- Kat 7–8İşletim sistemi ve ağDosyaları, süreçleri ve veri alışverişini sağlar; belge bunların üstünde çalışır.
- Kat 0–6Bitten işlemciye, belleğe ve dillereÖnceki bölümlerde kurduğumuz temel. Tam kat planı.
Bölümün sonunda bir soru kartının kaynak HTML’ini, canlı DOM’unu ve görüntüsünü ayırabileceksin. Etiketleri zaten kullanıyor olman iyi bir başlangıç; burada her etiketin hangi işi tarayıcıya devrettiğini okuyacağız.
23.1 İşaretleme dili: etiket, öğe, nitelik
Bir soru kartında aynı anda farklı türden şeyler görürsün: bölümün adı, soru metni, seçenekler ve bir gönderme düğmesi. Hepsi ekranda yazı olsa da aynı işi yapmaz. Tarayıcıya yalnızca kelimeleri verirsen, hangisinin başlık, hangisinin kullanıcıdan cevap alan denetim olduğunu söylemiş olmazsın. İşaretleme dili (markup language) bu ayrımı metnin içine yerleştirir. HTML, HyperText Markup Language adının kısaltmasıdır: içeriğin yapısını öğelerle tarif eder. Bölüm 21.5'teki bildirimsel yaklaşımın somut karşılığı budur; işlemciye çizim komutlarını sıralamazsın, tarayıcıya belgenin ne olduğunu söylersin.1
<h1>Hukuka Giriş</h1>
<p class="soru-metni">Bu alıştırmanın konusu nedir?</p>
İlk satır, içindeki yazıyı birinci düzey başlık olarak işaretler. İkinci satır bir paragraf kurar. <p> bir etiket (tag), yani işaretleme sınırını gösteren yazımdır. Açılış etiketi, içerik ve </p> kapanış etiketinin oluşturduğu bütüne öğe (element) denir. Etiket ile öğe aynı şey değildir: etiket dosyadaki işaret, öğe onun tarif ettiği yapısal parçadır. Bu ayrım birazdan DOM'u okurken işe yarayacak.1
class="soru-metni", öğeye ek bilgi veren bir niteliktir (attribute). Nitelik adı class, değeri soru-metni; eşittir işareti burada bir JavaScript ataması değil, HTML niteliğinin yazımının parçasıdır. Sınıf adı, birden çok öğeye ortak bir etiket takmamızı sağlar. Buna karşılık id="soru-basligi", belge içinde tek bir öğeyi tanımlamak için kullanacağımız kimliktir. Bölüm 24'te bunlarla görünüm seçilecek; Bölüm 26'da JavaScript aynı öğeleri bulacak. Sınıf adına bakarak tarayıcı bir puan kuralı çıkarmaz: adlandırmayı ve bağlantıyı biz tasarlarız.1
İç içelik, süs değil yapıdır
<p>Kalan can: <strong>3</strong></p>
Bu tek satırda önce paragraf açılır, onun içinde önem vurgusu taşıyan strong açılır; önce içteki, sonra dıştaki kapanır. Sonradan açtığını önce kapatman, yapıyı bir ağaç olarak kurabilmenin şartıdır. <p>…<strong>3</p></strong> yazarsan sınırlar çaprazlaşır. Tarayıcı bazı hataları toparlayabilir; fakat bunun sonucu, kafandaki ağaçla aynı olmak zorunda değildir. İyi görünen bir sayfa, kaynak HTML'in doğru kurulduğunu tek başına kanıtlamaz.16
Her öğe bu açılış–içerik–kapanış biçimini kullanmaz. meta ve input gibi içeriksiz öğeler (void elements) çocuk içerik almaz ve kapanış etiketleri yoktur. Bir girdinin adını <input>Adın</input> içine koymayız; ad için birazdan label kullanacağız. Buna karşılık script, dış dosyaya işaret etse bile içeriksiz öğe değildir; kapanış etiketi gerekir.12
Buradaki HTML öğesi (element), bir dizinin elemanı anlamında kullanılmıyor. Benzer biçimde HTML niteliği (attribute) ile birazdan göreceğin JavaScript nesnesinin özelliği (property) aynı kavram değildir. Önce hangi katı okuduğunu belirle; kitabın soyutlama alışkanlığı burada da işe yarar.
23.2 Belge yapısı: doctype, head, body, meta
Bir HTML dosyasını, paragrafların serbestçe yan yana durduğu bir not değil, başı ve gövdesi olan bir belge olarak düşün. Aşağıdaki küçük dosya, ayrı HTML/CSS/JS dosyaları kullanan prototip için bir başlangıç örneğidir. Senin gerçek dosyanı görmedik; dosya adları ve içerik burada öğretim amacıyla seçildi.12
<!doctype html>
<html lang="tr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hukuka Giriş · Alıştırma</title>
<link rel="stylesheet" href="style.css">
<script src="script.js" defer></script>
</head>
<body>
<main>
<h1>Hukuka Giriş</h1>
<p>İlk alıştırmana hoş geldin.</p>
</main>
</body>
</html>
| Satır veya parça | Ne söylüyor, neden var? |
|---|---|
<!doctype html> | Belgenin başındaki bildirimdir; tarayıcının standartlara uygun belge kipini kullanmasına yardım eder. Bir ekrana çizilecek HTML öğesi değildir. |
<html lang="tr"> | Kök öğeyi açar ve belgenin dilini Türkçe olarak bildirir. Dil, metnin anlamlandırılmasında ve yardımcı teknolojilerin telaffuzunda kullanılabilir; karakter kodlamasıyla aynı şey değildir. |
head | Belge hakkındaki bilgileri ve dış kaynak bağlantılarını toplar; sayfanın ana içerik alanı değildir. |
meta charset | Byte'ların UTF-8 ile okunacağını bildirir. Dosyayı gerçekten UTF-8 kaydetmenin yerine geçmez. |
meta name="viewport" | Mobilde görünüm alanının cihaz genişliğine göre kurulmasını ister. Bir sonraki bölümdeki duyarlı yerleşimin zeminidir; tek başına duyarlı tasarım yapmaz. |
title | Belgenin başlığını verir; tarayıcı sekmesinde kullanılır. Gövdedeki h1 ile aynı görevi taşımaz. |
link | rel="stylesheet" ile bağlanan kaynağın stil sayfası olduğunu, href ile nerede olduğunu söyler. |
script | src ile JavaScript kaynağını gösterir. Bu dış klasik betikte defer, çalıştırmayı HTML ayrıştırması bitene erteler; böylece aşağıdaki öğeler kurulmadan onları aramayız. |
body ve main | Gövde, belge içeriğini taşır; main bu sayfanın temel içeriğini belirtir. İçindeki başlık ve paragraf kullanıcıya sunulacak yapıdır. |
| Kapanış satırları | Önce main, sonra body, sonra html kapanır; iç içeliğin sınırlarını tamamlar. |
Bu tablodaki belge yapısı MDN'in HTML ve üst veri derslerine, mobil görünüm alanı açıklaması web.dev'in duyarlı tasarım girişine dayanır. Dış klasik betikte defer dosyanın ancak en sonda indirileceği anlamına gelmez: belge okunurken yüklenebilir, çalışması ayrıştırma sonrasına bırakılır. defer sözcüğünün yanına ="true" yazmamamızın nedeni onun Boole niteliği olmasıdır; varlığı önemlidir.128
style.css ve script.js yollarını görünce Bölüm 16'ya dön: bunlar göreli yollardır. Bu örnekte HTML ile aynı klasördeki kaynaklara giderler. Dosyalar uzaktaki bir siteden geliyorsa tarayıcı bunları belge URL'sine göre çözer. Aynı klasörde duran iki dosya kendiliğinden birbirine bağlanmaz; bağlantıyı HTML'deki bu satırlar kurar. Dosyaları ayırmanın tasarım gerekçelerini Bölüm 27'ye bırakıyoruz.2
23.3 Anlamsal HTML ve erişilebilirlik
Anlamsal HTML (semantic HTML), öğeyi görünüşüne değil, taşıdığı anlama göre seçmektir. Bir metnin büyük görünmesini istemek başka, onun bölüm başlığı olduğunu söylemek başkadır. h1 başlık, p paragraf, nav gezinme, main ana içerik anlamı taşır. div ise özel bir anlam eklemeyen genel kapsayıcıdır. Gerektiğinde kullanılır; fakat her şeyi div yapmak, metindeki başlık ve paragraf farkını yalnızca görsel ipuçlarına bırakır.3
Erişilebilirlik (accessibility, a11y), farklı yeteneklere ve kullanım biçimlerine sahip insanların içeriğe ve işlevlere erişebilmesini gözetmektir. Ekran okuyucu kullanan biri, başlıklar arasında dolaşarak belgenin haritasını çıkarabilir. Yalnızca klavyeyle çalışan biri, düğmelere ulaşıp onları etkinleştirebilmelidir. Bu yüzden anlamsal seçim, görünümden bağımsız bir kullanım sözleşmesidir. CSS kaldırıldığında da başlığın başlık, düğmenin düğme kalması değerlidir.3
<button type="button">Sonraki soru</button>
Bu tek satırın her parçası iş yapar: button bir eylem denetimi kurar; type="button" onun bu örnekte form gönderme düğmesi olmadığını belirtir; içindeki yazı kullanıcıya eylemi adlandırır; kapanış etiketi öğeyi bitirir. Düğme, klavyeyle odaklanma ve etkinleştirilme gibi yerleşik davranışlar taşır. Aynı görünümü bir div'e verip fare tıklaması eklemek, bu davranışların hepsini kendiliğinden kazandırmaz. Hazır bir merdiven yerine boyalı bir merdiven resmi koymak gibi: benziyor, ama çıkılmıyor.34
| İstenen anlam | Örnekte seçilecek öğe | Neyi görünümden ayırıyor? |
|---|---|---|
| Başka belgeye gitmek | a href="…" | Gezinme, bir eylem düğmesinin taklidi olmak zorunda kalmaz. |
| Mevcut soruyu değerlendirmek | button | Eylem, yalnızca renkli bir metin olmaktan çıkar. |
| Şıkları birlikte sunmak | fieldset ve legend | Denetimlerin bir soru grubuna ait olduğu ifade edilir. |
| Girdinin ne istediğini açıklamak | label | Girdi, yanında duran ama bağlantısı bilinmeyen bir yazıya muhtaç kalmaz. |
Bu seçimler erişilebilirliğin tamamını çözmez. Başlık sırası, açıklayıcı bağlantı metni, odak görünürlüğü, okunaklı renkler ve hata mesajları da önemlidir. Buradaki ilk ilke, tarayıcının ve yardımcı teknolojilerin zaten anladığı yapıyı kullanmak. Soru doğruysa yalnızca yeşile boyamak yerine yazıyla da “Doğru cevap” demeyi örneğimizin tasarım şartı yapacağız; görünüm ayrıntıları Bölüm 24'te, etkileşim Bölüm 26'da gelecek.3
23.4 Formlar ve girdiler
Bir soru kartının cevabı, yalnızca ekrana konan yazı değildir; kullanıcıdan yapılandırılmış girdi alınır. Form (form), bu girdileri bir arada düzenler ve gönderme davranışı sağlar. Girdi (input) öğesinin type niteliği, istenen denetim biçimini belirler: metin, e-posta, tek seçim gibi. Çoktan seçmeli soruda aynı gruptan yalnızca bir cevap istiyorsak tek seçim düğmeleri, yani radio girdileri uygun bir başlangıçtır.45
<form id="cevap-formu">
<fieldset>
<legend>Bu örnekte “kural” etiketini hangi şıkla eşleştiriyoruz?</legend>
<input type="radio" id="sik-a" name="cevap" value="0" required>
<label for="sik-a">Genel ifade</label>
<input type="radio" id="sik-b" name="cevap" value="1">
<label for="sik-b">Tekil olay</label>
</fieldset>
<button type="submit">Cevabı kontrol et</button>
</form>
Bu, hukuk bilgisi ölçen gerçek bir soru değil, bir yazılım örneğinin yapay verisidir; bu örnekte ilk şıkkı doğru kabul edeceğiz. İlk satır formu açar ve JavaScript'in daha sonra bulacağı kimliği koyar. fieldset denetimleri bir gruba toplar; legend grubun açıklamasıdır. İlk input tek seçim denetimi açar; id bu denetimin kimliğidir. Hemen sonraki label'ın for değeri bu kimlikle aynı olduğu için yazı o denetime bağlanır. Etikete tıklamak da ilgili seçeneği seçebilir; ekran okuyucu da denetimin adını bu bağdan alır.45
İki girdide de name="cevap" yazması, bunların aynı tek seçim grubuna ait olduğunu söyler. Farklı id değerleri ise etiketlerin hangi girdiye ait olduğunu ayırır. value="0" ve value="1" kullanıcıya gösterilen açıklamalar değil, programın alacağı değerlerdir. Seçili girdinin adı ve değeri, form verisindeki çifti oluşturur. Seçim yoksa o grubun değeri gönderilecek veride bulunmaz. Birbirinin yerine id, name ve value yazmak bu yüzden çözüm değildir.5
required bu grupta bir seçim yapılmasını ister; bütün şıkların aynı anda seçilmesini istemez. Burada da Boole niteliğinin varlığı önemlidir: required="false" yazmak gerekliliği kaldırmaz. button type="submit" formun gönderme girişimini başlatır. Grup ve form kapanışları, denetimlerin hangi formun içinde kaldığını tamamlar. Tarayıcı seçimi ve bu tür yerleşik doğrulamayı JavaScript yazmadan da yönetebilir; fakat hangi cevabın doğru olduğunu, kaç puan verileceğini HTML'den kendiliğinden öğrenmez.15
Göndermek ile değerlendirmek ayrı işlerdir
Formun action niteliği gönderme adresini, method ise HTTP yöntemini belirleyebilir. Bu örnekte ayrı bir sunucu adresi vermiyoruz; yerel etkileşim için Bölüm 26.2'de gönderme olayını karşılayıp varsayılan gönderme davranışını durduracağız. Şimdilik örnekteki düğmeye basmanın puanı hesaplamasını bekleme. Henüz tarif ettiğimiz şey, cevabın nasıl alınacağı; doğru–yanlış kuralı değil.4
Bir alanın required olması, dürüst kullanıcıya eksik girdi konusunda yardım eder. Bölüm 22.4'te kurduğumuz istemci–sunucu ayrımı değişmez: kullanıcının cihazındaki kurallar ortak puanın güvenilir otoritesi değildir. Burada yerel prototip davranışını öğreniyoruz; gerçek puanın son sözü Bölüm 34'teki arka uçta olacak.
23.5 DOM: HTML'in bellekteki ağaç hali
Şimdi dosyadan çalışan tarayıcıya geçelim. HTML, diskte ya da HTTP yanıtında duran kaynak metindir. Tarayıcı onu ayrıştırınca bellekte bir belge modeli kurar. Belge Nesne Modeli (DOM, Document Object Model), belgenin programlar tarafından okunup değiştirilebilen temsilidir. Bir düğüm (node), bu modelin bir parçasıdır; öğe düğümü, metin düğümü, yorum düğümü gibi farklı düğümler vardır. Her düğüm bir HTML etiketi değildir.67
<p id="puan">Puan: <strong>10</strong></p>
p öğesi (id="puan")
├── metin düğümü: "Puan: "
└── strong öğesi
└── metin düğümü: "10"
İlk satır dosyadaki HTML'dir; altındaki çizim, yalnızca o parçanın sadeleştirilmiş DOM ağacıdır. p, iki çocuk düğümün ebeveynidir: bir metin düğümü ve strong öğesi. strong'un kendi metin çocuğu vardır. id bu çizimde ayrı bir çocuk kutu değil, öğenin niteliğidir. Bölüm 11'deki ağaç fikri artık tarayıcının çalışma verisi oldu: belge bütünü, parçalar ve bunların ilişkileri.67
Ağaç temsilinin yararı şudur: program, HTML dosyasını baştan sona bir karakter yığını olarak yeniden aramak yerine “şu kimliğe sahip öğeyi bul, onun metnini değiştir” diyebilir. DOM, JavaScript dilinin kendisi değildir; tarayıcının sunduğu bir API'dir, yani programların kullanacağı işlemler ve nesneler sözleşmesidir. JavaScript'te toplama yapmak için belgeye gerek yoktur. Bir sayfanın başlığını değiştirmek için ise o belgeyi temsil eden bu katmana uzanırsın.6
Kaynak, canlı model ve görüntü: üç farklı şey
| Neye bakıyorsun? | Ne gösterir? | Neyi tek başına söylemez? |
|---|---|---|
| HTML kaynak dosyası | Başlangıçta yazılmış veya sunucudan alınmış işaretleme | JavaScript'in sonradan ne eklediğini |
| Geliştirici araçlarında Elements / Inspector | O anda kurulmuş canlı DOM yapısı | Diskteki dosyanın bu haliyle kaydedildiğini |
| Ekrandaki pikseller | Belge ve stilin işlenmiş görsel sonucu | Hangi anlamsal öğelerin kullanıldığını |
Tarayıcı eksik ya da hatalı işaretlemeyi belirli kurallarla toparladığı için DOM kaynakla birebir aynı görünmeyebilir. Örneğin kaynakta belirtilmeyen bir tbody, tablo ayrıştırılırken modele eklenebilir. Satır sonları ve bazı boşluklar da metin düğümleri oluşturur; bu bölümün çizimlerinde ilgisiz boşluk düğümlerini göstermiyoruz. Bu sebeple “kaynakta bu satır yok ama denetleyicide var” gözlemi tek başına gizem değildir: önce ayrıştırmanın, sonra çalışan JavaScript'in etkisini ayır.7
Modeli değiştirmek, kaynak dosyasını diskte düzenlemek değildir. Bir prototipte puan metninin 10'dan 20'ye çıkması, index.html dosyanın kaydedildiğini göstermez. Sayfayı yeniden açtığında başlangıç kaynağı yeniden okunur; değişikliği ayrıca saklamak gerekecek. Kalıcılıkla canlı bellek arasındaki eski ayrım, burada da karşımıza çıkar. Saklamayı Bölüm 26.4'te işleyeceğiz.6
23.6 Kerem'in prototipinin HTML'ini birlikte okumak
Senin prototipinin dosyası elimizde olmadığı için “sen burada bunu yazmışsın” diyemeyiz. Bunun yerine aşağıdaki temsilî soru kartını birlikte okuyalım. Sonra aynı okuma sırasını kendi index.html dosyana taşıyabilirsin. Kartın anlamı, girdisi ve görünüm için bıraktığı adlar bilinçli olarak ayrılıyor; bu örnek, önceki alt bölümlerdeki öğe ve form davranışlarını kullanıyor.135
<main class="calisma">
<h1>Hukuka Giriş</h1>
<p class="istatistikler">
Puan: <span id="puan">0</span>
· Günlük seri: <span id="seri">7</span>
· Can: <span id="can">3</span>
</p>
<section class="soru-karti" aria-labelledby="soru-basligi">
<h2 id="soru-basligi">Soru 1</h2>
<form id="cevap-formu">
<fieldset>
<legend id="soru-metni">Bu örnekte “kural” etiketi hangi şıkla eşleşiyor?</legend>
<div class="siklar">
<label class="sik">
<input type="radio" name="cevap" value="0" required>
Genel ifade
</label>
<label class="sik">
<input type="radio" name="cevap" value="1">
Tekil olay
</label>
</div>
</fieldset>
<button type="submit">Cevabı kontrol et</button>
</form>
<p id="sonuc" role="status"></p>
</section>
</main>
- Ana içeriği bul: ilk satır
mainaçar ve görünüm grubunacalismaadını verir; ikinci satır sayfanın başlığıdır.h1'i büyük çizdirmek CSS'in işi, başlık olduğunu söylemek HTML'in işidir. - Verinin konacağı yerleri ayır:
p, istatistik cümlesini açar. Sonraki üç satırdakispan'ler, puan, günlük seri ve can için ayrı kimliklerdir. Örneğin 7, burada verilmiş bir başlangıç değeridir; her doğru cevapta artan bir sayaç değil, günlük seri göstergesidir. Gerçek seri kuralını bu örnek hesaplamaz. - Kart sınırını oku:
sectionilişkili içeriği toplar.aria-labelledbyiçindeki kimlik, bu alanın adının bir sonrakih2'den alınmasını ister. Bu, yerleşik öğe anlamını tamamlayan erişilebilir adlandırmadır; rastgele CSS sınıfı değildir. - Girdi grubunu izle:
formcevabın sınırını,fieldsetvelegendseçeneklerin ortak sorusunu kurar.div class="siklar"yalnızca CSS'in iki şıkkı birlikte düzenleyebilmesi için genel bir kaptır; soru anlamınılegendtaşır. - Etiketleme biçimini tanı: burada her
inputkendilabel'ının içindedir. Bu da girdiyi etiketiyle bağlamanın bir yoludur; önceki örnekteki ayrıfor/idçiftine bu biçimde ihtiyaç yoktur. İkilabelkapanışı iki şıkkı ayırır. - Eylem ve çıktı yerini bul: gönderme düğmesi formun içindedir; ardından form kapanır.
sonucparagrafı, sonradan yazılacak geri bildirimin yeridir.role="status", bu alanı durum bildirimi olarak tanımlar; JavaScript'in metni değiştirebilmesi için ayrıcaidverilmiştir. Son kapanışlar kartı ve ana içeriği tamamlar.
Bu okuma, MDN'in anlamsal yapı ve form etiketleme açıklamalarının kendi örneğimize uygulanmasıdır. Durum bildirimini otomatik duyurma davranışı için kullanılan status rolü MDN'in ilgili rol belgesinde tanımlanır. Yardımcı teknolojilerde gerçek kullanım denemesi yine gereklidir; yalnızca bir nitelik ekledik diye bütün erişilebilirliği doğrulamış sayılmayız.349
Kendi dosyanı açtığında önce şu soruları sor: soru hangi başlık altında, şıklar hangi grupta, her girdinin okunabilir adı var mı, puanın yazılacağı yer neresi, stil ve betik dosyaları hangi satırdan bağlanıyor? Bunları cevaplayabiliyorsan HTML'i yalnızca etiket listesi olarak değil, katlar arasında bir sözleşme olarak okuyorsun. Kartı bugün vanilla JavaScript canlandıracak; hedefteki Expo ve TypeScript tarafında aynı işlerin başka bileşenlerle kurulacağını Bölüm 22.5'ten biliyorsun. HTML'in telefondaki yerel öğelerin kendisi olduğunu varsayma.
Bölüm 2.5'te byte'ların nasıl harf olduğunu öğrendin; charset bunun belgeye bağlandığı yerdir. Bölüm 16'daki göreli yol, stil ve betik kaynaklarını buldurur. Bölüm 20'deki tarayıcı, o metni bellekte bir DOM'a dönüştüren programdır. Hiçbir etiket işlemciye doğrudan görünmez; arada zaten çıktığımız katlar durur.
Bu bölümde neler kuruldu
HTML anlamlı öğeler ve niteliklerle belgeyi tarif eder; head belge hakkındaki bilgileri, body içeriği taşır. Anlamsal seçimler ve doğru form etiketleri, kullanıcı girdisinin yapısını ve erişilebilirliğin zeminini kurar. Tarayıcı bu kaynağı bellekte düğümlerden oluşan DOM’a çevirir; kaynak metin, canlı model ve ekran görüntüsü aynı şey değildir.
Terimler sözlükte, Bölüm 23 başlığı altında. İkinci anlatım için CS50’nin yazılı Hafta 8 notlarındaki ilgili HTML/CSS/JavaScript bölümleri de bu iş bölümünü örnekler.10
MDN · Basic HTML syntax: Anatomy of an HTML element ve Anatomy of an HTML document. Derinleşme: MDN · Introduction to the DOM — What is the DOM?; MDN · Your first form — The form, label, input and button elements.
Takıldığın yeri yapay zekâ öğretmenine sor. Öğretmeninden, kendi kartındaki id, name ve value niteliklerini birbirine karıştıran üç küçük örnek hazırlamasını iste; her birinde hangi bağın kırıldığını sen bul.
Bölüm sonu soruları
Önce kitaba bakmadan cevapla; sonra gerekçeyi ve ilgili alt bölümü oku.
Örnek cevabı göster
HTML başlangıç kaynak metnidir; DOM tarayıcının kurduğu canlı modeldir; görüntü bu yapının stillerle işlenmiş sonucudur. DOM'daki puan değişikliği ayrıca saklanmadıysa kaynak dosyaya yazılmaz ve yenilemede başlangıçtan kurulabilir. Bkz. 23.5.
Örnek cevabı göster
Soru grubu fieldset ve legend ile; şıklar ortak name taşıyan radio girdileriyle; adları label ile; gönderme eylemi button type=submit ile ifade edilebilir. Gerçek dosya görülmeden bu öğelerin mevcut olduğunu, doğru bağlandığını veya erişilebilirliğin doğrulandığını söyleyemeyiz. Bkz. 23.6.
Kaynaklar
- MDN · Basic HTML syntax.
- MDN · Webpage metadata.
- MDN · HTML: A good basis for accessibility.
- MDN · Your first form.
- MDN · input type="radio".
- MDN · Introduction to the DOM.
- javascript.info · DOM tree.
- web.dev · Introduction to responsive design.
- MDN · ARIA: status role.
- CS50 · Lecture 8 notes, HTML ve JavaScript başlıkları.