DOM API Terimler Sözlüğü
DOM API Glossary
Bu bölümde ki terimleri ezberlemenize gerek yoktur.
Konular içerisinde ki terimlerdir, sadece
konuyu daha iyi anlamanıza yardımcı olması
için eklenmiştir.
HTML belgesini programatik olarak erişilebilir ve manipüle edilebilir bir nesne hiyerarşisine dönüştüren model. Tarayıcı HTML'i ayrıştırarak DOM ağacını oluşturur.
DOM ağacındaki her bir birim. Element düğümleri, metin düğümleri, attribute düğümleri gibi farklı türleri vardır.
HTML etiketlerini temsil eden düğüm türü. <div>, <p>,
<a> gibi etiketler element düğümleridir.
HTML elementlerinin özelliklerini tanımlayan yapılar. id, class,
href, data-* gibi nitelikler.
CSS seçici kullanarak ilk eşleşen elementi döndüren modern DOM metodu.
document.querySelector('.aktif') gibi kullanılır.
Belirtilen ID'ye sahip elementi döndüren DOM metodu. En hızlı seçim yöntemidir.
document.getElementById('baslik')
Elementin HTML içeriğini alan veya ayarlayan özellik. HTML etiketlerini de içerir. XSS saldırılarına karşı dikkatli kullanılmalıdır.
Elementin sadece metin içeriğini alan veya ayarlayan özellik. HTML etiketlerini ayrıştırmaz, güvenli bir yöntemdir.
Elementin CSS sınıflarını yönetmek için kullanılan API. add(),
remove(),
toggle() metodları sağlar.
Yeni bir HTML elementi oluşturan DOM metodu. document.createElement('div') ile
yeni
elementler oluşturulur.
Bir elementi başka bir elementin son çocuğu olarak ekleyen DOM metodu. Dinamik içerik ekleme için kullanılır.
Belirli bir olay gerçekleştiğinde çalıştırılan fonksiyon. addEventListener()
ile eklenir ve
kullanıcı etkileşimlerine yanıt verir.
Kullanıcı etkileşimleri veya tarayıcı eylemleri sonucu oluşan durumlar. click,
scroll, keydown gibi türleri vardır.
Olayın hedef elementten başlayarak DOM ağacında yukarı doğru yayılması. Varsayılan olay davranışıdır.
Olayın window'dan başlayarak DOM ağacında aşağı doğru hedef elemente inmesi.
capture: true
ile etkinleştirilir.
Düğüm koleksiyonu. querySelectorAll() tarafından döndürülür. Statik veya canlı
olabilir.
Element koleksiyonu. getElementsByClassName() ve
getElementsByTagName()
tarafından döndürülür. Canlı bir koleksiyondur.
Tarayıcının elementlerin boyut ve konumlarını yeniden hesaplaması. Performans açısından maliyetli bir işlemdir.
Tarayıcının elementlerin görsel özelliklerini (renk, arka plan) yeniden çizmesi. Reflow'dan daha az maliyetlidir.
HTML metninin tarayıcı tarafından okunup DOM ağacına dönüştürülmesi süreci. Tokenizasyon ve ağaç oluşturma aşamalarını içerir.
DOM ağacı ve CSS stillerinin birleşimiyle oluşan, görünür elementleri içeren ağaç yapısı. Ekrana çizim için kullanılır.
Render ağacındaki elementlerin boyut ve konumlarının hesaplanması aşaması. Reflow ile aynı anlama gelir.
Hesaplanan düzen ve stilleri kullanarak elementlerin ekrana çizilmesi aşaması. Repaint ile aynı anlama gelir.
Bir fonksiyonun, belirli bir süre içinde tekrar çağrılmadığında çalışmasını sağlayan optimizasyon tekniği. Arama kutularında yaygındır.
Bir fonksiyonun belirli bir zaman aralığında en fazla bir kez çalışmasını sağlayan optimizasyon tekniği. Scroll olaylarında kullanılır.
Kötü niyetli JavaScript kodunun web sayfasına enjekte edilmesi saldırısı.
innerHTML
kullanırken dikkat edilmelidir.
HTML belgesinin hiyerarşik ağaç yapısı. Kök düğümden (document) başlayarak tüm elementleri içerir.
DOM ağacındaki ebeveyn-çocuk ilişkisi. Bir element, içindeki elementlerin ebeveyni, dışındaki elementin çocuğudur.
Aynı ebeveyne sahip elementler. DOM navigasyonunda nextSibling ve
previousSibling ile erişilir.
Olay dinleyicisini ebeveyn elemente ekleyerek, dinamik eklenen çocuk elementlerin olaylarını yakalama tekniği. Performans açısından verimlidir.
Olayın varsayılan davranışını iptal eden metod. Örneğin bir linkin tıklanınca sayfaya gitmesini engeller.
Olayın DOM ağacında daha fazla yayılmasını durduran metod. Bubbling veya capturing aşamasında kullanılır.
DOM'a Derinlemesine Bir Bakış ( Ana Konu Giriş )
DOM API'si, JavaScript'te DOM'u programatik olarak manipüle etmek için
kullanılan
bir API'dir.
Bu bölümde, DOM API'si hakkında detaylı bir şekilde inceleyeceğiz.
DOM API Temel Etkileşim ve Manipülasyon
Tarayıcı motorunun HTML belgesini hiyerarşik bir nesne ağacına dönüştürme süreci, web sayfasının temel iskeletini oluşturur.
DOM API ( Application Programming Interface ), JavaScript'in bu dahili nesne hiyerarşisine komutlar göndermesini, mevcut yapıya
cerrahi bir hassasiyetle erişmesini ve onu gerçek zamanlı olarak manipüle etmesini sağlayan standartlaştırılmış bir dilsel araçlar setidir.
Statik Belgeden Dinamik Durum MakinesineDOM API, web sayfasını pasif bir "okuma belgesi" olmaktan çıkarıp, kullanıcı etkileşimlerine anlık tepki veren programlanabilir bir
Dinamik Durum Makinesi haline getirir.
Geliştirici açısından bu API'yi kullanmak, tarayıcı motorunun anladığı "nesne dili" ile iletişim kurarak kullanıcı arayüzünü kod üzerinden yönetmek anlamına gelir.
Sayfadaki bir düğmeyi seçmekten, karmaşık veri tablolarını güncellemeye veya asenkron olayları yakalamaya kadar tüm operasyonlar, bu
aktif kontrol katmanı aracılığıyla gerçekleştirilir.
Sonuç olarak DOM API, JavaScript'e tarayıcı dünyasında fiziksel bir müdahale yetkisi tanıyarak, modern web uygulamalarının zengin etkileşim ekosistemini mümkün kılan temel teknolojik altyapıyı sunar.
Düğüm Seçimi (Selecting Nodes) Genel Bilgi
Web sayfalarındaki HTML öğelerini programatik olarak hedeflemek, DOM etkileşim ekosistemine giriş yapmanın birincil ve en kritik adımıdır.
Bir nesneyi manipüle etmek, içeriğini güncellemek veya stilini dönüştürmek için ilgili Düğüm yapısının ağaç hiyerarşisi içinde doğru tespit edilmesi teknik bir ön koşuldur.
Veri Yapısı ve İzolasyon VerimliliğiDOM ağacı, modern uygulamalarda milyonlarca düğüm barındırabilen devasa bir Veri Yapısı niteliğindedir.
JavaScript'in temel görevi, bu karmaşık hiyerarşi içerisindeki spesifik bir parçayı yüksek verimlilikle izole etmek ve tarayıcı motoruna en az yükü bindirecek doğru arama metodunu devreye sokmaktır.
Document Kökenli Seçim StratejileriTüm seçim süreçleri hiyerarşinin tepesindeki document objesi üzerinden başlatılır. Modern API'ler, geliştiricilere sadece temel kimliklerle sınırlı kalmayan, CSS'in tüm karmaşık seçici mantığını kapsayan esnek bir sorgulama alanı sunar.
Etkileşimli bir web arayüzünün başarısı; doğru düğümün, doğru zamanda ve performans optimizasyonu gözetilerek yakalanmasına doğrudan bağlıdır.
Tekil Düğüm Seçme Metotları Genel Bilgi
Web sayfalarındaki HTML öğelerini programatik olarak hedeflemek, DOM etkileşim ekosistemine giriş yapmanın birincil ve en kritik adımıdır.
Bir nesneyi manipüle etmek, içeriğini güncellemek veya stilini dönüştürmek için ilgili Düğüm yapısının, ağaç hiyerarşisi içinde doğru ve net biçimde tespit edilmesi teknik bir ön koşuldur.
Tekil Düğüm Seçme Metotları — Genel BakışTekil düğüm seçme metotları, DOM ağacı içerisindeki benzersiz bir öğeyi ya da sorguya uyan ilk eşleşen düğümü mümkün olan en kısa yoldan yakalamayı amaçlar.
Yüzlerce hatta binlerce düğümden oluşabilen karmaşık yapılarda, hedeflenen öğeyi doğrudan izole edebilmek; tüm DOM manipülasyonlarının başlangıç noktasını oluşturur ve işlem maliyetini ciddi ölçüde düşürür.
Bu metotlar genellikle iki temel yaklaşım üzerinden çalışır: Öğenin kesin kimliğini ( ID ) kullanmak veya
CSS seçici mantığı aracılığıyla yapı içerisindeki ilk uygun eşleşeni yakalamak.
Her iki yaklaşım da hızlı erişim hedefler; ancak biri mutlak doğruluksağlarken, diğeri esneklik ve ifade gücü sunarak geliştiricinin senaryoya en uygun yöntemi tercih etmesine olanak tanır.
Veri Yapısı ve İzolasyon VerimliliğiDOM ağacı, modern web uygulamalarında milyonlarca düğüm barındırabilen devasa bir Veri Yapısı niteliğindedir.
JavaScript’in temel görevi, bu karmaşık hiyerarşi içerisinden spesifik bir düğümü yüksek verimlilikle izole etmek ve tarayıcı motoruna minimum maliyetle erişim sağlamaktır.
Document Kökenli Seçim StratejileriTüm seçim süreçleri, hiyerarşinin tepesinde yer alan document objesi üzerinden başlatılır.
Modern API’ler, geliştiricilere yalnızca temel kimliklerle sınırlı kalmayan, CSS’in tüm seçici mantığını kapsayan esnek bir sorgulama alanı sunar.
Etkileşimli bir web arayüzünün başarısı; doğru düğümün, doğru zamanda ve performans optimizasyonu gözetilerek yakalanmasına doğrudan bağlıdır.
Tekli Düğüm Seçme Metotları document.getElementById(id)
document.getElementById(id) metodu, DOM ağacı içerisindeki bir öğeyi benzersiz kimliği üzerinden doğrudan hedeflemek için tasarlanmıştır.
HTML standardına göre bir belgede yer alan her id değeri yalnızca tek bir elemana ait olabilir; bu durum, seçimin deterministik ve güvenilir olmasını sağlar.
Çalışma Mantığı ve Performans AvantajıBu metot çağrıldığında tarayıcı, tüm DOM ağacını satır satır taramak zorunda kalmaz. ID değerleri, tarayıcı motoru tarafından optimize edilmiş dahili yapılarda saklanır.
Bu nedenle getElementById, DOM seçim metotları arasında en hızlı ve en düşük maliyetli yaklaşımlardan biri olarak kabul edilir.
Temel Kullanım SenaryosuEğer amaç sayfa üzerinde belirli ve tek bir öğeyi hızlıca yakalamaksa, bu metot mimari olarak ilk tercih olmalıdır.
Eğer belirtilen id DOM içerisinde bulunamazsa, metot null değerini döndürür.
Bu davranış, çalışma zamanında güvenli kontrol mekanizmaları kurabilmek için geliştiriciye açık ve öngörülebilir bir sözleşme sunar.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>DOM API – getElementById</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="getId.css?v=1.0.150" />
</head>
<body>
<section class="card">
<h1 id="baslik">Statik DOM Başlığı</h1>
<p class="desc">
Bu başlık, <strong>document.getElementById</strong> kullanılarak
JavaScript üzerinden programatik olarak güncellenecektir.
</p>
<button id="btn">Başlığı Güncelle</button>
</section>
<script src="getId.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
font-family: system-ui, -apple-system, sans-serif;
background: #0f172a;
color: #e5e7eb;
}
.card {
background: #020617;
padding: 2.5rem 3rem;
border-radius: 16px;
width: 100%;
max-width: 520px;
box-shadow: 0 30px 80px rgba(0,0,0,.6);
}
h1 {
margin: 0 0 1rem;
font-size: 1.6rem;
transition: color 0.3s ease;
}
.desc {
font-size: 0.95rem;
line-height: 1.6;
color: #94a3b8;
}
button {
margin-top: 1.8rem;
padding: 0.7rem 1.4rem;
font-size: 0.9rem;
border-radius: 8px;
border: none;
cursor: pointer;
background: linear-gradient(135deg, #22d3ee, #38bdf8);
color: #020617;
font-weight: 600;
}
button:hover {
opacity: 0.9;
}
function baslikGuncelle(yeniMetin) {
// ID ile tekil ve deterministik erişim
const baslik = document.getElementById("baslik");
if (baslik) {
baslik.textContent = yeniMetin;
baslik.style.color = "#22d3ee";
}
}
const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
baslikGuncelle("DOM Seçimi Başarılı!");
});
Tekli Düğüm Seçme Metotları document.querySelector(selector) (Modern Seçici)
document.querySelector(selector) metodu, DOM ağacında tekil bir düğümü seçerken CSS seçici mantığını JavaScript tarafına taşıyan modern bir arayüz sunar.
Bu yaklaşım, yalnızca id veya class gibi tekil kriterlerle sınırlı kalmadan, geliştiricinin tanımladığı herhangi bir karmaşık seçici kuralını DOM üzerinde çalıştırabilmesini mümkün kılar.
Seçim Mekanizması ve Davranış ModeliMetot çalıştırıldığında, tarayıcı DOM ağacını yukarıdan aşağıya doğru tarar ve verilen CSS seçicisine uyan ilk Element düğümünü döndürür.
Birden fazla eşleşme bulunsa dahi, querySelector her zaman yalnızca ilk karşılaşılan öğeyi verir; bu yönüyle hâlâ tekil seçim kategorisinde yer alır.
Esneklik ve İfade GücüBu metot sayesinde; belirli bir sınıfa sahip, aynı zamanda özel bir data-* niteliği taşıyan veya belirli bir hiyerarşi içerisinde konumlanan öğeler
tek satırda hedeflenebilir.
Bu çok yönlülük, querySelector'ı modern JavaScript kodlarında en sık tercih edilen tekil seçim metotlarından biri haline getirir.
Temel Kullanım ÖrneğiEğer belirtilen CSS seçicisine uyan herhangi bir öğe bulunamazsa, metot null değerini döndürür.
Bu davranış, geliştiriciye seçim sonucunu kontrollü biçimde doğrulama ve güvenli DOM manipülasyonu gerçekleştirme imkânı tanır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>DOM API – querySelector</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="querySelector.css?v=1.0.150" />
</head>
<body>
<section class="card">
<h2>Menü Öğeleri</h2>
<ul class="menu">
<li data-index="1">Dashboard</li>
<li data-index="2" class="aktif">Analytics</li>
<li data-index="3">Settings</li>
</ul>
<button id="btn">Aktif Elemanı Vurgula</button>
</section>
<script src="querySelector.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
font-family: system-ui, -apple-system, sans-serif;
background: linear-gradient(180deg, #020617, #020617);
color: #e5e7eb;
}
.card {
background: #020617;
border-radius: 16px;
padding: 2.5rem 3rem;
width: 100%;
max-width: 480px;
box-shadow: 0 40px 100px rgba(0,0,0,.7);
}
h2 {
margin-top: 0;
font-size: 1.3rem;
}
.menu {
list-style: none;
padding: 0;
margin: 1.5rem 0;
}
.menu li {
padding: 0.6rem 0.8rem;
border-radius: 8px;
margin-bottom: 0.4rem;
background: #020617;
border: 1px solid #1e293b;
transition: background 0.25s ease;
}
.menu li.aktif {
border-color: #38bdf8;
}
button {
margin-top: 1rem;
padding: 0.6rem 1.3rem;
border: none;
border-radius: 8px;
cursor: pointer;
font-weight: 600;
background: linear-gradient(135deg, #22d3ee, #38bdf8);
color: #020617;
}
function aktifElemaniVurgula() {
// Karmaşık CSS seçici ile tekil düğüm seçimi
const aktifEleman = document.querySelector(
'.menu li.aktif[data-index="2"]'
);
if (aktifEleman) {
aktifEleman.style.backgroundColor = '#facc15';
aktifEleman.style.color = '#020617';
aktifEleman.textContent += ' (Seçildi)';
}
}
const btn = document.getElementById("btn");
btn.addEventListener("click", aktifElemaniVurgula);
Koleksiyon Seçme Metotları Genel Bilgi
Koleksiyon seçme metotları, DOM ağacı içerisinde birden fazla elementi eş zamanlı olarak bulmaya odaklanır ve sonuçları dizi benzeri bir koleksiyon yapı halinde döndürür.
Bu yaklaşım, tekil düğüm seçiminden farklı olarak, aynı kritere uyan birden fazla öğenin toplu biçimde yönetilmesi ihtiyacından doğmuştur.
Tekil Seçim ile Temel FarkTekil seçiciler doğrudan belirli bir düğümü hedeflerken, koleksiyon seçiciler aynı anda birden fazla eşleşmeyi yakalar ve sonucu tek bir yapı altında sunar.
Bu nedenle koleksiyon seçimleri, çoğunlukla bir döngü mekanizması (for, forEach vb.) ile birlikte kullanılır.
Kullanım MotivasyonuWeb sayfalarında sıklıkla karşılaşılan liste yapıları, kart grupları, menüler veya ortak sınıfa sahip öğeler, tek tek ele alınmak yerine toplu işlemci gerektirir.
Koleksiyon seçme metotları, stil uygulamalarını, etkileşim atamalarını ve davranış güncellemelerini tekrarlı kod yazmadan merkezi ve tutarlı şekilde gerçekleştirmeyi mümkün kılar.
Otomasyon ve VerimlilikBu toplu erişim yeteneği, özellikle büyük ve dinamik DOM yapılarında manuel müdahaleyi azaltır ve tekrarlayan görevlerin otomatikleştirilmesini sağlar.
Sonuç olarak koleksiyon seçiciler, DOM manipülasyonunun ölçeklenebilirlik ve bakım kolaylığı katmanını temsil eder.
Koleksiyon Seçme Metotları document.getElementsByClassName(className)
document.getElementsByClassName(className) metodu, DOM ağacında belirli bir sınıf adına sahip tüm öğeleri tek seferde seçmek için tasarlanmıştır.
Bu metot, aynı stil kurallarını veya aynı JavaScript davranışını paylaşan öğe gruplarını hedeflemek için mimari olarak oldukça uygundur.
Dönen Veri Yapısı: HTMLCollectionMetot çalıştırıldığında, belirtilen sınıf adına sahip tüm HTML elementleri HTMLCollection yapısı içerisinde döndürülür.
Parametre olarak verilen sınıf adı, boşluklarla ayrılmış birden fazla sınıf içerebilir; bu durumda yalnızca tüm sınıfları aynı anda taşıyan öğeler seçilir.
Canlı (Live) Koleksiyon DavranışıBu metotla elde edilen koleksiyonun en ayırt edici özelliği, canlı bir yapı olmasıdır.
DOM içerisine yeni bir öğe eklendiğinde veya mevcut bir öğe kaldırıldığında, HTMLCollection sonuçları herhangi bir ek işlem yapılmaksızın
otomatik olarak güncellenir.
Canlı koleksiyon yapısı sayesinde, sınıfı uyari olan yeni bir öğe DOM’a eklendiğinde, bu döngü otomatik olarak
güncel koleksiyon üzerinde çalışmaya devam eder.
Bu özellik, özellikle anlık durum takibi ve dinamik arayüzler gerektiren senaryolarda avantaj sağlar.
Not
Canlı koleksiyonlar, anlık güncellik sunsa da her erişimde DOM'u yeniden sorguladıkları için büyük ölçekli döngülerde performans darboğazı yaratabilir; bu nedenle yoğun manipülasyonlarda dikkatli yönetilmelidir.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>DOM API – getElementsByClassName</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="getElementsByClassName.css?v=1.0.150" />
</head>
<body>
<section class="panel">
<h2>Ürün Detayları</h2>
<div class="list">
<p class="urun-detay">Ürün Detayı A</p>
<p class="urun-detay">Ürün Detayı B</p>
<p class="urun-detay">Ürün Detayı C</p>
</div>
<div class="actions">
<button id="guncelleBtn">Tüm Detayları Güncelle</button>
<button id="ekleBtn">Yeni Detay Ekle</button>
</div>
</section>
<script src="getElementsByClassName.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
font-family: system-ui, -apple-system, sans-serif;
background: radial-gradient(circle at top, #020617, #020617);
color: #e5e7eb;
}
.panel {
width: 100%;
max-width: 520px;
background: #020617;
padding: 2.5rem 3rem;
border-radius: 18px;
box-shadow: 0 40px 120px rgba(0, 0, 0, 0.7);
}
h2 {
margin-top: 0;
font-size: 1.4rem;
}
.list {
margin: 1.5rem 0;
}
.urun-detay {
padding: 0.6rem 0.8rem;
margin-bottom: 0.5rem;
border-radius: 8px;
background: #020617;
border: 1px solid #1e293b;
font-size: 0.95rem;
transition: background 0.25s ease;
}
.actions {
display: flex;
gap: 1rem;
margin-top: 1.5rem;
}
button {
flex: 1;
padding: 0.6rem 1rem;
border-radius: 10px;
border: none;
cursor: pointer;
font-weight: 600;
background: linear-gradient(135deg, #22d3ee, #38bdf8);
color: #020617;
}
button:hover {
opacity: 0.9;
}
function tumDetaylariGuncelle() {
// Canlı (live) HTMLCollection döner
const detaylar = document.getElementsByClassName("urun-detay");
for (let i = 0; i < detaylar.length; i++) {
detaylar[i].textContent = "Detay Güncellendi: " + (i + 1);
detaylar[i].style.backgroundColor = "#22d3ee";
detaylar[i].style.color = "#020617";
}
}
function yeniDetayEkle() {
const liste = document.querySelector(".list");
const yeni = document.createElement("p");
yeni.className = "urun-detay";
yeni.textContent = "Yeni Ürün Detayı";
liste.appendChild(yeni);
}
document
.getElementById("guncelleBtn")
.addEventListener("click", tumDetaylariGuncelle);
document
.getElementById("ekleBtn")
.addEventListener("click", yeniDetayEkle);
Koleksiyon Seçme Metotları document.getElementsByTagName(tagName)
document.getElementsByTagName(tagName) metodu, DOM ağacı içerisindeki belirli bir HTML etiket türüne ait tüm elementleri tek seferde seçmek için kullanılır.
Parametre olarak verilen etiket adı, p, a, div gibi standart HTML etiketlerinden herhangi biri olabilir.
Dönen Yapı ve KapsamMetot çalıştırıldığında, belirtilen etiket adına sahip tüm öğeler HTMLCollection yapısı içerisinde döndürülür.
Özel olarak * karakteri kullanıldığında, belge içerisindeki tüm HTML elementleri kapsama dahil edilir.
Kullanım SenaryolarıBu metot; sayfa üzerindeki tüm bağlantıların, başlıkların veya paragraf etiketlerinin sayısını analiz etmek ya da içeriklerini toplu biçimde değiştirmek istendiğinde oldukça pratiktir.
Özellikle raporlama, içerik denetimi veya otomatik stil uygulamaları gibi senaryolarda etiket bazlı erişim büyük kolaylık sağlar.
Canlı (Live) Koleksiyon ÖzelliğiTıpkı getElementsByClassName metodunda olduğu gibi, bu metot da canlı bir HTMLCollection döndürür.
DOM içerisine yeni bir öğe eklendiğinde veya mevcut bir öğe kaldırıldığında, koleksiyon içeriği otomatik olarak güncellenir.
Bu durum, döngü sırasında eleman ekleme veya silme işlemleri yapılırken ekstra dikkat gerektirir.
Canlı koleksiyon yapısı nedeniyle, döngü sırasında DOM’a yeni bir a etiketi eklenirse, bu öğe de otomatik olarak koleksiyonun bir parçası haline gelir.
Bu özellik, metodu basit bir dizi yapısından ayırır ve dinamik içeriklerle çalışırken bilinçli kullanım gerektirir.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>getElementsByTagName Örneği</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="getElementsByTagName.css?v=1.0.150" />
</head>
<body>
<header class="page-header">
<h1>Makale Akışı</h1>
<button id="addArticleBtn">Yeni Makale Ekle</button>
</header>
<main class="content-area">
<article class="post">İlk Makale</article>
<article class="post">İkinci Makale</article>
<article class="post">Üçüncü Makale</article>
</main>
<script src="getElementsByTagName.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
margin: 0;
background: #f4f6f8;
color: #333;
}
.page-header {
background: #1f2933;
color: #fff;
padding: 16px 24px;
display: flex;
justify-content: space-between;
align-items: center;
}
.page-header button {
background: #3b82f6;
border: none;
color: white;
padding: 8px 14px;
border-radius: 6px;
cursor: pointer;
}
.content-area {
padding: 24px;
display: grid;
gap: 12px;
}
article {
background: white;
padding: 16px;
border-radius: 8px;
border-left: 4px solid transparent;
transition: all 0.2s ease;
}
article[data-active="true"] {
border-left-color: #22c55e;
background: #f0fdf4;
}
function makaleleriIsaretle() {
// Tüm article etiketleri seçilir (HTMLCollection - canlı)
const makaleler = document.getElementsByTagName('article');
for (let i = 0; i < makaleler.length; i++) {
const makale = makaleler[i];
// Sıralı veri niteliği eklenir
makale.setAttribute('data-index', i + 1);
// Görsel durum işareti
makale.setAttribute('data-active', 'true');
}
}
// İlk yüklemede çalışır
makaleleriIsaretle();
// Yeni makale ekleme (canlı koleksiyon etkisi için)
document.getElementById('addArticleBtn').addEventListener('click', () => {
const yeniMakale = document.createElement('article');
yeniMakale.textContent = 'Yeni Eklenen Makale';
document.querySelector('.content-area').appendChild(yeniMakale);
// Tekrar çağırmaya gerek yok ama bilinçli olarak çağırıyoruz
makaleleriIsaretle();
});
Koleksiyon Seçme Metotları document.querySelectorAll(selector) (Modern Koleksiyon Seçici)
document.querySelectorAll(selector) metodu, DOM ağacı içerisinde toplu seçim yaparken CSS seçici mantığının tüm esnekliğini JavaScript'e taşıyan en gelişmiş arayüzdür.
Bu metot, sadece sınıf veya etiket bazlı seçimlerle sınırlı kalmaz; hiyerarşik ilişkiler, nitelik sorguları ve pseudo-class yapılarını kullanarak cerrahi bir hassasiyetle toplu izolasyon sağlar.
NodeList ve Statik Koleksiyon DavranışıMetot çalıştırıldığında, kriterlere uyan tüm elementleri bir NodeList yapısı içerisinde döndürür.
Bu yapıyı klasik getElementsBy... metotlarından ayıran en hayati teknik fark, dönen koleksiyonun Statik bir yapıda olmasıdır.
Seçim yapıldığı andaki "anlık görüntü" ( "snapshot" ) korunur; bu durum, özellikle döngü işlemleri sırasında DOM'a yeni eleman eklendiğinde sonsuz döngü riskini ortadan kaldırarak öngörülebilir bir çalışma zamanı sağlar.
Fonksiyonel Iterasyon AvantajıNodeList yapısı, modern tarayıcılarda doğrudan forEach metodunu destekler.
Bu özellik, koleksiyon üzerinde işlem yapmak için klasik for döngülerine olan ihtiyacı azaltarak daha deklaratif ve temiz bir kod yazımına imkan tanır.
Özet ile querySelectorAll , modern web mimarisinde performans optimizasyonu ve "ifade gücü" arasındaki en ideal dengeyi temsil eder.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>UI Denetimi — querySelectorAll</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="querySelector2.css?v=1.0.150" />
</head>
<body>
<section class="panel">
<h2>Kontrol Paneli</h2>
<div class="controls">
<button>Aktif Buton</button>
<button aria-disabled="true">Pasif Buton</button>
<button>Devam Et</button>
<button aria-disabled="true">Erişim Kapalı</button>
</div>
<button id="auditBtn">UI Denetimini Çalıştır</button>
</section>
<script src="querySelector2.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
background: radial-gradient(circle at top, #020617, #000);
min-height: 100vh;
display: grid;
place-items: center;
color: #e5e7eb;
}
.panel {
width: 420px;
padding: 24px;
border-radius: 16px;
background: rgba(15, 23, 42, 0.9);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
}
h2 {
margin-bottom: 16px;
font-size: 1.25rem;
}
.controls {
display: grid;
gap: 12px;
margin-bottom: 20px;
}
button {
padding: 10px 14px;
border-radius: 10px;
border: 1px solid #1e293b;
background: #020617;
color: #e5e7eb;
cursor: pointer;
}
button[data-audit="fail"] {
border-color: #fb7185;
background: rgba(251, 113, 133, 0.15);
color: #fecdd3;
}
#auditBtn {
margin-top: 12px;
background: #22d3ee;
color: #020617;
font-weight: 600;
}
function uiDenetimiYap() {
// Statik NodeList döner
const pasifButonlar = document.querySelectorAll(
'button[aria-disabled="true"]'
);
pasifButonlar.forEach((btn) => {
// Denetim sonucu işaretleme
btn.setAttribute("data-audit", "fail");
});
console.log(
`Denetim tamamlandı: ${pasifButonlar.length} pasif bileşen bulundu.`
);
}
document
.getElementById("auditBtn")
.addEventListener("click", uiDenetimiYap);
Düğüm Manipülasyonu (Manipulating Nodes) Genel Bilgi
DOM API'sinde Düğüm Manipülasyonu, bir web sayfasını pasif bir görüntüden, kullanıcı etkileşimine anlık yanıt veren dinamik bir deneyime dönüştüren asıl eylem katmanıdır.
Bu süreç, sadece basit bir metin değişikliğinin ötesine geçerek; "HTML yapısının kendisini" , "CSS görünümünü" ve elementler arasındaki hiyerarşik ilişkileri programatik olarak yeniden yazma yeteneğidir.
Mühendislik Düzeyinde MüdahaleTemel felsefesi, JavaScript'e tarayıcı tarafından kurulan ağaç yapısına mühendislik düzeyinde müdahale etme yetkisi vermektir.
Bu yetki; içeriğin güvenli bir şekilde güncellenmesini ( textContent ), görsel durumun sınıf yönetimiyle değiştirilmesini ( classList ) veya tamamen yeni elementlerin sıfırdan yaratılıp belgeye eklenmesini ( createElement , appendChild ) kapsar.
Performans ve Sorumluluk: Render MekanikleriDOM manipülasyonu, tarayıcının Render Mekanikleri ile doğrudan etkileşimde olduğu için, bilinçsizce yapılan her işlem sayfa performansını kritik düzeyde etkileyebilir.
Özellikle Layout / Reflow ( elementlerin konum ve boyut hesaplamaları ) ve Repaint ( elementlerin ekrana çizilme süreci ) operasyonları, işlem maliyeti en yüksek olan teknik süreçlerdir.
Bu nedenle, manipülasyon metotları kullanılırken veri güvenliği ve verimlilik dengesi gözetilerek, tarayıcı motoruna binen yükü minimize edecek stratejiler geliştirilmelidir.
Sonuç olarak, manipülasyon yeteneği bir web uygulamasını hayata geçiren anahtardır; ancak bu anahtarın performans optimizasyonu gözetilerek kullanılması profesyonel yazılım mimarisinin gereğidir.
İçerik Değiştirme (Content Modification) Genel Bilgi
Bir HTML elementinin içeriğini değiştirmek, web sayfalarını dinamik hale getirmenin temelidir.
JavaScript, bu amaçla başlıca iki temel ve stratejik özellik sunar: innerHTML ve textContent.
Bu iki yöntem arasındaki seçim, sadece görsel esneklikle değil; aynı zamanda güvenlik protokolleri ve performans kararlarıyla doğrudan ilgilidir.
Ayrıştırma Mekanizması ve Veri İşlemeBu iki yöntem, tarayıcı motorunun içeriği HTML yapısı olarak mı ayrıştıracağını yoksa saf veri olarak mı ele alacağını belirler.
innerHTML kullanımı, tarayıcının metni okuyup yeni DOM düğümleri yaratmasına neden olurken; textContent veriyi doğrudan metin düğümü olarak işler.
Mimari Karar: Güvenlik ve PerformansBu ayrım, XSS ( kötü niyetli kod enjeksiyonu ) gibi kritik güvenlik açıklarını önlemek için hayati bir mimari karardır.
Ayrıca, gereksiz HTML ayrıştırma süreçlerinden kaçınmak, DOM'un yeniden hesaplama maliyetini en aza indirerek uygulamanın tepki hızını maksimize eder.
HTML ve Yapısal Değişim element.innerHTML
innerHTML özelliği, bir elementin içerdiği tüm HTML yapısını ( "metin" , "alt elementler" , "etiketler" ) programatik olarak almanızı veya yeniden kurgulamanızı sağlar.
Bu özellik bir string değeri kabul eder ve tarayıcı motoruna bu dizeyi ayrıştırıp DOM ağacına yeni düğümler olarak yerleştirmesini söyler.
Tek bir komutla tüm alt hiyerarşiyi değiştirebilme gücü sunarken, işlem anında mevcut tüm alt düğümlerin DOM'dan kalıcı olarak kaldırılmasına neden olur.
Stratejik Kullanım ve Veri EntegrasyonuinnerHTML , genellikle sunucudan gelen hazır HTML parçacıklarını ( "templates" ) sayfaya entegre etmek veya bir elementin iç yapısını tamamen sıfırdan inşa etmek istendiğinde tercih edilir.
Kritik Güvenlik Riski: Cross-Site Scripting (XSS)Bu gücün en büyük dezavantajı, Cross-Site Scripting ( siteler arası betik çalıştırma ) saldırılarına açık kapı bırakmasıdır.
Kullanıcıdan gelen ve doğrulanmamış verilerin ( <script> gibi ) doğrudan bu özelliğe atanması, tarayıcının kötü amaçlı kodları yürütmesine neden olabilir.
Bu risk, kullanıcı verilerinin çalınmasına veya uygulama bütünlüğünün bozulmasına yol açabileceği için, innerHTML kullanırken içeriğin mutlak surette güvenilir olduğundan emin olunmalıdır.
Sonuç olarak innerHTML , sunduğu yapısal esnekliğe rağmen, veri güvenliğini tehlikeye atmamak adına bilinçli ve kontrollü bir şekilde kullanılmalıdır.
Saf Metin ve Güvenlik element.textContent
textContent özelliği, bir elementin ve onun tüm alt elementlerinin sadece metinsel içeriğini almanızı veya programatik olarak ayarlamanızı sağlar.
Bu özelliğe atanan herhangi bir değer, içerisinde HTML etiketleri barındırsa dahi, tarayıcı tarafından mutlak bir düz metin olarak kabul edilir.
Tarayıcı motoru bu içeriği asla ayrıştırmaz ( "parse" ); veriyi sadece bir metin düğümü olarak DOM'a enjekte eder.
Güvenlik Avantajı: Doğal Savunma HattıtextContent , XSS saldırılarına karşı tarayıcı seviyesinde doğal bir savunma mekanizması sağlar.
Kullanıcıdan gelen tehlikeli bir <script> etiketi bile, bu özellik kullanıldığında yalnızca ekranda bir metin olarak görünecek, ancak çalıştırılmayacaktır.
Bu nedenle, bir elementin sadece metin içeriği güncellenirken mimari olarak her zaman textContent tercih edilmelidir.
Performans ve Render OptimizasyonuBu özellik, tarayıcının HTML ayrıştırma mekanizmasını devreye sokmasını gerektirmediği için, innerHTML yönteminden genellikle daha hızlıdır.
Daha az işlem yükü sayesinde Reflow / Repaintsüreçlerini minimize ederek web performansını optimize eder.
Sonuç olarak textContent , modern JavaScript geliştirmede hem performans hem de veri güvenliği için vazgeçilmez bir standarttır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>innerHTML — Yapısal Yeniden İnşa</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="innerHTML.css?v=1.0.150" />
</head>
<body>
<section class="card">
<h2>Bildirim Merkezi</h2>
<div id="contentArea" class="content">
<p>Henüz bildirim yok.</p>
</div>
<button id="loadBtn">Bildirimleri Yükle</button>
</section>
<script src="innerHTML.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
min-height: 100vh;
background: linear-gradient(135deg, #020617, #020617 60%, #0f172a);
display: grid;
place-items: center;
color: #e5e7eb;
}
.card {
width: 380px;
padding: 24px;
border-radius: 14px;
background: #020617;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.7);
}
h2 {
margin-bottom: 12px;
}
.content {
border: 1px solid #1e293b;
border-radius: 10px;
padding: 16px;
margin-bottom: 16px;
}
.notice {
padding: 10px;
border-left: 4px solid #22d3ee;
background: rgba(34, 211, 238, 0.1);
margin-bottom: 8px;
}
button {
width: 100%;
padding: 10px;
border-radius: 10px;
border: none;
background: #22d3ee;
color: #020617;
font-weight: 600;
cursor: pointer;
}
function bildirimleriYukle() {
const alan = document.getElementById("contentArea");
// Güvenli ve sabit HTML şablonu
alan.innerHTML = `
<div class="notice">Sistem güncellemesi tamamlandı</div>
<div class="notice">Yeni mesajınız var</div>
<div class="notice">Oturum süresi uzatıldı</div>
`;
}
document
.getElementById("loadBtn")
.addEventListener("click", bildirimleriYukle);
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>textContent — Güvenli Metin</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="textContent.css?v=1.0.150" />
</head>
<body>
<section class="panel">
<h2>Kullanıcı Mesajı</h2>
<input id="userInput" type="text" placeholder="Mesajınızı yazın..." />
<p id="output" class="output">
Henüz mesaj girilmedi.
</p>
<button id="sendBtn">Mesajı Gönder</button>
</section>
<script src="textContent.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
min-height: 100vh;
background: radial-gradient(circle at top, #020617, #000);
display: grid;
place-items: center;
color: #e5e7eb;
}
.panel {
width: 360px;
padding: 22px;
border-radius: 14px;
background: rgba(15, 23, 42, 0.9);
}
h2 {
margin-bottom: 14px;
}
input {
width: 100%;
padding: 10px;
border-radius: 8px;
border: 1px solid #1e293b;
background: #020617;
color: #e5e7eb;
margin-bottom: 12px;
}
.output {
padding: 12px;
background: rgba(34, 211, 238, 0.08);
border-radius: 8px;
margin-bottom: 12px;
}
button {
width: 100%;
padding: 10px;
border-radius: 8px;
background: #22d3ee;
color: #020617;
border: none;
font-weight: 600;
cursor: pointer;
}
function mesajiGuncelle() {
const input = document.getElementById("userInput");
const output = document.getElementById("output");
// Güvenli metinsel aktarım
output.textContent = input.value || "Boş mesaj gönderildi.";
}
document
.getElementById("sendBtn")
.addEventListener("click", mesajiGuncelle);
Nitelik ve Sınıf Manipülasyonu (Attribute and Class Manipulation) Genel Bilgi
DOM Manipülasyonunun bu aşaması, elementlerin kimliklerini, davranışlarını ve görsel durumlarını programatik olarak yönetmeye odaklanır.
Etkili bir DOM yönetimi, doğrudan stil atamaları yerine, elementlerin niteliklerini ve CSS sınıflarını kontrol etmeyi gerektirir.
Bu işlemler, JavaScript'in bir elementin hem statik meta verisini ( "data-*" nitelikleri) hem de dinamik görsel kimliğini yönetmesini sağlar.
Mimari Prensip: Sorumlulukların AyrılmasıModern web mimarisinde bu yöntem, JavaScript'in yalnızca davranışa odaklanmasını sağlar.
Görünümü CSS'e bırakarak Sorumlulukların Ayrılması prensibini güçlendirir.
Fonksiyonel Kontrol ve Durum TakibiElementlerin anlık durumunu ( disabled , checked ) niteliklerle yönetmek, bu manipülasyonun temelini oluşturur.
Bu yaklaşım, Falsy ( pasif durumlar ) veya Truthy ( aktif/seçili durumlar ) mantığıyla uygulama akışını kontrol etmeyi kolaylaştırır.
Sonuç olarak, sınıf ve nitelik yönetimi, kodun hem daha okunabilir hem de bakımının kolay olmasını sağlayan stratejik bir disiplindir.
Nitelik Manipülasyonu (Attribute Management) Genel Bilgi
HTML elementlerinin nitelikleri ( href , src , id , data-* ), elementlerin temel davranışlarını veya barındırdığı meta verileri tanımlar.
Bu nitelikler, Element objesi üzerindeki özel metotlar aracılığıyla yönetilmelidir; bu yönetim,JavaScript'in elementin etkileşim kurma kurallarını gerçek zamanlı olarak değiştirmesine olanak tanır.
Kritik Teknik Ayrım: Özellik (Property) vs. Nitelik (Attribute)DOM ile çalışırken akılda tutulması gereken en kritik teknik nüans, HTML niteliği ile JavaScript özelliği arasındaki farktır.
Örneğin: Bir input elementinin value niteliği, HTML kodunda belirlenen başlangıç değerini temsil ederken; input.value özelliği, kullanıcının girdiği güncel değeri tutar.
Metot Bazlı Yönetim ve Veri BütünlüğüsetAttribute ve getAttribute metotları, her zaman doğrudan HTML niteliği üzerinde işlem yapar.
Bu davranış, özellikle data-* gibi özel meta verileri yönetmek ve elementin orijinal yapısını koruyarak bilgi depolamak için en uygun ve güvenilir araçtır.
Nitelik Manipülasyonu Metotları element.setAttribute(name, value)
element.setAttribute(name, value) metodu, bir elemente yeni bir nitelik eklemek veya mevcut bir niteliğin değerini güncellemek için kullanılan birincil mekanizmadır.
Bu metot, nitelik adına karşılık gelen yeni bir string ( "dize" ) değeri atar; atanan değerin türü ne olursa olsun ( "sayı" , "boolean" veya "karmaşık dize" ), JavaScript motoru bu değeri otomatik olarak bir dizeye dönüştürür.
Yapılan atama işlemi gerçekleştikten sonra, nitelik değişikliği tarayıcının Geliştirici Araçları sekmesinde anlık olarak gözlemlenebilir hale gelir.
Stratejik Kullanım AmaçlarıBu metot, bir görselin src adresini, bir bağlantının href değerini dinamik olarak değiştirmek veya özel data-* niteliklerini kurgulamak gibi elementin kalıcı verilerini yönetmek için kullanılır.
Aynı zamanda, bir form öğesini devre dışı bırakmak için disabled niteliğini atamak gibi element davranışlarını kontrol etmeye yarar.
Sonuç olarak bu yöntem, elementin HTML seviyesindeki temel kimliğini ve davranışsal ayarlarını programatik olarak kontrol etmenin en güvenilir ve standart yoludur.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Nitelik Manipülasyonu – setAttribute</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="getAttribute.css?v=1.0.150">
</head>
<body>
<section class="kart">
<h2>Profil Görseli</h2>
<img id="gorsel" src="placeholder.jpg" data-durum="bos" alt="Profil Görseli">
<p id="durumMetni">Durum: Bekleniyor</p>
<button id="guncelleBtn">Görseli Yükle</button>
</section>
<script src="script.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
background: #0f172a;
color: #e5e7eb;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.kart {
background: #020617;
padding: 24px;
border-radius: 12px;
width: 320px;
text-align: center;
box-shadow: 0 0 40px rgba(0,0,0,.6);
}
img {
width: 100%;
border-radius: 8px;
margin-bottom: 12px;
}
button {
margin-top: 12px;
padding: 10px 16px;
border: none;
border-radius: 8px;
background: #2563eb;
color: white;
cursor: pointer;
}
button:hover {
background: #1d4ed8;
}
const gorselElement = document.getElementById("gorsel");
const durumMetni = document.getElementById("durumMetni");
const guncelleBtn = document.getElementById("guncelleBtn");
function durumuGuncelle(yeniKaynak) {
// 1 Görselin src niteliği güncellenir
gorselElement.setAttribute("src", yeniKaynak);
// 2 Özel veri niteliği (data-*) güncellenir
gorselElement.setAttribute("data-durum", "yuklendi");
// 3 Okuma işlemi her zaman getAttribute ile yapılır
const mevcutDurum = gorselElement.getAttribute("data-durum");
// 4 UI bilgilendirmesi (sadece metin → güvenli)
durumMetni.textContent = `Durum: ${mevcutDurum}`;
console.log("Yeni src:", gorselElement.getAttribute("src"));
console.log("Yeni data-durum:", mevcutDurum);
}
guncelleBtn.addEventListener("click", () => {
durumuGuncelle("profil_resmi.jpg");
});
Nitelik Manipülasyonu Metotları element.getAttribute(name)
element.getAttribute(name) metodu, belirtilen niteliğin mevcut değerini doğrudan DOM ağacından bir string ( "dize" ) olarak döndürür.
Eğer sorgulanan nitelik element üzerinde mevcut değilse, metot öngörülebilir bir şekilde null ( boş/tanımsız ) değerini üretir.
Bu metot, nitelik içeriği ne olursa olsun ( "sayı" , "boolean" , "URL" ), her zaman dize formatında sonuç verir; bu durum, değer üzerinde matematiksel işlem yapmadan önce parseInt() gibi tür dönüşümlerinin uygulanmasını gerektirebilir.
Stratejik Kullanım AmacıBu metot, bir elementin o anki durumunu veya bir veri niteliğinde ( data-id , data-state ) saklanan özel bilgileri okumak için kullanılır.
Özellikle, bir elementin HTML içerisindeki başlangıç ayarlarını veya kullanıcı tarafından enjekte edilmiş meta verileri okumak için en güvenilir yoldur.
Sonuç olarak, tarayıcının o element için HTML kodunda kesin olarak ne tanımladığını öğrenmek istediğinizde başvurmanız gereken temel teknik referans kaynağıdır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>getAttribute — Yapılandırma Okuma</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="getConfig.css?v=1.0.150" />
</head>
<body>
<section class="config-card">
<h2>Form Alanı Ayarları</h2>
<input id="veri-kutusu" type="text" data-max-karakter="50" disabled placeholder="Bu alan kilitli" />
<button id="kontrolBtn">Ayarları Oku</button>
<ul class="result">
<li><strong>Type:</strong> <span id="typeInfo">-</span></li>
<li><strong>Max Karakter:</strong> <span id="maxInfo">-</span></li>
<li><strong>Disabled:</strong> <span id="disabledInfo">-</span></li>
</ul>
</section>
<script src="getConfig.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
min-height: 100vh;
background: linear-gradient(160deg, #020617, #0f172a);
display: grid;
place-items: center;
color: #e5e7eb;
}
.config-card {
width: 400px;
padding: 24px;
border-radius: 16px;
background: #020617;
box-shadow: 0 30px 90px rgba(0, 0, 0, 0.8);
}
h2 {
margin-bottom: 16px;
}
input {
width: 100%;
padding: 10px;
border-radius: 10px;
border: 1px solid #1e293b;
background: #020617;
color: #64748b;
margin-bottom: 14px;
}
button {
width: 100%;
padding: 10px;
border-radius: 10px;
border: none;
background: #22d3ee;
color: #020617;
font-weight: 600;
cursor: pointer;
margin-bottom: 16px;
}
.result {
list-style: none;
padding: 0;
}
.result li {
padding: 8px;
background: rgba(34, 211, 238, 0.08);
border-radius: 8px;
margin-bottom: 8px;
}
const inputKutusu = document.getElementById("veri-kutusu");
const btn = document.getElementById("kontrolBtn");
btn.addEventListener("click", ayarBilgisiOku);
function ayarBilgisiOku() {
// 1. Standart nitelik
const tip = inputKutusu.getAttribute("type");
// 2. Özel data-* niteliği
const maxKarakter = inputKutusu.getAttribute("data-max-karakter");
// 3. Boolean nitelik kontrolü
const devreDisiMi = inputKutusu.getAttribute("disabled") !== null;
document.getElementById("typeInfo").textContent = tip;
document.getElementById("maxInfo").textContent = maxKarakter;
document.getElementById("disabledInfo").textContent = devreDisiMi
? "Evet"
: "Hayır";
}
Nitelik Manipülasyonu Metotları element.removeAttribute(name)
element.removeAttribute(name) metodu, belirtilen niteliği bir elementten tamamen kaldırmak için kullanılır.
Bu metot, daha önce setAttribute ile eklenen veya doğrudan HTML içerisinde tanımlanan bir niteliği silerek, elementin temel HTML yapısında kalıcı bir değişiklik yapar.
İşlem başarıyla tamamlandığında, elementin DOM ağacındaki o niteliği temsil eden kaydı tamamen silinir; teknik olarak bu metot herhangi bir değer döndürmez.
Stratejik Kullanım AmacıBu metot, bir elementin üzerinde artık ihtiyaç duyulmayan davranışları ( disabled niteliğini gibi ) kaldırmak veya geçici kimlikleri ( id ) temizlemek için kullanılır.
Özellikle form öğelerinde, bazı niteliklerin sadece varlığı ( disabled , checked , required ) belirli bir durumu temsil eder; bu niteliği kaldırmak, elementin davranışını anında varsayılan aktif durumuna döndürür.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>removeAttribute Örneği</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="removeAttribute.css?v=1.0.150" />
</head>
<body>
<div class="card">
<h2>Form Gönderimi</h2>
<input type="text" placeholder="Mesajınız gönderiliyor..." disabled />
<button id="gonder-butonu" disabled>
Gönderiliyor...
</button>
<p class="info">
İşlem tamamlandığında form alanı tekrar etkinleşecektir.
</p>
</div>
<script src="removeAttribute.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
background: #f4f6f8;
min-height: 100vh;
display: grid;
place-items: center;
}
.card {
background: #ffffff;
padding: 24px;
width: 320px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0,0,0,0.08);
}
h2 {
margin-bottom: 16px;
font-size: 18px;
}
input {
width: 100%;
padding: 10px;
margin-bottom: 12px;
border-radius: 8px;
border: 1px solid #ccc;
}
input:disabled {
background: #f0f0f0;
}
button {
width: 100%;
padding: 10px;
border: none;
border-radius: 8px;
background: #4f46e5;
color: white;
font-weight: 600;
cursor: pointer;
}
button:disabled {
background: #a5b4fc;
cursor: not-allowed;
}
.info {
margin-top: 12px;
font-size: 13px;
color: #555;
}
const buton = document.getElementById("gonder-butonu");
const input = document.querySelector("input");
function islemiBitir() {
// 1. disabled niteliği var mı kontrol et
if (buton.hasAttribute("disabled")) {
// 2. Yapısal temizlik
buton.removeAttribute("disabled");
input.removeAttribute("disabled");
// 3. İçeriği ve durumu güncelle
buton.textContent = "Gönder";
input.placeholder = "Mesajınızı yazabilirsiniz";
}
}
// 3 saniye sonra işlemi tamamla
setTimeout(islemiBitir, 3000);
Düğüm Oluşturma ve Ekleme (Creating and Appending Nodes) Genel Bilgi
Düğüm Manipülasyonunun bu ileri aşaması, statik HTML dosyasında başlangıçta mevcut olmayan, tamamen yeni Düğümlerin programatik olarak yaratılmasını ve bunların mevcut DOM ağacına entegre edilmesini kapsar.
Bu süreç, JavaScript'in bir sayfayı dinamik olarak büyütme ve kullanıcı girdisine veya asenkron veri akışlarına göre anlık içerik inşa etme yeteneğinin kalbidir.
Felsefi Rol: Sürdürülebilirlik ve AdaptasyonBu metotların temel felsefi rolü, web sayfasının içeriğinin tarayıcıya gelen ilk HTML iskeletiyle sınırlı kalmamasını garanti altına almaktır.
Bir kullanıcı bir öğeye etkileşim verdiğinde, sunucudan bir veri listesi geldiğinde veya anlık bir "hata mesajı" gösterilmesi gerektiğinde, JavaScript bu metotları kullanarak içeriği önce bellek içinde kurgular.
Hazırlanan bu sanal yapı, ardından mevcut DOM ağacındaki uygun bir koordinata yerleştirilerek kullanıcının dünyasına dahil edilir.
Mimari Esneklik ve PerformansBu dinamik üretim yeteneği, uygulamayı pasif bir doküman olmaktan çıkarıp, anlık durumlara uyum sağlayan
Dinamik Bir Durum Makinesine dönüştürür.
Bu aşamada dikkat edilmesi gereken en kritik husus, her ekleme işleminin tarayıcıda bir Reflow / Repaint
tetikleyebileceği gerçeğidir.
Sonuç olarak, düğüm oluşturma ve ekleme disiplini, yazılımın ölçeklenebilirliğini artırırken, kullanıcı arayüzünün her zaman taze ve güncel kalmasını sağlayan temel teknolojik motordur.
Yeni Düğüm Oluşturma Metotları Genel Bilgi
Bir HTML elementini programatik olarak oluşturmak, onu mevcut DOM ağacına eklemekten teknik olarak tamamen ayrı ve bağımsız bir adımdır.
Sürecin ilk aşaması, elementin sadece bellekte yaratılmasıdır; bu kritik evrede element henüz tarayıcı ekranında fiziksel olarak yer almaz ve kullanıcı tarafından görülmez.
Bu iki aşamalı süreç, performans optimizasyonu açısından hayati bir öneme sahiptir; çünkü tarayıcının ağır işleyen
"render mekanizmasını" gereksiz yere tetiklemeden önce, yüzlerce düğümün hazırlığı bellek ortamında güvenle tamamlanabilir.
Programatik İçerik Üretimi ve HazırlıkJavaScript, bu yaratma metotlarını kullanarak statik HTML dosyasının sınırlarının dışına çıkar ve tamamen programatik olarak kontrol edilen dinamik içerikler üretir.
Oluşturulan bu düğümler, önce bellek ortamında mantıksal olarak birleştirilir, gerekli nitelikleri ( "attributes" ) atanır ve ancak yapısal olarak tamamen hazır hale geldiklerinde tarayıcıya eklenme komutu verilir.
Verimlilik: Sanal Hazırlık AlanıBellekte yapılan bu ön hazırlık, tarayıcı motorunun Reflow maliyetini minimize eden stratejik bir sanal hazırlık alanı görevi görür.
Sonuç olarak, düğüm oluşturma metotları, geliştiriciye içeriği kullanıcıya sunmadan önce üzerinde sınırsız manipülasyon yapabileceği
güvenli bir laboratuvar ortamı sunar.
Yeni Düğüm Oluşturma Metotları document.createElement(tagName)
document.createElement(tagName) metodu çağrıldığı anda, tarayıcının belleğinde elementin tüm yapısını temsil eden bir nesne yaratılır.
Bu nesne henüz DOM ağacına fiziksel olarak eklenmediği için sayfada görünür değildir; bu durum geliştiriciye, elementi kullanıcıya sunmadan önce üzerinde tam kontrol sahibi olacağı bir hazırlık alanı sunar.
Bu metot sadece elementin temel etiket yapısını oluşturur; ancak elementin nitelikleri ( class , id ) veya içeriği ( textContent ) daha sonra manuel olarak yapılandırılmalıdır.
Performans Stratejisi: Render VerimliliğiMetodun bu iki aşamalı yaklaşımı ( "yaratma ve ekleme" ), JavaScript performansını en üst düzeye çıkarır.
Element üzerinde yapılan tüm nitelik atamaları ve içerik değişiklikleri, tarayıcının ağır işleyen Render mekanizmasını tetiklemeden önce bellek içinde toplu olarak icra edilebilir.
Teknik Not: Düğüm Tipi ve KonfigürasyoncreateElement , teknik olarak saf bir Element Düğümü döndürür.
Bu düğüm, tipik olarak parentNode.appendChild() gibi bir yerleştirme metodu çağrılmadan önce nitelikleri, stilleri ve alt düğümleri ile tamamen yapılandırılmalıdır.
Bu titiz hazırlık aşaması, element DOM'a eklendiğinde tarayıcı motoruna ek Reflow maliyetleri yüklemesini önleyerek akıcı bir kullanıcı deneyimi sağlar.
Yeni Düğüm Oluşturma Metotları document.createTextNode(text)
document.createTextNode(text) metodu, DOM hiyerarşisi içerisinde sadece metin verisini barındıran yeni bir Metin Düğümü oluşturmak için kullanılır.
Bu metot, HTML'in etiket yapısını değil, doğrudan içeriğini temsil eden saf ve atomik düğümler yaratır.
Bu yaklaşım, metin verisini etiketi temsil eden Element düğümünden mantıksal olarak ayıran kritik bir DOM mimarisi prensibidir.
Teknik uygulama aşamasında genellikle document.createElement ile oluşturulan yapısal bir konteynerin içerisine, dinamik metin içeriği enjekte etmek amacıyla tercih edilir.
Güvenlik ve Veri Bütünlüğü: XSS KalkanıcreateTextNode ile oluşturulan tüm içerik, tarayıcı motoru tarafından asla HTML olarak ayrıştırılmaz.
Bu mekanizma, XSS saldırılarına karşı doğal ve sarsılmaz bir savunma hattı oluşturur. İçeriğe eklenen herhangi bir <script> veya HTML etiketi, tarayıcı tarafından sadece görsel bir metin olarak işlenir ve asla çalıştırılmaz.
Teknik Avantaj: Tahmin Edilebilir Veri AkışıHam ve güvenilirliği doğrulanmamış metin verilerini yönetirken bu metodu kullanmak, veri bütünlüğünü korumanın teknik olarak en güvenli yoludur.
Sonuç olarak createTextNode , veriyi görselleştirmekten ziyade onu bir mantıksal birim olarak DOM'a kazandıran, performansı ve güvenliği aynı potada eriten profesyonel bir araçtır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>removeAttribute Örneği</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="createElement.css?v=1.0.150" />
</head>
<body>
<div class="card">
<h2>Form Gönderimi</h2>
<input type="text" placeholder="Mesajınız gönderiliyor..." disabled />
<button id="gonder-butonu" disabled>
Gönderiliyor...
</button>
<p class="info">
İşlem tamamlandığında form alanı tekrar etkinleşecektir.
</p>
</div>
<script src="createElement.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
min-height: 100vh;
background: radial-gradient(circle at top, #0f172a, #020617);
display: grid;
place-items: center;
color: #e5e7eb;
}
.lab {
width: 420px;
padding: 24px;
background: #020617;
border-radius: 14px;
box-shadow: 0 40px 80px rgba(0, 0, 0, 0.7);
}
h2 {
margin-bottom: 16px;
font-size: 18px;
}
button {
width: 100%;
padding: 12px;
border-radius: 10px;
border: none;
background: #22c55e;
color: #022c22;
font-weight: 700;
cursor: pointer;
margin-bottom: 16px;
}
button:hover {
background: #16a34a;
}
.node-area {
display: grid;
gap: 10px;
}
.node {
padding: 10px 12px;
background: rgba(34, 197, 94, 0.1);
border-left: 4px solid #22c55e;
border-radius: 8px;
font-size: 14px;
}
const kapsayici = document.getElementById("kapsayici");
const btn = document.getElementById("ekleBtn");
let sayac = 1;
btn.addEventListener("click", () => {
// 1. Element düğümü oluşturulur (henüz DOM'da değil)
const yeniParagraf = document.createElement("p");
yeniParagraf.classList.add("node");
// 2. Saf metin düğümü oluşturulur
const metin = document.createTextNode(
`Bellekte oluşturulan düğüm #${sayac}`
);
// 3. Metin, elementin içine yerleştirilir
yeniParagraf.appendChild(metin);
// 4. Hazır yapı tek hamlede DOM'a eklenir
kapsayici.appendChild(yeniParagraf);
sayac++;
});
Yeni Düğüm Oluşturma Metotları document.createDocumentFragment() (Performans Optimizasyonu)
document.createDocumentFragment() metodu, DOM ağacının bir parçası olmayan, tamamen sanal ve hafif bir kapsayıcı oluşturur.
Fragment, tıpkı standart bir element gibi düğümleri barındırabilir ve appendChild veya insertBefore gibi metotlarla manipüle edilebilir; ancak gerçek DOM ağacında yer almadığı için bu aşamadaki hiçbir işlem tarayıcıda görsel bir değişiklik yaratmaz.
Bu özellik, geliştiriciye düğümleri bir araya getirebileceği, tarayıcı ekranından tamamen izole edilmiş geçici bir montaj alanı sunar.
Stratejik Avantaj: Reflow ve Repaint YönetimiGerçek DOM ağacına yapılan her doğrudan müdahale, tarayıcının maliyetli Layout ve Paint mekanizmalarını tetikler.
Onlarca düğümü bir döngü içerisinde tek tek DOM'a eklemek yerine, tüm yeni düğümleri önce Fragment içinde toplamak, bu render maliyetlerini bellek içinde izole eder.
Tek Seferlik Ekleme ve Mantıksal BoşalmaFragment içeriği hazırlandığında, tek bir appendChild(fragment) komutuyla gerçek DOM'a aktarılır. Bu sayede tarayıcı tüm toplu değişiklikleri tek bir paket olarak görür ve yalnızca bir kez hesaplama yapar.
Buradaki en kritik nüans, Fragment'ın kendisinin asla DOM ağacına dahil edilmemesidir; sadece içindeki düğümler hedef konuma yerleştirilir ve boşalan Fragment objesi bellekten otomatik olarak temizlenir.
Özetlemek gerekirse DocumentFragment, büyük ölçekli içerik güncellemelerinde tarayıcıya binen yükü hafifleten ve uygulamanın akıcılığını koruyan profesyonel bir mimari standarttır.
Düğüm Yerleştirme ve Kaldırma Metotları Genel Bilgi
Oluşturulan düğümleri belgede görünür hale getirmek veya mevcut bir düğümün konumunu değiştirmek/kaldırmak için kullanılan bu metotlar, bir elementin DOM ağacındaki ebeveyn-çocuk ilişkilerini yönetir.
Bu metotlar, genellikle hedef elementin parentNode özelliği üzerinden çağrılır ve hiyerarşinin dinamik olarak yeniden şekillendirilmesini sağlar.
Yaratma Sürecinin TamamlayıcısıBu aşama, Düğüm Yaratma ( createElement ) sürecinin doğal ve zorunlu bir devamıdır.
Bir düğüm bellekte yaratıldıktan sonra sayfada fiziksel olarak yer alması için mutlaka mevcut DOM ağacına bağlanmalıdır; aksi halde düğüm sadece bir bellek nesnesi olarak kalır ve kullanıcı tarafından görülemez.
İlişkisel Komutlar ve KonumlandırmaBu metotlar, DOM'un hiyerarşik ağaç yapısını koruyarak, bir elementin tam olarak nereye yerleşeceğini belirleyen temel
ilişkisel komutlardır.
İster listenin en sonuna ( "appending" ), ister spesifik bir öğenin hemen önüne ( "insertion" ) olsun, bu komutlar sayesinde hangi elementin hangi ebeveyne ait olduğu kesinlik kazanır.
Sonuç olarak düğüm yerleştirme metotları, bellekte hazırlanan parçaları bir araya getirerek web sayfasının yaşayan, bütünsel ve yapılandırılmış iskeletini inşa eder.
Düğüm Yerleştirme parentNode.appendChild(childNode)
parentNode.appendChild(childNode) metodu, belirtilen bir düğümü ( childNode ), hedef ebeveynin ( parentNode )
en son çocuğu olarak listeye dahil eder.
Bu metot, JavaScript ile dinamik olarak oluşturulan içeriği gerçek DOM ağacına dahil etmenin en temel ve en sık kullanılan yöntemidir.
Bir düğümün sayfa üzerinde fiziksel olarak görünür hale gelmesi için bu metot aracılığıyla mutlaka bir ebeveyne bağlanması teknik bir zorunluluktur.
Kritik Davranış: Otomatik Taşıma MekanizmasıMetodun en önemli karakteristik özelliği, otomatik taşıma yeteneğidir: Eğer eklenmeye çalışılan düğüm zaten DOM ağacının başka bir yerinde mevcutsa, appendChild onu eski konumundan otomatik olarak kaldırır ve yeni yerine nakleder.
Bu mekanizma, DOM'un "bir düğümün sadece tek bir ebeveyni olabilir" şeklindeki temel yapısal kuralını korur.
Ayrıca işlem sonucunda metot, eklediği düğümü bir referans olarak geri döndürür.
Stratejik Kullanım AmacıBu metot; dinamik listelere, kart gruplarına veya kapsayıcılara yeni öğeleri sıranın sonuna eklemek için tasarlanmıştır.
Yeni içerik oluşturulduğunda, onun doğal akış gereği kapsayıcının en sonuna eklenmesi gereken tüm senaryolarda en ideal çözümdür.
Düğüm Yerleştirme Metotları parentNode.insertBefore(newNode, referenceNode)
parentNode.insertBefore(newNode, referenceNode) metodu, yeni oluşturulan veya mevcut olan bir düğümü ( newNode ), hedef ebeveyn içerisinde belirtilen bir referans düğümden ( referenceNode ) hemen önce eklemek için kullanılır.
Bu metot, appendChild metodundan farklı olarak, eklenecek düğümün DOM ağacı üzerindeki konumunu milimetrik bir doğrulukla kontrol etme imkanı sunar.
Yeni düğümün yerleşeceği noktayı belirlemek için, onu takip edecek olan mevcut bir kardeş düğümü bir işaretçi olarak kullanırız; böylece elementleri listenin sadece sonuna değil, ağaç hiyerarşisinin herhangi bir noktasına yerleştirebiliriz.
Teknik Mekanizma ve Geri Dönüş DeğerireferenceNode parametresiyle işaret edilen düğüm, işlem tamamlandığında yeni düğümün hemen ardındaki kardeş düğüm konumuna geçer.
Teknik bir kural olarak, bu metot operasyon başarıyla sonuçlandığında eklenen newNode referansını geri döndürerek zincirleme işlemlere olanak tanır.
Stratejik Kullanım Amacı ve EsneklikBu metot; bir listeye yeni bir öğeyi sıralı bir konumda ( "listenin ortası veya başı gibi" ) eklemek veya mevcut bir elementin hemen üzerinde anlık bir uyarı mesajı tetiklemek istendiğinde kritik bir rol oynar.
Metodun sunduğu önemli bir esneklik şudur: Eğer referenceNode parametresi null olarak tanımlanırsa, insertBefore tıpkı appendChild gibi davranarak düğümü ebeveynin en sonuna ekler.
Sonuç olarak insertBefore, dinamik arayüzlerde sıralama ve "konumsal bütünlük" gerektiren karmaşık yerleştirme senaryoları için geliştirilmiş en güçlü DOM yerleştirme aracıdır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>DocumentFragment — Toplu Ekleme</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="documentFragment.css?v=1.0.150" />
</head>
<body>
<section class="panel">
<h2>Görev Havuzu (Fragment)</h2>
<button id="uretBtn">10 Görev Üret</button>
<ul id="gorevListesi" class="list">
<!-- Görevler buraya eklenecek -->
</ul>
</section>
<script src="documentFragment.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
background: #0f172a;
color: #e5e7eb;
min-height: 100vh;
display: grid;
place-items: center;
}
.panel {
width: 420px;
background: #020617;
padding: 24px;
border-radius: 14px;
}
h2 {
margin-bottom: 12px;
}
button {
width: 100%;
padding: 10px;
background: #38bdf8;
border: none;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
margin-bottom: 16px;
}
.list {
list-style: none;
padding: 0;
display: grid;
gap: 8px;
}
.list li {
padding: 8px 12px;
background: rgba(56, 189, 248, 0.12);
border-radius: 6px;
}
const btn = document.getElementById("uretBtn");
const liste = document.getElementById("gorevListesi");
btn.addEventListener("click", () => {
// 1. Sanal kapsayıcı (DOM dışı)
const fragment = document.createDocumentFragment();
for (let i = 1; i <= 10; i++) {
const li = document.createElement("li");
li.textContent = `Fragment Görevi #${i}`;
fragment.appendChild(li);
}
// 2. Tek hamlede gerçek DOM'a ekleme
liste.appendChild(fragment);
});
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>insertBefore — Baştan Ekleme</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css?v=1.0.150" />
</head>
<body>
<section class="panel">
<h2>Öncelikli Görevler</h2>
<button id="ekleBtn">Başa Görev Ekle</button>
<ul id="gorevler" class="priority-list">
<li id="ilk">Mevcut İlk Görev</li>
<li>Diğer Görev</li>
</ul>
</section>
<script src="script.js?v=1.0.150"></script>
</body>
</html>
body {
background: linear-gradient(145deg, #020617, #020617);
color: #e5e7eb;
font-family: system-ui, sans-serif;
display: grid;
place-items: center;
min-height: 100vh;
}
.panel {
width: 400px;
padding: 22px;
background: #020617;
border-radius: 12px;
}
button {
width: 100%;
padding: 10px;
background: #f97316;
border: none;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
margin-bottom: 14px;
}
.priority-list {
list-style: none;
padding: 0;
}
.priority-list li {
padding: 8px;
margin-bottom: 6px;
background: rgba(249, 115, 22, 0.12);
border-left: 4px solid #f97316;
}
const liste = document.getElementById("gorevler");
const ilkEleman = document.getElementById("ilk");
const btn = document.getElementById("ekleBtn");
let sayac = 1;
btn.addEventListener("click", () => {
const yeni = document.createElement("li");
yeni.textContent = `Yeni Öncelikli Görev #${sayac}`;
// Baştaki elemandan HEMEN ÖNCE ekle
liste.insertBefore(yeni, ilkEleman);
sayac++;
});
Düğüm Kaldırma Metotları parentNode.removeChild(childNode)
parentNode.removeChild(childNode) metodu, belirtilen bir alt düğümü ( childNode ), doğrudan bağlı olduğu ebeveynin ( parentNode ) çocuk listesinden kalıcı olarak çıkarmak için kullanılır.
Bu metot, bir düğümü sayfa üzerinde görünür olmaktan çıkarmak ve DOM hiyerarşisinden dışlamak için kullanılan en temel teknik yöntemdir.
Kritik Kural: Doğrudan Ebeveyn ZorunluluğuremoveChild metodunun uygulanmasında en sarsılmaz teknik kural, işlemin daima kaldırılacak düğümün doğrudan ebeveyni üzerinden çağrılması zorunluluğudur.
Eğer bu metot hiyerarşik olarak yanlış veya dolaylı bir ebeveyn üzerinden tetiklenirse, JavaScript motoru çalışma zamanı hatası verir.
Bellek Yönetimi ve Garbage CollectionKaldırılan bir düğüm DOM ağacında görünür olmaktan çıksa dahi, teknik olarak hala bellek içerisinde varlığını sürdürebilir.
Düğüm bellekten ancak ona atıfta bulunan tüm JavaScript referansları serbest bırakıldığında, sistemin Çöp Toplayıcı mekanizması tarafından tamamen temizlenir.
Stratejik Kullanım AmacıBu metot; bir listenin temizlenmesi, dinamik hata mesajlarının kapatılması veya bir öğenin geçici olarak DOM'dan çıkarılıp daha sonra tekrar kullanılmak üzere saklanması gereken senaryolarda kullanılır.
Tüm bunlara bakarsak removeChild, Dinamik Durum Yönetimi içerisinde artık ihtiyaç duyulmayan görsel parçaların sistemden güvenle ayıklanmasını sağlayan kritik bir temizlik aracıdır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<title>removeChild — Bellekte Saklama</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="removeChild.css?v=1.0.150" />
</head>
<body>
<section class="memory-panel">
<h2>Geçici Bildirim Alanı</h2>
<ul id="liste" class="notice-list">
<li>Kalıcı Bildirim</li>
<li id="silinecek" class="highlight">
Geçici Uyarı (Kaldırılacak)
</li>
<li>Diğer Bildirim</li>
</ul>
<button id="kaldirBtn">Uyarıyı Kaldır</button>
<button id="geriBtn" disabled>Uyarıyı Geri Getir</button>
</section>
<script src="removeChild.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: system-ui, sans-serif;
}
body {
min-height: 100vh;
background: linear-gradient(145deg, #020617, #111827);
display: grid;
place-items: center;
color: #e5e7eb;
}
.memory-panel {
width: 420px;
padding: 24px;
border-radius: 14px;
background: #020617;
box-shadow: 0 30px 80px rgba(0, 0, 0, 0.7);
}
h2 {
margin-bottom: 14px;
}
.notice-list {
list-style: none;
padding: 0;
margin-bottom: 16px;
}
.notice-list li {
padding: 10px 12px;
border-radius: 8px;
background: rgba(148, 163, 184, 0.08);
margin-bottom: 6px;
}
.notice-list .highlight {
background: rgba(239, 68, 68, 0.15);
border-left: 4px solid #ef4444;
}
button {
width: 100%;
padding: 10px;
border-radius: 10px;
border: none;
font-weight: 600;
cursor: pointer;
margin-bottom: 8px;
}
#kaldirBtn {
background: #ef4444;
color: #020617;
}
#geriBtn {
background: #22c55e;
color: #020617;
}
const liste = document.getElementById("liste");
const silinecekEleman = document.getElementById("silinecek");
const kaldirBtn = document.getElementById("kaldirBtn");
const geriBtn = document.getElementById("geriBtn");
let saklananEleman = null;
kaldirBtn.addEventListener("click", () => {
// Güvenlik: doğrudan ebeveyn üzerinden kaldırma
if (silinecekEleman && silinecekEleman.parentNode === liste) {
saklananEleman = liste.removeChild(silinecekEleman);
console.log("DOM'dan kaldırıldı.");
console.log("Bellekte saklanan içerik:", saklananEleman.textContent);
kaldirBtn.disabled = true;
geriBtn.disabled = false;
}
});
geriBtn.addEventListener("click", () => {
if (saklananEleman) {
// Aynı düğüm tekrar DOM'a eklenir
liste.appendChild(saklananEleman);
saklananEleman = null;
kaldirBtn.disabled = false;
geriBtn.disabled = true;
}
});
Düğüm Kaldırma Metotları parentNode.replaceChild(newChild, oldChild)
parentNode.replaceChild(newChild, oldChild) metodu, mevcut bir alt düğümü ebeveyn hiyerarşisinden kaldırarak, onun tam olarak kapladığı koordinata yeni bir düğüm ( newChild ) yerleştirir.
Bu metot, teknik olarak kaldırma ( removeChild ) ve ekleme ( appendChild/insertBefore ) operasyonlarını tek bir atomik işlemde birleştiren oldukça güçlü bir DOM manipülasyon aracıdır.
Render Verimliliği ve Görsel KararlılıkBu yöntemin en büyük avantajı, değişim sırasında oluşabilecek görsel titreme riskini minimize etmesidir.
Tarayıcının Layout / Render mekaniği üzerindeki işlem maliyetini tek bir olaya indirgeyerek, iki ayrı işlem yerine tek bir hesaplama döngüsüyle arayüzün güncellenmesini sağlar.
Dönüş Değeri ve Bellek YönetimiMetot, işlem sonunda sistemden çıkarılan eski düğümü ( oldChild ) geri döndürür; bu sayede kaldırılan düğüm tamamen yok edilmek yerine bellekte saklanabilir veya uygulamanın başka bir bölümünde yeniden kullanılabilir.
Stratejik Kullanım AmacıBu metot; mevcut bir arayüz bileşenini, bir "yükleme göstergesini" veya geçici bir statü mesajını, asıl içerik hazır olduğunda doğrudan onunla değiştirmek için idealdir.
Nesnelerin DOM içerisinde yer değiştirmeden güncellenmesi için güvenli, verimli ve mimari açıdan tutarlı bir çözüm sunar.
Sonuç olarak replaceChild, DOM ağacının yapısal bütünlüğünü bozmadan içerik dönüşümü gerçekleştiren profesyonel bir arayüz yönetim operatörüdür.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>DOM API — replaceChild Operasyonu</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="replaceChild.css?v=1.0.150">
</head>
<body>
<div class="container">
<h2>Veri Akışı</h2>
<div id="display-frame" class="frame">
<div id="loader" class="skeleton">
<div class="spinner"></div>
<p>Veriler senkronize ediliyor...</p>
</div>
</div>
<button id="update-btn">İçeriği Yayına Al</button>
</div>
<script src="replaceChild.js?v=1.0.150"></script>
</body>
</html>
* {
box-sizing: border-box;
font-family: 'Inter', system-ui, sans-serif;
}
body {
background: #020617;
color: #e2e8f0;
display: grid;
place-items: center;
min-height: 100vh;
margin: 0;
}
.container {
width: 360px;
text-align: center;
}
.frame {
background: #0f172a;
border: 1px solid #1e293b;
border-radius: 12px;
padding: 24px;
margin-bottom: 20px;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
}
/* Skeleton/Loader Stili */
.skeleton {
color: #94a3b8;
}
.spinner {
width: 30px;
height: 30px;
border: 3px solid rgba(34, 211, 238, 0.1);
border-top-color: #22d3ee;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 12px;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* Yeni Gelecek İçerik Stili */
.content-node {
animation: fadeIn 0.4s ease-out;
}
.content-node h3 {
color: #22d3ee;
margin: 0 0 8px 0;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
button {
background: #22d3ee;
color: #020617;
border: none;
padding: 12px 24px;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
}
button:hover {
background: #0ea5e9;
box-shadow: 0 0 15px rgba(34, 211, 238, 0.4);
}
const frame = document.getElementById("display-frame");
const loader = document.getElementById("loader");
const btn = document.getElementById("update-btn");
function icerigiDonustur() {
// 1. Yeni Düğüm Oluşturma (newChild)
const newContent = document.createElement("div");
newContent.className = "content-node";
newContent.innerHTML = `
<h3>İşlem Başarılı</h3>
<p>Veri paketi atomik olarak değiştirildi.</p>
`;
// 2. replaceChild Operasyonu (Atomik Değişim)
// parentNode.replaceChild(newChild, oldChild)
const removedNode = frame.replaceChild(newContent, loader);
// 3. Dönüş Değeri ve Bellek Yönetimi
// Kaldırılan düğüm (loader) tamamen silinmez, removedNode değişkeninde saklanır.
console.log("DOM'dan kaldırılan düğüm:", removedNode);
// Butonu etkisizleştir
btn.disabled = true;
btn.textContent = "Değişim Tamamlandı";
}
btn.addEventListener("click", icerigiDonustur);
Olay Dinleyicileri (Event Listeners) Olayları Dinleme ve Yanıt Verme
Web sayfalarını dinamik ve etkileşimli hale getirmenin en stratejik yolu, kullanıcıların veya tarayıcının belirli eylemlerine
anlık tepki verebilme yeteneğidir.
Olay Dinleyicileri (Event Listeners), JavaScript kodunu dış veya iç tetikleyicilere bağlayan, DOM içerisindeki temel iletişim mekanizmasıdır.
Bu yapı, sayfanın pasif bir görüntüleyici olmaktan çıkıp, kullanıcının girdisini saniyeler içinde işleyebilen profesyonel bir
etkileşim motoruna dönüşmesini sağlar.
Asenkron Mesajlaşma ve Algılama KapasitesiOlaylar, tarayıcı ile JavaScript arasındaki asenkron mesajlaşma sistemidir.
Bu mekanizma sayesinde sistem; kullanıcı tıklamalarını, klavye girdilerini, fare hareketlerini veya sayfanın kritik "yüklenme durumlarını" algılayarak önceden tanımlanmış mantıksal yanıtlara dönüştürür.
Olay yönetimi, DOM manipülasyonu kadar hayati olup, web uygulamasının kullanıcıyla kurduğu diyaloğun sarsılmaz temelini oluşturur.
Modern Standart: element.addEventListener()Modern web geliştirme disiplini, eski nesil HTML nitelikleri ( onclick gibi ) yerine, çok daha esnek ve güçlü olan element.addEventListener() metodunu standart kabul eder.
Bu metot, tek bir elemente aynı olay türü için birden fazla işleyici bağlamaya, olayın DOM ağacındaki Yayılımını kontrol etmeye ve performans seçeneklerini ( passive: true gibi ) optimize etmeye olanak tanır.
Sonuç olarak olay dinleyicileri, kullanıcı deneyimini (UX) şekillendiren, kodun temiz ve sürdürülebilir kalmasını sağlayan en önemli JavaScript köprüleridir.
Olay Dinleyicisi Ekleme element.addEventListener()
element.addEventListener() metodu, JavaScript'te bir elemente olay işleyici eklemenin modern, esnek ve endüstri tarafından en çok önerilen yöntemidir.
Bu metot, eski nesil DOM Event Modeli'nin ( element.onclick = function(){...} ) en büyük dezavantajı olan
"tek bir işleyiciye hapsolma" sınırlamasını tamamen ortadan kaldırır.
Geliştiriciye; olayın türü, elementin hiyerarşik konumu ve tarayıcının performans durumu üzerinde detaylı kontrol imkanı sağlayan
üç parametreli bir sözleşme sunar.
Çoklu İşlevsellik ve BağımsızlıkBu metodun sağladığı en büyük üstünlüklerden biri, aynı elemente aynı olay türü ( click gibi ) için
istediğiniz kadar bağımsız işlevsellik eklemenize izin vermesidir.
Bu sayede, farklı JavaScript dosyalarından gelen mantıksal bloklar birbirinin üzerine yazılmadan, aynı tetikleyiciye paralel olarak yanıt verebilir.
Dinamik Yönetim ve Kaynak OptimizasyonuaddEventListener() , eşleniği olan removeEventListener() metodu ile birlikte kullanıldığında, karmaşık uygulamalarda
kaynak sızıntılarını önlemek için kritik bir rol oynar.
Olay işleyicilerini ihtiyaca göre dinamik olarak ekleyip kaldırma yeteneği, tarayıcı belleğinin verimli kullanılmasını ve uygulamanın
uzun vadeli stabilitesini garanti altına alır.
Özet olarak bu metot, sadece bir "tıklama algılayıcı" değil, modern web uygulamalarının kullanıcıyla kurduğu karmaşık diyaloğu yöneten
merkezi bir kontrol kulesidir.
Söz Dizimi ve Üstünlüğü element.addEventListener(event, listener)
addEventListener metodu, olay yönetimini rastgele niteliklerden kurtarıp merkezi bir yapıya taşır .
Bu metodun profesyonel standartlardaki tam söz dizimi şu şekildedir: element.addEventListener(event, handler, options) .
Burada "event" olayın türünü ( click, input vb. ), "handler" tetiklenecek fonksiyonu, "options" ise olayın yayılımı ve performansı hakkındaki ek ayarları temsil eder.
Modüler Mimari: Çoklu Dinleyici GücüEski yöntemlerin aksine bu metot, tek bir elemente aynı olay türü için birden fazla ve birbirinden tamamen bağımsız dinleyici eklemenize imkan tanır.
Bu özellik, modüler programlamada farklı kod bloklarının aynı elemente müdahale etmesini sağlar; böylece eski yöntemlerin yarattığı tek işleyici kısıtlaması tamamen ortadan kalkar.
Separation of Concerns: Sorumlulukların Net AyrımıaddEventListener kullanımı, HTML iskeleti ile dinamik davranışları birbirinden keskin bir şekilde ayırır.
Separation of Concerns olarak bilinen bu prensip, kodun okunabilirliğini artırır ve bakım sürecini kolaylaştırır.
Olayların HTML yapısından tamamen bağımsızlaştırılması; stil ( CSS ) , yapı ( HTML ) ve davranış ( JS ) katmanları arasında profesyonel bir sınır çizer.
Yaşam Döngüsü ve Dinamik YönetimBu metot, removeEventListener() ile koordineli çalışarak, olay işleyicilerini uygulamanın yaşam döngüsü boyunca dinamik olarak yönetme esnekliği sunar.
İhtiyaç duyulmayan olayların kaldırılması, "kaynak sızıntılarını" önlemek açısından hayati bir öneme sahiptir.
Olay Türü (event) Parametre 1
Olay Türü (event), dinlenecek eylemin adını belirten ve metodun çalışması için girilmesi zorunlu olan bir string değeridir.
Bu parametre, tarayıcıya "Hangi spesifik kullanıcı eylemini veya sistem değişikliğini takip etmeliyim?" sorusunun yanıtını verir.
Adlandırma Kuralı ve Yalınlık StandartıModern DOM API standartlarında olay adlarının başına "on" ön eki getirilmez.
Örneğin: Eski yapılardaki onclick yerine sadece click kullanılır.
Bu yalın adlandırma disiplini, metodun dilin doğal bir parçası gibi hissettirilmesini sağlar ve onu eski, nitelik tabanlı
yöntemlerden teknik olarak ayırır.
Geniş Kapsam ve Etkileşim ÇeşitliliğiBu parametre; fare hareketleri ( mousemove ), klavye girdileri ( keydown ), form etkileşimleri ( submit ) ve dokunmatik ekran eylemleri gibi yüzlerce farklı durumu kapsar.
Click gibi doğrudan kullanıcı eylemlerinden, load veya scroll gibi tarayıcı durum değişikliklerine kadar tüm dinamik tetikleyiciler bu dize üzerinden tanımlanır.
Sonuç olarak, olay kataloğunun sunduğu bu muazzam genişlik, modern web uygulamalarının karmaşık ve zengin etkileşim ihtiyaçlarını karşılayan
evrensel bir standart oluşturur.
Olay Türü (event) Parametre 2
Olay İşleyici , takip edilen olay gerçekleştiği anda tarayıcı tarafından tetiklenecek olan
geri çağırma fonksiyonudur ( "callback function" ).
Bu parametre, kullanıcının eylemine verilecek olan "mantıksal yanıtı" tanımlar ve arayüzdeki değişikliği asıl gerçekleştiren komutlar bütününü barındırır.
Otomatik Argüman: Event Objesinin RolüOlay tetiklendiğinde, tarayıcı bu fonksiyona otomatik olarak zengin bir Event Objesi
( genellikle "e " veya "event" olarak adlandırılır ) argüman olarak iletir.
Bu obje; olayın türü, gerçekleşme zamanı, fare koordinatları ve hangi tuşa basıldığı gibi kritik bilgiler sunar.
Ayrıca, olayın varsayılan davranışını iptal etme ( event.preventDefault() ) veya yayılımını durdurma ( event.stopPropagation() ) gibi kontrol metotlarını da beraberinde getirir.
Teknik Nüans: This Bağlamı (Context)Fonksiyonun tipi, this anahtar kelimesinin neyi işaret edeceğini belirler: Geleneksel fonksiyonlarda ( "function() {}" ), this doğrudan olayın eklendiği elementi temsil eder.
Modern ok fonksiyonlarında ( "() => {}" ) ise this , tanımlandığı dış kapsamın bağlamını korur.
Bu durum, özellikle sınıf tabanlı mimarilerde ve bileşenlerde daha öngörülebilir sonuçlar üretir.
Sonuç olarak, ikinci parametre sadece bir kod bloğu değil, olayın tüm verisini işleyen ve arayüzü canlı bir organizmaya dönüştüren anahtar bileşendir.
Ayarlar (options) ve Olay Akışı Parametre 3
Ayarlar parametresi, bir olay dinleyicisinin davranışını standart ayarların ötesine taşıyan, isteğe bağlı bir konfigürasyon objesidir.
Bu parametre, özellikle olayın DOM ağacında nasıl yakalanacağını ve performansını doğrudan etkileyecek ince ayarları yönetmeyi sağlar.
Basit bir "tıklama gerçekleşti" bilgisinin ötesine geçerek, olay tetiklendiğinde tarayıcı motorunun bu sinyali
hangi hiyerarşik aşamada işleyeceğini belirleyen bir kontrol mekanizmasıdır.
Olay Akışı: Aşağı İniş ve Yukarı Çıkış YönetimiOptions parametresi sayesinde geliştirici, olayın DOM ağacında Capturing ( aşağı inerken ) veya
Bubbling ( yukarı çıkarken ) aşamalarından hangisinde yakal anacağını belirleyebilir.
Bu hiyerarşik tercih, iç içe geçmiş elementlerdeki olayların birbirini nasıl etkileyeceğini yönetmek ve karmaşık olay delegasyonu
senaryolarını kurgulamak için hayati önem taşır.
Performans ve Mobil Deneyim OptimizasyonuBu parametre, geliştiriciye yalnızca işlevsellik değil, aynı zamanda tarayıcı performansı üzerinde derinlemesine mimari kontrol sunar.
Örneğin, passive: true seçeneği kullanılarak, özellikle mobil cihazlardaki "kaydırma " deneyimini yavaşlatan engellemeler devre dışı bırakılabilir ve pürüzsüz bir arayüz akışı sağlanabilir.
Sonuç olarak options , modern JavaScript uygulamalarında hem olay hiyerarşisini düzenleyen hem de "donanım hızlandırmalı" bir kullanıcı deneyimi sağlayan kritik bir ayar setidir.
Olay Akışı (Event Flow) Yakalama ve Kabarcıklanma
Bir elementte ( bir buton gibi ) olay tetiklendiğinde, bu sinyal sadece o elementle sınırlı kalmaz; oluşan olay DOM ağacı boyunca hiyerarşik bir yol izleyerek yayılmaya başlar.
Bu yayılım süreci, tarayıcı motoru tarafından yönetilen ve olay yönetiminin temelini oluşturan iki ana aşamadan meydana gelir.
1. Yakalama (Capturing): Yukarıdan Aşağıya İnişYakalama aşamasında olay, en üstteki window objesinden başlayarak DOM ağacı boyunca hedef elemente doğru adım adım aşağı iner.
2. Kabarcıklanma (Bubbling): Aşağıdan Yukarıya ÇıkışKabarcıklanma aşamasında ise olay, hedef elementte işlendikten sonra, tekrar document ve window objelerine doğru yukarı çıkar.
Bu hareket, suyun altındaki bir hava kabarcığının yüzeye çıkmasına benzer bir hiyerarşik seyir izler.
Capture Ayarı ve Dinleme Zamanlamasıcapture: true konfigürasyonu, dinleyicinin olayı henüz Yakalama Aşamasındayken yakalamasını sağlar.
Bu ayar varsayılan olarak false kabul edilir; yani standart dinleyiciler olayı olgunlaştığı Kabarcıklanma Aşamasında takip eder.
Stratejik Kullanım AlanıBu ayar, olay yayılımını alt elementlerdeki dinleyiciler tetiklenmeden önce durdurmak veya merkezi bir Olay Delegasyonu yapısı kurmak istendiğinde profesyonel bir kontrol aracı olarak kullanılır.
Performans Optimizasyonu passive Seçeneği
passive: true konfigürasyonu, modern tarayıcılarda özellikle kaydırma ve dokunmatik olayları için performansı maksimize etmek amacıyla kullanılan stratejik bir ayardır.
Bu ayar, kullanıcı etkileşimi ile tarayıcının görsel tepkisi arasındaki sürtünmeyi azaltarak, uygulamanın daha çevik ve pürüzsüz hissedilmesini sağlar.
Teknik Sorun: Bekleme ve Gecikme (Jank)Tarayıcılar, bir touchstart veya wheel olay işleyicisi tetiklendiğinde, bu fonksiyonun kaydırmayı durdurmak için event.preventDefault() komutunu çağırıp çağırmayacağını önceden bilemezler.
Bu belirsizlik nedeniyle tarayıcı, kaydırma işlemini fiziksel olarak başlatmadan önce JavaScript işleyicisinin tamamlanmasını bekler.
Bu bekleme süresi, özellikle işlemci gücü sınırlı olan mobil cihazlarda Jank ( takılma/atlama ) adı verilen can sıkıcı gecikmelere yol açar.
Çözüm: Tarayıcıya Verilen Performans GüvencesiGeliştirici, passive: true ayarını kullanarak tarayıcıya şu teknik güvenceyi verir:
"Bu dinleyici asla preventDefault() metodunu çağırmayacak, kaydırma işlemini başlatmak için beni bekleme."
Bu beyan sayesinde tarayıcı motoru, JavaScript kodunun bitmesini beklemeden kaydırma işlemini anında başlatır.
Bu paralel işlem yeteneği, kaydırma akıcılığını gözle görülür şekilde artırır.
Sonuç olarak passive seçeneği, modern web standartlarında yüksek performanslı ve kullanıcı odaklı arayüzler inşa etmek için vazgeçilmez bir optimizasyon parametresidir.
Diğer Kullanışlı Ayarlar once Seçeneği
once: true konfigürasyonu, bir olay dinleyicisinin tanımlanan görevi yalnızca bir kez yerine getirdikten sonra otomatik olarak sistemden kaldırılmasını sağlar.
Bu ayar, geliştiricinin manuel olarak removeEventListener() metodunu çağırma zorunluluğunu ortadan kaldırarak kod karmaşıklığını azaltır.
Teknik olarak bu, olayı dinleyen fonksiyona ait bellek referanslarının anında serbest bırakılmasını garanti eden ve "kaynak sızıntılarını" önleyen yerleşik bir akıllı temizlik mekanizmasıdır.
Stratejik Kullanım Alanı ve GüvenilirlikBu parametre, mantıksal olarak yalnızca bir kez gerçekleşmesi gereken eylemler için en ideal çözümdür.
Örneğin: Bir tanıtım mesajını ilk tıklamada gizlemek, bir başlangıç animasyonunu tetiklemek veya kullanıcının bir butona yaptığı o kritik
"ilk etkileşimi" yakalamak gibi senaryolarda kullanılır.
Dinamik Bileşen Yönetimionce ayarı, özellikle dinamik olarak yüklenen ve işi bittiğinde DOM'dan kaldırılan bileşenlerin ( modal pencereler, uyarı kutuları ) olay yönetimini basitleştirir.
Geliştiriciyi olayı sürekli takip etme ve manuel temizlik yapma yükünden kurtararak, kaynak yönetiminde sarsılmaz bir güvenilirlik sağlar.
Sonuç olarak bu seçenek, JavaScript motoruna "bu etkileşim miadını doldurdu" mesajını ileten, hem performans dostu hem de mimarisi temiz bir otomasyon aracıdır.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Fonksiyonel Ayrım ve Çoklu Dinleyici Gücü</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="addEventListener.css?v=1.0.150">
</head>
<body>
<div class="interaction-card">
<h3>Sistem Girişi</h3>
<button id="auth-trigger" class="primary-btn">Oturum Aç</button>
<div class="logs">
<p id="ui-log">Durum: Bekleniyor</p>
<p id="security-log">Güvenlik: İzlenmiyor</p>
</div>
</div>
<script src="addEventListener.js?v=1.0.150"></script>
</body>
</html>
/* CSS - Modern Minimalist Stil */
.interaction-card {
background: #0f172a;
padding: 2rem;
border-radius: 1rem;
border: 1px solid #1e293b;
color: #f8fafc;
width: 300px;
}
.primary-btn {
background: #3b82f6;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
cursor: pointer;
width: 100%;
font-weight: 600;
}
.logs {
margin-top: 1rem;
font-family: monospace;
font-size: 0.8rem;
}
#ui-log {
color: #38bdf8;
}
#security-log {
color: #fb7185;
}
// JavaScript - Çoklu İşlevsellik
const btn = document.getElementById("auth-trigger");
// Dinleyici 1: Arayüz Güncelleme Mantığı (UI Modülü)
btn.addEventListener("click", () => {
document.getElementById("ui-log").textContent = "Durum: İşleniyor...";
});
// Dinleyici 2: Güvenlik Kaydı Mantığı (Security Modülü)
// Aynı 'click' olayına müdahale eder, önceki kodu silmez.
btn.addEventListener("click", (e) => {
const time = new Date().toLocaleTimeString();
document.getElementById("security-log").textContent =
`Güvenlik: İstek atıldı (${time})`;
});
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Olay Akışı ve Yayılım Kontrolü (Event Flow)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="eventCaptureBubbling.css?v=1.0.150">
</head>
<body>
<section class="event-lab">
<div class="header">
<h3>Event Flow Analyzer</h3>
<p>Katmanlara tıklayarak yayılımı gözlemleyin</p>
</div>
<div id="capture-zone" class="layer outer-layer">
<span class="label">Ebeveyn Katman (Outer)</span>
<div id="target-zone" class="layer inner-layer">
<span class="label">Hedef Düğüm (Target)</span>
<div class="pulse-core"></div>
</div>
</div>
<div id="flow-log" class="console-output">
Olay akışı bekleniyor...
</div>
</section>
<script src="eventCaptureBubbling.js?v=1.0.150"></script>
</body>
</html>
:root {
--bg-color: #020617;
--outer-border: #1e293b;
--inner-bg: #3b82f6;
--accent-cyan: #22d3ee;
}
.event-lab {
background: var(--bg-color);
padding: 2rem;
border-radius: 1.5rem;
border: 1px solid var(--outer-border);
width: 100%;
max-width: 450px;
color: #f8fafc;
}
.header h3 {
margin: 0;
color: var(--accent-cyan);
}
.header p {
font-size: 0.85rem;
color: #64748b;
margin-bottom: 2rem;
}
/* Katman Tasarımları */
.layer {
border-radius: 1rem;
padding: 2.5rem 1.5rem;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: crosshair;
position: relative;
}
.outer-layer {
background: rgba(30, 41, 59, 0.5);
border: 2px dashed #475569;
}
.inner-layer {
background: var(--inner-bg);
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 10px 25px rgba(59, 130, 246, 0.4);
margin-top: 1rem;
}
.label {
position: absolute;
top: 8px;
left: 12px;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.7;
}
/* Animasyonlu Çekirdek */
.pulse-core {
width: 12px;
height: 12px;
background: white;
border-radius: 50%;
margin: 0 auto;
box-shadow: 0 0 15px white;
}
/* Log Ekranı */
.console-output {
margin-top: 1.5rem;
background: #000;
padding: 1rem;
border-radius: 0.5rem;
font-family: 'Fira Code', monospace;
font-size: 0.8rem;
color: #10b981;
border: 1px solid #064e3b;
}
const outer = document.getElementById("capture-zone");
const inner = document.getElementById("target-zone");
const log = document.getElementById("flow-log");
function updateLog(phase, element) {
const timestamp = new Date().getMilliseconds();
log.innerHTML =
`<span style="color: #22d3ee;">[${timestamp}ms]</span>
${phase} aşamasında <strong>${element}</strong> tetiklendi.<br>` +
log.innerHTML;
}
// 1. CAPTURING AŞAMASI (Yukarıdan Aşağıya)
// Üçüncü parametre true olduğu için olay aşağı inerken yakalanır.
outer.addEventListener(
"click",
() => {
updateLog("CAPTURE", "OUTER");
outer.style.borderColor = "#22d3ee";
setTimeout(() => (outer.style.borderColor = "#475569"), 500);
},
true,
);
// 2. BUBBLING AŞAMASI (Aşağıdan Yukarıya)
// Üçüncü parametre verilmediği için (false) olay yukarı çıkarken yakalanır.
inner.addEventListener("click", (e) => {
updateLog("TARGET/BUBBLE", "INNER");
// e.stopPropagation(); // Mühendislik Notu: Bu aktifleşirse Outer-Bubbling çalışmaz.
});
outer.addEventListener(
"click",
() => {
updateLog("BUBBLING", "OUTER");
},
false,
);
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Akıllı Temizlik ve Tek Seferlik Etkileşim (Options)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="eventCaptureBubbling2.css?v=1.0.150">
</head>
<body>
<section class="activation-panel">
<div class="header">
<i class="fas fa-shield-alt"></i>
<h3>Güvenli Aktivasyon</h3>
<p>Sistemi başlatmak için tek seferlik doğrulama gereklidir.</p>
</div>
<div id="status-box" class="status-display">
<span class="pulse-icon"></span>
<span id="status-text">Sistem Beklemede</span>
</div>
<button id="activate-btn" class="action-btn">
Lisansı Doğrula
</button>
<div class="info-footer">
* Bu işlem tamamlandığında olay dinleyicisi bellekten otomatik temizlenir.
</div>
</section>
<script src="eventCaptureBubbling2.js?v=1.0.150"></script>
</body>
</html>
.activation-panel {
background: #020617;
border: 1px solid #1e293b;
padding: 2rem;
border-radius: 1rem;
width: 100%;
max-width: 380px;
text-align: center;
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5);
}
.header h3 {
color: #f8fafc;
margin: 0.5rem 0;
}
.header p {
font-size: 0.8rem;
color: #64748b;
margin-bottom: 1.5rem;
}
.status-display {
background: rgba(30, 41, 59, 0.5);
border: 1px solid #334155;
padding: 1rem;
border-radius: 0.5rem;
margin-bottom: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.pulse-icon {
width: 10px;
height: 10px;
background: #f59e0b;
border-radius: 50%;
box-shadow: 0 0 10px #f59e0b;
}
#status-text {
font-family: 'Fira Code', monospace;
font-size: 0.9rem;
color: #f1f5f9;
}
.action-btn {
width: 100%;
background: #4f46e5;
color: white;
border: none;
padding: 0.8rem;
border-radius: 0.5rem;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
.action-btn:hover {
background: #6366f1;
}
.action-btn:disabled {
background: #1e293b;
color: #475569;
cursor: not-allowed;
}
.info-footer {
margin-top: 1rem;
font-size: 0.7rem;
color: #475569;
}
// Element referanslarını alalım
const btn = document.getElementById("activate-btn");
const statusText = document.getElementById("status-text");
const statusBox = document.querySelector(".status-display");
// { once: true } konfigürasyonu:
// Metot bir kez çalıştıktan sonra tarayıcı tarafından bellekten otomatik silinir.
btn.addEventListener(
"click",
() => {
// 1. Durum güncellemesi
statusText.textContent = "SİSTEM AKTİF";
statusText.style.color = "#10b981";
// 2. Butonu görsel olarak devre dışı bırakalım
btn.disabled = true;
btn.textContent = "Aktivasyon Başarılı";
// 3. Teknik çıktı
console.log(
"Lisans doğrulandı. Olay dinleyicisi otomatik olarak temizlendi.",
);
},
{ once: true },
);
İleri Performans ve Tarayıcı Optimizasyonu Performans Optimizasyonu ve Tarayıcı Optimizasyonu
DOM manipülasyonu ve olay dinleyicileri web sayfalarına etkileşim gücü verse de, bu işlemlerin tarayıcı motoru üzerinde ciddi bir işlem maliyeti vardır.
Bu bölüm, bir web uygulamasının akıcı, hızlı ve kaynak dostu kalması için her geliştiricinin derinlemesine kavraması gereken
ileri düzey performans mekaniklerini ele alır.
Temel DOM API metotlarını kullanmak teknik olarak kolaydır; ancak bilinçsizce yapılan her yapısal veya stil değişikliği, tarayıcının
"Render Mekanizmasını" gereksiz yere tetikleyebilir.
Jank ve Görsel Takılmaların KaynağıGereksiz render tetiklemeleri, özellikle düşük donanımlı cihazlarda veya sık tekrarlanan olaylarda uygulamanın yavaşlamasına ve Jank olarak bilinen deneyim kusurlarına yol açar.
İleri seviye DOM yönetimi, sadece doğru metodu seçmek değil, aynı zamanda tarayıcı motoruna en az işi yaptırma felsefesine dayanır.
Bu, kodun sadece "çalışmasını" değil, "verimli çalışmasını" hedefler.
Reflow ve Repaint: Performansın İki KatiliJavaScript'in tarayıcıyla kurduğu iletişimde her zaman Reflow ve Repaint maliyetleri göz önünde bulundurulmalıdır.
Bu mühendislik yaklaşımı, uygulamanın her karesinin pürüzsüz akmasını sağlar ve donanım kaynaklarını optimize ederek pil ömründen işlemci yüküne kadar her noktada pozitif bir etki yaratır.
Render Maliyetleri ve Optimizasyon İhtiyacı Genel Bilgi
Bu aşama, DOM manipülasyonunun tarayıcının geometri ve çizim hesaplamalarını nasıl doğrudan etkilediğini ve optimizasyon ihtiyacının teknik kökenlerini açıklar.
Her bir DOM değiştirme işlemi, tarayıcıyı Render İşlem Hattı'nı en baştan veya belirli bir aşamadan itibaren yeniden çalıştırmaya zorlar.
Bu durum, özellikle karmaşık sayfa yapılarında CPU ve GPU üzerinde ani ve yoğun bir hesaplama yükü yaratır.
16 Milisaniye Kuralı: 60 FPS HedefiModern web standartları, insan gözünün pürüzsüz bir hareket algılaması için saniyede 60 kare ( "60 FPS" ) hızını temel hedef olarak belirlemiştir.
Bu matematiksel hedef, tarayıcının her bir kareyi oluşturmak için sadece 16.6 milisaniye gibi kısıtlı bir süreye sahip olduğu anlamına gelir.
Bilinçsizce yapılan stil güncellemeleri veya yapısal DOM değişiklikleri, bu kritik süreyi kolaylıkla aşarak sayfanın takılmasına ve görsel kalitenin ciddi şekilde düşmesine neden olur.
Mühendislik Vizyonu: Verimli Talimat MimarisiOptimizasyon ihtiyacı, sadece "daha hızlı çalışan fonksiyonlar" yazmak değildir; asıl mesele tarayıcı motoruna en az ve en verimli talimatları verme mimarisini benimsemektir.
Geliştiricinin her müdahalesi, tarayıcıya ek bir "hesaplama borcu" çıkarır. Bu borcu yönetmek, uygulamanın uzun vadeli başarısı ve kullanıcı memnuniyeti için hayati bir zorunluluktur.
Özet ile render optimizasyonu, yazılımın donanımla olan uyumunu sağlayan ve kullanıcı deneyimini saniyelerle değil, milisaniyelerle koruyan bir hassas mühendislik disiplinidir.
Reflow (Layout) Geometrik Yeniden Hesaplama
Reflow, bir elementin boyutunun, konumunun veya fiziksel yerleşiminin değiştiği durumlarda tarayıcının başlattığı en kapsamlı ve en ağır süreçtir.
Bir elementin width , height, margin, padding veya font-size gibi geometrik yapısını etkileyen herhangi bir özelliği değiştiğinde, tarayıcı sadece o elementi değil, bu değişimden etkilenen tüm sayfadaki diğer elementlerin nereye yerleşeceğini en baştan hesaplamak zorunda kalır.
Maliyet Analizi: En Ağır OperasyonTeknik olarak Reflow, Render işlem hattındaki en yüksek maliyetli operasyondur.
Özellikle sayfanın en üstünde yer alan bir öğenin boyutunu değiştirmek, tarayıcıyı tüm DOM ağacının düzenini baştan sona yeniden kurgulamaya zorlar; bu durum "yukarı doğru yayılan" devasa bir hesaplama yükü yaratır.
Performans Darboğazı ve Akıcılık KaybıSık tekrarlanan Reflow işlemleri, özellikle donanım kaynakları sınırlı olan mobil cihazlarda 60 FPS hedefini ciddi şekilde tehlikeye atarak uygulamada belirgin donmalara yol açar.
Sonuç olarak Reflow yönetimi, bir geliştiricinin sayfa yapısını değiştirirken tarayıcı motoruna bindirdiği "geometrik yükü" minimumda tutmasını gerektiren kritik bir mühendislik disiplinidir.
Repaint (Yeniden Boyama) Görsel Güncelleme
Repaint işlemi, Reflow'a kıyasla daha spesifik bir kapsama sahip olan ve elementlerin geometrik yapısına dokunmadan sadece görsel özelliklerini güncelleme sürecidir.
Bir elementin konumu ve boyutları sabit kalırken; sadece color, background-color, visibility veya box-shadow gibi özellikleri değiştiğinde tetiklenir.
Bu aşamada tarayıcı, elementin sayfadaki yerini yeniden hesaplama ihtiyacı duymaz; sadece etkilenen alanlardaki piksellerin rengini veya dokusunu yeni stile göre yeniden boyar.
Maliyet Analizi: Daha Hafif Ama Dikkat Gerektiren YükTeknik olarak Repaint, Reflow işleminden çok daha az maliyetlidir.
Bunun temel sebebi, tarayıcı motorunun karmaşık "yerleşim matematiği" ile uğraşmadan doğrudan çizim aşamasına geçebilmesidir.
Ancak, bu işlemin "hafif" olması onun zararsız olduğu anlamına gelmez. Özellikle çok geniş alanlarda veya yüksek frekanslı döngülerde yapılan Repaint işlemleri, GPU (Grafik İşlemci) üzerinde birikimli bir yük oluşturarak genel performansı aşağı çekebilir.
Stratejik Ayrım: Geometri vs. GörsellikPerformans odaklı bir geliştirme sürecinde, bir değişikliğin sadece Repaint mi tetikleyeceği yoksa tüm sayfayı Reflow işlemine mi sokacağı bilgisi, kodun verimliliğini belirleyen ana kriterdir.
Sonuç olarak Repaint yönetimi, kullanıcıya sunulan görsel zenginliği korurken cihazın donanım kaynaklarını "tasarruflu" kullanmayı sağlayan estetik bir optimizasyon adımıdır.
Optimizasyon Felsefesi Genel Bilgi
Performans optimizasyonunun en sarsılmaz amacı, maliyetli iki işlem olan Reflow ve Repaint süreçlerini mümkün olduğunca az tetiklemek ve kaçınılmaz olduklarında ise bu işlemleri toplu olarak yürütmektir.
Bu felsefe, modern tarayıcıların sunduğu katı 16 milisaniyelik bütçe kuralına uyum sağlamayı hedefler.
Bu kural, her bir görsel karenin oluşturulma süresinin 16 ms'nin altında kalmasını zorunlu kılar.
Ana İş Parçacığı (Main Thread) ve Paylaşılan KaynaklarBu kısıtlı bütçe, JavaScript'in kullanıcı arayüzünü yöneten Ana İş Parçacığı ile paylaşılıyor olmasından kaynaklanır.
Eğer bir JavaScript işlemi gereğinden uzun sürerse, tarayıcının ekrandaki çizim sürecini fiziksel olarak engeller.
Bu engel, kullanıcının gördüğü animasyonların takılmasına ve sayfanın tepkisizleşmesine neden olur.
Sonuç: Hız ve Akıcılık (Smoothness) DengesiDOM manipülasyonunda gerçek başarı, sadece komutu en kısa sürede yazdırmak değil, aynı zamanda tarayıcının akıcılığını koruma zorunluluğunu yerine getirmektir.
Her başarılı optimizasyon, tarayıcı motoruna daha fazla boş zaman yaratarak, uygulamanın en yoğun anlarda bile pürüzsüz çalışmasını garanti altına alan profesyonel bir mühendislik hamlesidir.
Tetikleyicileri En Aza İndirme Minimize Triggers
Bu ilkenin teknik özü, DOM üzerindeki gereksiz okuma ve yazma işlemlerini önleyerek tarayıcıyı rahatlatmaktır.
Tarayıcılar, bir yazma işlemi ile bir okuma işlemi arasında, bekleyen tüm Reflow hesaplamalarını zorla çalıştırma eğilimindedir.
Bu durum literatürde Layout Thrashing olarak adlandırılır ve performansın en büyük düşmanıdır.
DOM Erişimini Önbellekleme (Caching)Bir elemente kod içerisinde birden fazla kez erişmeniz gerekiyorsa, onu her seferinde document.querySelector gibi metotlarla yeniden sorgulamak yerine bir değişkende saklayın.
Bu sayede tarayıcı, her seferinde koca bir DOM ağacını taramak yerine doğrudan bellekteki referansa ulaşır; bu da CPU üzerindeki yükü anında hafifletir.
İşlem Ayrımı ve GruplandırmaVerimli bir JavaScript mimarisi, DOM Okuma ve DOM Yazma işlemlerini ayrı bloklarda tutarak bu iki işlemi birbirine karıştırmamalıdır.
Önce tüm gerekli verileri okuyup, ardından tüm değişiklikleri tek seferde uygulamak, tarayıcının Reflow işlemlerini mantıklı bir sırayla ve tek bir döngüde yapmasına olanak tanır.
Gereksiz Okuma Engeli: Zorunlu Reflow RiskleriYazma işlemlerinden hemen sonra element.clientWidth veya getComputedStyle() gibi bir okuma işlemi yapmak, tarayıcıyı "bekleyen tüm değişiklikleri hesapla ve bana güncel sonucu ver" komutuyla zorunlu Reflow yapmaya iter.
Bu tür "sabırsız" okumalardan kaçınmak, tarayıcıya kendi zamanlamasını yönetme özgürlüğü verir ve genel sayfa akıcılığını korur.
İşlemleri Toplulaştırma MBatching Operations
Toplulaştırma, birden fazla maliyetli işlemi tek bir Render döngüsü içine sığdırma ve tarayıcıyı defalarca aynı hesaplamayı yapmaktan kurtarma stratejisidir.
Bu yaklaşım, DOM manipülasyonunun parçalı ve dağınık yapısını disiplinli bir "paket servis" modeline dönüştürerek, CPU üzerindeki gereksiz baskıyı ortadan kaldırır.
Tek Seferlik Ekleme: Bellek İçi MontajBir döngü içerisinde birden fazla element oluşturulurken, her yeni öğe için ayrı ayrı appendChild() çağırmak verimsiz bir yöntemdir.
Bunun yerine, document.createDocumentFragment() kullanarak tüm düğümleri önce bellek içinde hazırlayın.
Hazırlanan bu sanal yapıyı tek bir komutla gerçek DOM'a eklediğinizde, Reflow ve Repaint maliyetini sadece bir kez tetiklemiş olursunuz.
Sınıf Kullanımı: Stil PaketlemeGörsel güncellemeler yaparken, her bir özelliği (renk, boyut, gölge) element.style üzerinden tek tek atamak yerine, tüm bu değişiklikleri içeren tek bir CSS sınıfı tanımlayın.
Değişikliği element.classList.add('yeni-stil') ile tek bir hamlede uygulamak, tarayıcıya tek bir bildirim gönderilmesini sağlar.
Bu sayede tarayıcı, onlarca mikro güncelleme yerine tek bir toplu hesaplama ile görseli günceller.
Sonuç: Donanım Dostu GeliştirmeToplulaştırma felsefesi, JavaScript'in hızı ile tarayıcının görüntüleme kapasitesini senkronize eder.
Sonuç olarak bu yöntem, uygulamanın sadece hızlı çalışmasını değil, aynı zamanda cihazın "pil ömrünü ve işlemci sağlığını" koruyan profesyonel bir mühendislik yaklaşımıdır.
Sıklık Kontrolü Debouncing ve Throttling
Tarayıcıda gerçekleşen scroll, resize, mousemove veya input (klavye girişi) gibi olaylar yüksek frekanslı tetikleyicilerdir.
Bu olaylar saniyede onlarca, bazen yüzlerce kez tetiklenebilir.
Her tetikleme, eğer kontrol altına alınmazsa Ana İş Parçacığı üzerinde ağır bir hesaplama yükü oluşturarak uygulamanın 60 FPS akıcılığını bozma potansiyeli taşır.
Stratejik Kontrol TeknikleriBu performans darboğazını aşmak için işleyici fonksiyonun çalışma hızını sınırlayan iki temel teknik kullanılır:
"Throttling", fonksiyonun belirli zaman aralıklarında ( her 100ms'de bir ) sadece bir kez çalışmasını garantiler.
Bu, sürekli devam eden işlemlerin ( scroll gibi) akışını bozmadan yükü hafifletir.
"Debouncing" (Geciktirme), fonksiyonu çalıştırmadan önce olayların durulmasını bekler.
Kullanıcı işlem yapmayı kestiğinde ( yazmayı bıraktığında ) fonksiyonu tek bir kez tetikleyerek gereksiz ara hesaplamaları tamamen eler.
Mühendislik Sonucu: Tarayıcıya Tanınan ZamanBu teknikler, JavaScript'in pahalı hesaplamalar yapmasını engeller ve tarayıcının ekrana çizim yapması için gereken kritik zaman bütçesini ona geri verir.
Sonuç olarak, sıklık kontrolü yöntemleri sadece kodun hızını değil, uygulamanın kullanıcı etkileşimine verdiği yanıt kalitesini ve sistem kaynaklarının "verimli tüketimini" doğrudan belirleyen ileri düzey bir optimizasyon disiplinidir.
Debouncing (Geciktirmeli Tetikleme) Debouncing
Debouncing tekniğinin temel felsefesi, bir olayın tetiklenmesinin tamamen durmasını beklemek üzerine kuruludur.
Bu yöntemin amacı, sürekli gerçekleşen bir eylem döngüsünde ( klavyeden hızlıca yazı yazma gib senaryolarda ) her tuş vuruşunda işlem yapmak yerine, yalnızca kullanıcı eylemi bitirdiğinde fonksiyonu çalıştırmaktır.
Kısacası Debouncing, ardışık çağrılar arasındaki sessizlik süresi dolduğunda tek bir nihai yanıt üretilmesini garantiler.
İşleyiş Mekanizması: Zamanlayıcı YönetimiBu mekanizma, teknik olarak bir zamanlayıcı ( setTimeout ) kullanılarak yönetilir.
Olay tetiklenmeye devam ettiği sürece, her yeni çağrıda bir önceki zamanlayıcı anında iptal edilir.
Fonksiyon, ancak belirlenen süre boyunca yeni bir çağrı gelmezse çalıştırılır.
Bu sürekli sıfırlama döngüsü, kullanıcının eylemi tamamlamasını beklememiz gereken senaryolarda gereksiz hesaplama yükünü ve
"kaynak israfını" önler.
Stratejik Kullanım AlanlarıArama Kutuları: Kullanıcı her harf yazdığında sunucuya sorgu göndermek yerine, yazma işlemi bittikten sonra tek bir API isteği yapmak için idealdir.
Form Doğrulaması: Kullanıcı metin alanını doldururken sürekli hata mesajı göstermek yerine, giriş işlemi tamamlandığında veri kontrolü yapmak için kullanılır.
Özetlemek gerekirse Debouncing, gereksiz ağ trafiğini ve işlemci yorgunluğunu engelleyerek, web uygulamasının kullanıcı eylemlerine akıllı ve sabırlı bir şekilde yanıt vermesini sağlayan bir mühendislik standardıdır.
Throttling (Hız Kısıtlama) Throttling
Throttling tekniğinin temel felsefesi, bir fonksiyonun çağrılma frekansını belirli bir sınırda tutmak üzerine kuruludur.
Debouncing'den farklı olarak, olayların durmasını beklemez; olay sürekli tetiklenmeye devam etse bile, fonksiyonun belirlenen zaman aralığından daha sık çalışmasını fiziksel olarak engeller.
Bu yaklaşım, bir işlemin belirli bir periyotta en fazla bir kez çalışmasını garantileyerek sistem kaynaklarını koruma altına alır.
İşleyiş Mekanizması: Zaman Penceresi (Windowing)Throttling mekanizmasında fonksiyon, belirlenen periyot dolana kadar gelen tüm yeni çağrıları görmezden gelir.
Zaman aralığı dolduğunda ise, bekleyen son çağrıyı kabul eder ve yeni bir zaman penceresi başlatır. Bu sayede, olay saniyede 100 kez tetiklensin ya da tetiklenmesin, pahalı işlem yalnızca saniyede 5 kez gerçekleşerek tarayıcının "Render Bütçesini" korur.
Stratejik Kullanım AlanlarıScroll (Kaydırma): Sayfa kaydırılırken navigasyon çubuğunun stilini güncellemek veya "sayfanın sonuna ulaşıldı" ( infinite scroll ) kontrollerini yapmak için idealdir.
Resize (Boyutlandırma): Pencere boyutu değiştirilirken karmaşık grafiklerin veya ızgara yapılarının her milisaniyede bir değil, düzenli aralıklarla yeniden hesaplanmasını sağlar.
Sonuç olarak Throttling, olayın düzenli olarak takip edilmesi gereken ancak her milisaniye düzeyinde hassasiyet gerektirmeyen durumlarda akışkanlığı ve "işlemci sağlığını" dengeleyen profesyonel bir hız frenidir.
🧭 Opsiyonel Okuma Notu
Bilgilendirme: Bu bölüm, konuların arka planına ve düşünsel temellerine daha derin bir bakış sunmak amacıyla hazırlanmıştır.
- Matematiksel, tarihsel ve felsefî içerikler isteğe bağlı olarak okunabilir.
- Her bölümün içerik seviyesi ve yoğunluğu farklılık gösterebilir.
- Temel düzey kullanıcılar için zorunlu değildir, ileri düzey okuma niteliğindedir.
DOM'a Derinlemesine Bir Bakış ( Felsefi ve Tarihsel Açıklama )
DOM'un tarihsel gelişiminden çalışma prensiplerine, felsefesinden günümüzdeki pratik kullanım alanlarına kadar her yönüyle detaylı bir inceleme sunacağız.
DOM'un Doğuşu ve Felsefesi HTML'den Programatik Nesneye
Web geliştirmenin en temel soyutlaması olan Belge Nesne Modeli, JavaScript'in bir web sayfasını pasif bir metin belgesi olmaktan çıkarıp, aktif ve canlı bir uygulama arayüzüne dönüştürmesini sağlayan yegane stratejik köprüdür.
DOM'un varlığı, internetin sadece bilgi sunan dijital kağıtlardan, kullanıcı girdisine anlık tepki verebilen "tam teşekküllü yazılımlara" evrilmesinin temel mimari dayanağıdır.
Programatik Güç: Arayüzün Kodlanabilir GörünümüBu model, geliştiricilere statik HTML yapısına dair derinlemesine ve kodlanabilir bir perspektif sunarak, görsel arayüzü matematiksel bir kesinlikle yönetme gücü verir.
Tarayıcı, HTML etiketlerini okuduğunda bunları sadece ekrana çizmez; her bir etiketi bellekte JavaScript'in anlayabileceği birer Nesne haline getirir.
Hiyerarşik Egemenlik ve Manipülasyon YetkisiJavaScript, tarayıcı tarafından titizlikle inşa edilen bu nesne hiyerarşisi üzerinden; sayfanın içeriği, stili ve yapısal iskeletiyle ilgili her detaya tam erişim ve manipülasyon yetkisi kazanır.
Bu felsefe, belgeyi sabit bir veri kümesi olarak değil, sürekli değişebilen, genişleyebilen ve "evrim geçirebilen" dinamik bir organizma olarak kabul eder.
Sonuç olarak DOM'un doğuşu, web'in bir kütüphaneden bir işletim sistemine dönüşmesindeki en büyük devrimdir.
DOM'un Kavramsal Temelleri ve Evrimsel Gereklilik Genel Bilgi
DOM'un temel felsefesi, tarayıcıya yüklenen statik bir metin yığınını ( HTML / XML ), programlama dilleri tarafından anında işlenebilir bir
nesne hiyerarşisine dönüştürmektir.
Burada devrimsel bir Paradigma Uyuşmazlığı çözülür , HTML , "ne olduğunu" tanımlayan deklaratif bir dildir; JavaScript ise
"ne yapılması gerektiğini" söyleyen dinamik bir dildir.
DOM, bu iki zıt dünyanın birbiriyle pürüzsüzce konuşmasını sağlayan evrensel soyutlama katmanıdır.
Nesne Temsili ve Etkileşim GücüDOM, belgedeki her bir etiketi, metni ve özelliği bellekte birer JavaScript Nesnesi olarak temsil eder.
Geliştirici artık "ölü metinler" üzerinde değil, canlı nesneler üzerinde çalışır.
element.style.color = "red" gibi komutlar, bu nesnelerin özelliklerini değiştirerek arayüze "etkileşimli bir ruh" kazandırır.
Standartlaşma Kaosu ve W3C Müdahalesiİnternetin ilk yıllarında tarayıcı savaşları yaşanırken, her üretici kendi uyumsuz API'lerini ( Netscape'in layers'ı ve Microsoft'un all'u gibi) piyasaya sürdü.
Bu teknolojik kaos, web geliştiricileri için "her tarayıcıya ayrı kod yazma" kabusuna dönüştü.
1998'de W3C, DOM Seviye 1 spesifikasyonunu yayınlayarak bu krize müdahale etti. Bu standart, günümüzün esnek ve çapraz-tarayıcı uyumlu web ekosisteminin sarsılmaz temelini atmıştır.
Programatik Kimlik: Mantıksal Ağaç YapısıDOM'un programatik kimliği, sayfayı kök düğümden başlayarak dallanan bir Ağaç Veri Yapısı olarak tanımlamasıdır.
Düğüm (Node) Kavramı: Ağaçtaki her birim bir düğümdür.
Etiketler Element Düğümü, aradaki yazılar ise Metin Düğümü'dür.
Bu matematiksel ağaç mantığı, JavaScript'e belgenin hiyerarşisinde özgürce dolaşma, silme ve ekleme yetkisi verir.
Sonuç olarak DOM, karmaşık belgeleri bile organize ve mühendislik disipliniyle yönetilebilir kılan en köklü web mimarisidir.
DOM Teknik Çekirdek ve Mantıksal Yapı DOM'un Çalışma ve Ayrıştırma (Parse) Aşamaları
Bu bölüm, bir web sayfasının ham HTML metninden ekranda görünür ve etkileşime açık hale gelmesine kadar tarayıcı içinde gerçekleşen adım adım sistematik süreci detaylandırır.
Tarayıcı motoru, yüklenen metni ekrandaki her bir pikseli hesaplamak için kullandığı, son derece katmanlı bir mühendislik işlem hattından geçirir.
DOM, bu işlem hattının hem başlangıç noktası hem de "mantıksal yönetim merkezi" konumundadır.
Ayrıştırma (Parsing) ve Düğüm İnşasıSüreç, tarayıcının HTML karakterlerini okuyup bunları anlamlı birimlere ( Tokens ) ayırmasıyla başlar.
Bu aşama, metin tabanlı verinin nesne tabanlı bir yapıya evrildiği ilk kritik eşiktir.
Ardından bu jetonlar (tokens), hiyerarşik bir düzende birbirine bağlanarak DOM Ağacı'nı oluşturur.
Her bir HTML etiketi, bu ağaçta birer Düğüm olarak yerini alır; bu, sayfanın iskeletinin matematiksel olarak tanımlanmasıdır.
Yerleşim (Layout) ve Nihai Görsel KimlikDOM ağacı oluşturulduktan sonra, CSS kuralları ( CSSOM ) ile birleşerek Render Tree'yi meydana getirir.
İşte bu noktada Yerleşim Hesaplama aşaması devreye girer.
Tarayıcı, DOM düğümlerinin ekrandaki kesin koordinatlarını, genişliklerini ve yüksekliklerini bu aşamada "matematiksel bir kesinlikle" hesaplar.
Bu hesaplamalar, sayfanın görsel kimliğini ve özellikle JavaScript manipülasyonlarına vereceği performans tepkisini doğrudan belirler.
Sonuç: Programatik Mantığın ZaferiSon aşamada ise tarayıcı, hesaplanan bu verileri kullanarak ekrandaki pikselleri boyar.
Bu karmaşık süreç sayesinde, statik bir metin olan HTML, JavaScript ile anında değiştirilebilen dinamik bir organizmaya dönüşmüş olur.
Sonuç olarak DOM, tarayıcının ham veriyi anlamlı bir etkileşim motoruna dönüştürdüğü teknik çekirdeği temsil eder.
Ayrıştırma (Parsing) ve DOM Ağacının İnşası Genel Bilgi
Bir web tarayıcısı, ağ üzerinden gelen HTML dosyasını okumaya başladığı an, sürecin ilk ve en kritik evresi olan Ayrıştırma başlar.
Bu aşama, insan tarafından okunabilen metinsel HTML kodlarını, bilgisayar işlemcisinin ve tarayıcı motorunun anlayabileceği yapısal verilere dönüştürür.
Parsing, sayfanın sadece görselini değil, aynı zamanda JavaScript'in üzerinde işlem yapabileceği "programatik kimliğini" de oluşturan temel mühendislik adımıdır.
Hiyerarşik Dönüşüm ve Navigasyon Ön KoşuluBu süreç, tarayıcının pasif bir metin belgesinden, JavaScript'in içinde özgürce dolaşabileceği (navigasyon), elemanları sorgulayabileceği ve etkileşim kurabileceği hiyerarşik bir nesne modeline geçişini sağlayan zorunlu bir ön koşuldur.
Eğer ayrıştırma işlemi başarılı bir şekilde tamamlanmazsa, web sayfası dinamik özelliklerini yitirir ve sadece "statik bir görüntü" olarak kalır.
Sistematik Ardışıklık ve Bellek HaritalamaTarayıcı motorları, bu dönüştürme işlemini son derece disiplinli bir ardışıklıkla gerçekleştirir.
HTML dokümanındaki her bir karakteri analiz eder, etiketleri belirler ve her bir etiketi bellek haritasındaki benzersiz bir düğüme eşler.
Bu bellek haritalama sayesinde, tarayıcı hangi elemanın hangisinin içinde olduğunu, hangisinin komşusu olduğunu kesin olarak bilir.
Bu "mekansal farkındalık", modern web uygulamalarının karmaşık yerleşim düzenlerini hatasız yönetmesini sağlar.
Özetlenirse, ayrıştırma ve inşa süreci, web'in ham maddesi olan metni, dijital dünyanın en güçlü etkileşim mimarisine dönüştüren sihirli bir mühendislik köprüsüdür.
HTML Ayrıştırma (Parsing) ve Tokenizasyon Genel Bilgi
Tarayıcı, kendisine ulaşan ham HTML belgesini satır satır, karakter karakter analiz eder ve onu Token adı verilen anlamlı küçük parçalara ayırır.
Bu token'lar; bir etiketin başlangıcı ( "start tag" ), bitişi ( "end tag" ), sahip olduğu nitelikler veya içindeki düz metin içeriğidir.
Tokenizasyon, tarayıcının sayfayı sadece harflerden oluşan sonsuz bir metin yığını olarak görmekten çıkıp,
mantıksal bir etiketler dizisi olarak görmeye başladığı en kritik çeviri adımıdır.
Kritik Akış: Ana İş Parçacığı (Main Thread)Ayrıştırma ve tokenizasyon süreci, tarayıcının Ana İş Parçacığı üzerinde gerçekleşir.
Bu iş parçacığı, hem görsel inşadan hem de JavaScript komutlarının yürütülmesinden sorumludur.
Bu tekil iş akışı nedeniyle, eğer senkron ( synchronous ) çalışan bir JavaScript kodu çok uzun süre işlem yaparsa, tarayıcı Blocking durumuna geçer.
Bu durumda ayrıştırma işlemi durur ve sayfanın geri kalanının yüklenmesi fiziksel olarak engellenir.
Performans Darboğazı ve Kullanıcı DeneyimiJavaScript tarafından durdurulan ayrıştırma işlemi, modern web performansının en temel darboğazlarından biridir.
Kullanıcı, sayfanın yarım kaldığını veya donduğunu hisseder.
Bu nedenle, tokenizasyon sürecini kesintiye uğratmayan, asenkron ve "non-blocking" kod yazım yaklaşımları, akıcı bir sayfa yüklenme deneyimi için hayati önem taşır.
Sonuç olarak tokenizasyon, web sayfasının karakterlerden nesnelere evrildiği, performansın ise milisaniyelerle ölçüldüğü mühendislik kapısıdır.
DOM Ağacı Oluşturma (Document Tree Construction) Genel Bilgi
Token'lar oluşturulduktan sonra tarayıcı, bu parçaları kullanarak belgenin mantıksal hiyerarşisini kurmaya başlar.
DOM, teknik olarak bir Ağaç Veri Yapısı olarak inşa edilir.
Bu ağaç yapısı, tıpkı bir soyağacı gibi HTML belgesindeki tüm ebeveyn-çocuk ve kardeş ilişkilerini matematiksel bir modelle birbirine bağlar.
Bu hiyerarşik düzen, JavaScript'in her bir öğeye kolayca ulaşmasını ve düğümler arasında gezinmesini sağlar.
Düğüm Türleri (Node Types): Atomik ParçalarHTML belgesindeki her bir karakter ve yapı, DOM'da bir düğüm ( Node ) olarak temsil edilir. JavaScript, HTML etiketleriyle değil, bu nesne düğümleriyle çalışır:
Document Node: Tüm belgenin en üstündeki kök düğümdür; tüm ağaç bu düğümün altında şekillenir.
Element Nodes: HTML etiketlerini ( div, p vb. ) temsil eden ana yapı taşlarıdır. Diğer düğümleri içine alan kapsayıcı görevi görürler.
Text Nodes: Etiketler arasındaki görünür metin içeriğidir.
Örneğin: <p>Merhaba</p> yapısındaki "Merhaba" ifadesi ayrı bir metin düğümü olarak elemente bağlanır.
Attribute Nodes ve Kimlik YönetimiAttribute Nodes, teknik olarak ilgili Element düğümünün bir parçasıdır.
Ağaçta görsel olarak ayrı bir dal oluşturmasalar da, DOM API'si ( getAttribute, id vb. ) aracılığıyla her an erişilebilir ve değiştirilebilir durumdadırlar.
Bu özellikler, elementlerin davranışlarını, kimliklerini ve görsel niteliklerini tanımlayarak ağacın pasif bir yapıdan
tanımlanabilir bir arayüze dönüşmesini sağlar.
Özetlenirse, DOM ağacı inşası; dağınık token parçalarını düzenli, hiyerarşik ve kodlanabilir bir bütüne getiren nihai mühendislik operasyonudur.
İçerik Tamamlandı
Bu konunun temel içeriği burada sona eriyor
Tebrikler! 🎉
Bu konuyu başarıyla tamamladınız! Sabırla ve azimle öğrendiğiniz her şey, programlama yolculuğunuzda önemli bir adımdır. Öğrendiklerinizi pekiştirmek için kod örneklerini tekrar gözden geçirebilir ve kendi projelerinizde uygulayabilirsiniz.
Öğrenme İpuçları
- Kod örneklerini kopyalayıp kendi editörünüzde deneyin
- Her örneği çalıştırın ve sonucu gözlemleyin
- Örnekleri değiştirip kendi versiyonlarınızı oluşturun
- Öğrendiklerinizi not alın ve tekrar edin
- Pratik yapmak için kendi mini projelerinizi oluşturun
Kod Örnekleri İstatistikleri
Bu sayfadaki tüm kod örneklerinin seviye dağılımı
HTML Seviye Dağılımı
CSS Seviye Dağılımı
JavaScript Seviye Dağılımı
Kod Dosyaları
Bu sayfadaki tüm kod dosyalarını dil ve seviyeye göre filtreleyin
const element = document.getElementById('baslik');
ID'ye göre tek element seçer. En hızlı seçim yöntemidir
const element = document.querySelector('.aktif');
CSS seçici ile ilk eşleşeni bulur. Modern ve esnek seçim
yöntemi
const elements = document.querySelectorAll('li');
CSS seçici ile tüm eşleşenleri bulur. NodeList döndürür
const elements = document.getElementsByClassName('menu-item');
Sınıf adına göre koleksiyon döndürür. HTMLCollection
döndürür
const paragraphs = document.getElementsByTagName('p');
Etiket adına göre koleksiyon döndürür. Belirli etiket türlerini
seçer
element.innerHTML = '<strong>Yeni</strong>';
HTML içeriğini değiştirir (XSS riski var). HTML etiketlerini parse
eder
element.textContent = 'Güvenli metin';
Sadece metin içeriğini değiştirir (güvenli). XSS saldırılarına
karşı korumalıdır
element.style.color = 'red';
element.style.backgroundColor = 'blue';
Inline stil özelliklerini değiştirir. CSS özelliklerini camelCase
formatında kullanır
element.classList.add('aktif');
element.classList.remove('pasif');
element.classList.toggle('gizli');
CSS sınıflarını yönetir. add, remove, toggle, contains gibi
metodlar sağlar
const href = element.getAttribute('href');
Nitelik değerini okur. String veya null döndürür
element.setAttribute('data-id', '123');
Nitelik değerini ayarlar. Mevcut niteliği günceller veya yeni
nitelik ekler
element.removeAttribute('disabled');
Nitelik kaldırır. Element üzerinden niteliği tamamen siler
const div = document.createElement('div');
div.textContent = 'Yeni içerik';
Yeni element oluşturur. Henüz DOM'a eklenmemiş durumda
parentElement.appendChild(newElement);
Elementi son çocuk olarak ekler. Parent elementin en sonuna
ekler
parent.insertBefore(newEl, referenceEl);
Belirtilen elementten önce ekler. Konumlandırma kontrolü
sağlar
parent.removeChild(childElement);
Elementi DOM'dan kaldırır. Parent elementten çıkarır
parent.replaceChild(newEl, oldEl);
Eski elementi yenisiyle değiştirir. Parent element içinde yer
değiştirir
element.addEventListener('click', function(e) {
console.log('Tıklandı');
});
Olay dinleyicisi ekler. Birden fazla dinleyici eklenebilir
element.removeEventListener('click', handler);
Olay dinleyicisini kaldırır. Aynı fonksiyon referansı
gerekir
element.addEventListener('click', handler, {
once: true,
passive: true
});
Dinleyici seçenekleri. once, passive, capture gibi seçenekler
sunar
Öğrenme Yolu
JavaScript öğrenme yolculuğunuzda neredesiniz?
Bu bölüm, JavaScript öğrenme yolculuğunuzdaki ilerlemenizi görselleştirir. Aşağıda göreceğiniz adımlar, konular arasındaki mantıksal sıralamayı ve öğrenme akışını temsil eder. Tamamlanan konular mavi tonlarda gösterilir ve üzerinde bir onay işareti bulunur. Aktif konu, şu anda üzerinde çalıştığınız bölümdür ve parlak mavi renkle vurgulanır. Sonraki adımlar ise henüz tamamlanmamış konuları gösterir ve daha soluk tonlarda görüntülenir.
Her adım arasındaki oklar, öğrenme sırasını ve konular arasındaki bağlantıyı gösterir. Bu yapı, hangi konuları tamamladığınızı, hangi konuda olduğunuzu ve sıradaki adımlarınızı net bir şekilde görmenizi sağlar.
DOM
Document Object Model ve DOM manipülasyonu