أساسيات DOM في JavaScript
الـ DOM اختصار لـ Document Object Model. ببساطة: المتصفح يحوّل عناصر HTML (مثل العناوين والأزرار) إلى “كائنات” يمكن لـ JavaScript التعامل معها. من هنا تبدأ المتعة: تغيير النصوص، إخفاء عناصر، إضافة عناصر، والتفاعل مع المستخدم.
ما هو DOM بشكل مبسط؟
تخيل الصفحة مثل شجرة: كل عنصر HTML هو عقدة (Node) داخل هذه الشجرة. JavaScript تقدر تمسك أي عقدة وتغيّرها.
الهدف من DOM: أن JavaScript تتحكم بالصفحة بعد ما تنعرض للمستخدم.
كيف نمسك عنصر من الصفحة؟
أشهر الطرق هي:
document.getElementById()حسب الـ iddocument.querySelector()باستخدام CSS selectordocument.querySelectorAll()لجلب أكثر من عنصر
1) getElementById (الأبسط)
HTML:
مرحبا
JavaScript:
let title = document.getElementById("title");
console.log(title);
هذه الطريقة سريعة وواضحة عندما يكون لديك عنصر واحد معروف بالـ id.
2) querySelector (الأكثر استخدامًا)
تستطيع اختيار عنصر باستخدام نفس طريقة CSS:
let btn = document.querySelector(".my-button"); // class
let box = document.querySelector("#box"); // id
let p = document.querySelector("p"); // أول فقرة في الصفحة
ملاحظة مهمة
querySelector يرجع أول عنصر فقط يطابق الاختيار.
3) querySelectorAll (عناصر متعددة)
إذا عندك أكثر من عنصر وتريدهم كلهم:
let items = document.querySelectorAll(".item");
console.log(items.length);
هذا يرجع “قائمة” عناصر (NodeList)، وغالبًا نستخدم معها حلقة.
items.forEach(function (el) {
console.log(el.textContent);
});
تغيير النص داخل عنصر (textContent / innerHTML)
بعد ما تمسك العنصر، تقدر تغيّر النص بداخله.
let title = document.getElementById("title");
title.textContent = "أهلاً بك في JavaScript!";
الفرق بين textContent و innerHTML
textContentيضع نص فقط (آمن ومفضل)innerHTMLيسمح بكتابة HTML داخل العنصر
title.innerHTML = "نص مع وسم";
نصيحة: استخدم textContent غالبًا، لأن innerHTML قد يسبب مشاكل أمنية لو دخلت بيانات من المستخدم.
تغيير التنسيق: classList
أفضل طريقة لتغيير شكل عنصر هي إضافة/حذف كلاس CSS.
let box = document.querySelector("#box");
// إضافة كلاس
box.classList.add("hidden");
// حذف كلاس
box.classList.remove("hidden");
// تبديل (إذا موجود احذفه، وإذا غير موجود أضفه)
box.classList.toggle("hidden");
في Tailwind “hidden” تعني إخفاء العنصر.
أهم مشكلة للمبتدئ: الكود يشتغل قبل تحميل الصفحة!
إذا JavaScript حاولت تمسك عنصر قبل ما المتصفح يحمّله، ستأخذ null وراح يصير خطأ.
هذا يحصل كثير عندما تضع السكربت في الأعلى.
✅ حلّين ممتازين:
الحل 1: وضع السكربت قبل </body>
أفضل حل للمبتدئين.
الحل 2: DOMContentLoaded
يضمن أن الكود يعمل بعد تحميل العناصر.
document.addEventListener("DOMContentLoaded", function () {
let title = document.getElementById("title");
title.textContent = "تم تحميل الصفحة ✅";
});
مثال كامل صغير (زر يغيّر نص عنوان)
HTML:
لم يتم الضغط بعد
JavaScript:
document.addEventListener("DOMContentLoaded", function () {
let message = document.getElementById("message");
let btn = document.getElementById("btn");
btn.addEventListener("click", function () {
message.textContent = "تم الضغط ✅";
});
});
هذا المثال هو أول خطوة حقيقية نحو التفاعل داخل صفحاتك.
تمارين للتطبيق
- أنشئ عنوانًا وزرًا، وعند الضغط على الزر غيّر نص العنوان.
- أنشئ عنصرًا (div) واجعل الزر يخفيه ويظهره باستخدام
classList.toggle("hidden"). - اجلب كل العناصر التي تحمل class معيّن باستخدام
querySelectorAllواطبع عددها.
التطبيق هنا ضروري… لأن DOM لا يُفهم بالمشاهدة فقط.
ماذا بعد هذا الدرس؟
الدرس القادم: Events (الأحداث) والتفاعل مع المستخدم
سنتعمق في addEventListener وأنواع الأحداث مثل click و input و submit.