أساسيات DOM في JavaScript

5:00 دقائق مجاني
في هذا الدرس ستتعلم كيف تتعامل JavaScript مع عناصر الصفحة (DOM) وتقرأها وتغيرها

الـ DOM اختصار لـ Document Object Model. ببساطة: المتصفح يحوّل عناصر HTML (مثل العناوين والأزرار) إلى “كائنات” يمكن لـ JavaScript التعامل معها. من هنا تبدأ المتعة: تغيير النصوص، إخفاء عناصر، إضافة عناصر، والتفاعل مع المستخدم.

ما هو DOM بشكل مبسط؟

تخيل الصفحة مثل شجرة: كل عنصر HTML هو عقدة (Node) داخل هذه الشجرة. JavaScript تقدر تمسك أي عقدة وتغيّرها.

الهدف من DOM: أن JavaScript تتحكم بالصفحة بعد ما تنعرض للمستخدم.

كيف نمسك عنصر من الصفحة؟

أشهر الطرق هي:

  • document.getElementById() حسب الـ id
  • document.querySelector() باستخدام CSS selector
  • document.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 = "تم الضغط ✅";
  });
});

هذا المثال هو أول خطوة حقيقية نحو التفاعل داخل صفحاتك.

تمارين للتطبيق

  1. أنشئ عنوانًا وزرًا، وعند الضغط على الزر غيّر نص العنوان.
  2. أنشئ عنصرًا (div) واجعل الزر يخفيه ويظهره باستخدام classList.toggle("hidden").
  3. اجلب كل العناصر التي تحمل class معيّن باستخدام querySelectorAll واطبع عددها.

التطبيق هنا ضروري… لأن DOM لا يُفهم بالمشاهدة فقط.

ماذا بعد هذا الدرس؟

الدرس القادم: Events (الأحداث) والتفاعل مع المستخدم

سنتعمق في addEventListener وأنواع الأحداث مثل click و input و submit.