التعامل مع الصفحة في JavaScript: DOM
كل ما تعلمته حتى الآن كان يظهر في الطرفية فقط. حان الوقت لتجعل JavaScript تغيّر الصفحة نفسها: تبدّل النصوص، وتلوّن العناصر، وتضيف عناصر جديدة. في هذا الدرس ستتعرف على DOM، وهو الجسر الذي يربط JavaScript بصفحة HTML.
ما هو DOM؟
Section titled “ما هو DOM؟”عندما يقرأ المتصفح ملف HTML، يحوّله إلى شجرة من العناصر في الذاكرة، تسمى DOM (Document Object Model). تخيّلها مثل شجرة العائلة: العنصر <html> هو الجد، وأبناؤه <head> و <body>، وداخل <body> الأحفاد مثل العناوين والفقرات والأزرار.
كل عنصر في هذه الشجرة أصبح كائناً له خصائص ودوال، تماماً مثل الكائنات التي تعلمتها في الدرس السابق. ونقطة البداية لكل شيء هي الكائن document الذي يمثل الصفحة كلها.
اختيار العناصر
Section titled “اختيار العناصر”قبل أن تغيّر عنصراً، يجب أن «تمسكه». هذه أهم ثلاث طرق:
// بالمعرّف idconst title = document.getElementById("title");
// بأي محدد CSS: أول عنصر مطابقconst firstNote = document.querySelector(".note");
// بأي محدد CSS: كل العناصر المطابقةconst allNotes = document.querySelectorAll(".note");console.log(allNotes.length);getElementByIdتأخذ الـ id بدون علامة#.querySelectorتأخذ محدداً بنفس كتابة CSS:#titleللـ id، و.noteللكلاس، وpلاسم الوسم. وتُرجع أول عنصر مطابق فقط.querySelectorAllتُرجع كل العناصر المطابقة في قائمة، يمكنك أن تعرف طولها وتمر عليها بـforEach.
تغيير المحتوى
Section titled “تغيير المحتوى”الخاصية textContent تقرأ نص العنصر أو تغيّره:
const title = document.querySelector("#title");console.log(title.textContent); // اقرأ النص الحاليtitle.textContent = "عنوان جديد"; // غيّرهوهناك أيضاً innerHTML التي تقبل وسوم HTML داخل النص، مثل "<strong>مهم</strong>".
تغيير التنسيق
Section titled “تغيير التنسيق”يمكنك تغيير تنسيق العنصر مباشرة من خلال الخاصية style. لاحظ أن أسماء خصائص CSS المركبة تُكتب بأسلوب camelCase، فـ background-color تصبح backgroundColor:
title.style.color = "#5b5bf0";title.style.backgroundColor = "#ececff";لكن الطريقة الأنظف هي أن تكتب التنسيق في CSS ككلاس، ثم تضيفه أو تزيله بـ JavaScript عبر classList:
const note = document.querySelector(".note");note.classList.add("done"); // أضف كلاسnote.classList.remove("done"); // أزلهnote.classList.toggle("done"); // أضفه إن لم يكن موجوداً، وأزله إن كان موجوداًtoggle مثل زر الإضاءة: ضغطة تشعل، وضغطة تطفئ.
تغيير الخصائص (Attributes)
Section titled “تغيير الخصائص (Attributes)”يمكنك تغيير خصائص الوسوم، مثل مصدر الصورة أو رابط الوسم <a>:
const img = document.querySelector("img");img.src = "cat.png";img.alt = "صورة قطة";إنشاء عناصر جديدة
Section titled “إنشاء عناصر جديدة”لإضافة عنصر للصفحة: أنشئه بـ createElement، واملأه بالمحتوى، ثم ألحقه بعنصر موجود بـ append:
const list = document.querySelector("#list");const items = ["خبز", "لبن", "تفاح"];
for (const item of items) { const li = document.createElement("li"); li.textContent = item; list.append(li);}هكذا تبني قائمة كاملة من مصفوفة! ولحذف عنصر من الصفحة استخدم element.remove().
جرّب بنفسك
Section titled “جرّب بنفسك”هذه صفحة صغيرة فيها عنوان وفقرتان وقائمة فارغة. الكود يغيّر العنوان، ويشطب الملاحظة الثانية، ويبني القائمة من مصفوفة. أضف أصنافاً للمصفوفة، وغيّر الألوان، وجرّب toggle:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- تشغيل الكود قبل وجود العنصر: إذا كان السكربت في
<head>بدونdefer، فإنquerySelectorتُرجعnull، ثم يظهر خطأ مثلCannot read properties of null. راجع درس «أين تكتب كود JavaScript». - نسيان # أو . في querySelector:
querySelector("title")تبحث عن وسم اسمه title، وليس عن العنصر صاحب الـ id. الصحيح"#title". - وضع # مع getElementById: الصحيح
getElementById("title")بدون#.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي سطر يختار أول عنصر يحمل الكلاس card؟
querySelector تستخدم محددات CSS، والنقطة قبل الاسم تعني كلاس.
سؤال
ما الطريقة الآمنة لوضع نص كتبه المستخدم داخل عنصر؟
textContent تتعامل مع القيمة كنص فقط ولا تنفّذ أي وسوم، فهي آمنة.
الخلاصة
Section titled “الخلاصة”- DOM شجرة كائنات تمثل الصفحة، ونقطة البداية هي
document. querySelectorوquerySelectorAllتختاران العناصر بمحددات CSS.textContentلتغيير النص بأمان، وclassListلإضافة الكلاسات وإزالتها وتبديلها.styleلتغيير التنسيق مباشرة، بأسماء camelCase.createElementثمappendلإضافة عناصر جديدة، وremoveلحذفها.