التعامل مع DOM — JavaScript الأساسيات
التعامل مع DOM
DOM (Document Object Model) هو تمثيل برمجي لصفحة الويب يسمح لـ JavaScript بالتفاعل معها.
اختيار العناصر
// بالـ ID (الأسرع)
const element = document.getElementById("myId");
// بالـ Class
const elements = document.getElementsByClassName("myClass");
// يُرجع HTMLCollection (مصفوفة-شبيهة)
// بالوسم
const divs = document.getElementsByTagName("div");
// بـ CSS Selector (الأفضل والأكثر مرونة) ⭐
const one = document.querySelector(".myClass"); // أول عنصر
const all = document.querySelectorAll(".myClass"); // كل العناصر
// يُرجع NodeList
// أمثلة على Selectors
document.querySelector("#header"); // ID
document.querySelector(".card"); // Class
document.querySelector("div"); // Tag
document.querySelector("div.card"); // Tag + Class
document.querySelector("nav a"); // نسل
document.querySelector("nav > a"); // ابن مباشر
document.querySelector("[data-id]"); // Attribute
document.querySelector("input[type='text']");تعديل المحتوى
const element = document.querySelector("#myDiv");
// النص
element.textContent = "نص جديد"; // نص فقط
element.innerText = "نص جديد"; // نص مرئي
element.innerHTML = "<strong>HTML</strong>"; // مع HTML
// ⚠️ تجنب innerHTML مع بيانات المستخدم (XSS)!تعديل الأنماط (CSS)
const box = document.querySelector(".box");
// تعديل مباشر
box.style.color = "red";
box.style.backgroundColor = "blue"; // camelCase!
box.style.fontSize = "20px";
box.style.cssText = "color: red; background: blue;";
// Classes (الأفضل) ⭐
box.classList.add("active");
box.classList.remove("hidden");
box.classList.toggle("dark-mode");
box.classList.contains("active"); // true/false
box.classList.replace("old", "new");تعديل السمات (Attributes)
const link = document.querySelector("a");
// قراءة
console.log(link.getAttribute("href"));
console.log(link.href); // خاصية مباشرة
// كتابة
link.setAttribute("href", "https://google.com");
link.href = "https://google.com";
// حذف
link.removeAttribute("target");
// فحص
link.hasAttribute("href"); // true
// Data Attributes
const card = document.querySelector("[data-user-id]");
console.log(card.dataset.userId); // قراءة data-user-id
card.dataset.role = "admin"; // إضافة data-roleإنشاء العناصر
// إنشاء عنصر
const div = document.createElement("div");
div.textContent = "عنصر جديد";
div.className = "card";
div.id = "myCard";
// إضافة للصفحة
document.body.appendChild(div);
// إضافة في موقع محدد
const container = document.querySelector(".container");
container.appendChild(div); // في النهاية
container.prepend(div); // في البداية
container.insertBefore(div, reference); // قبل عنصر
container.insertAdjacentElement("afterbegin", div);
// إنشاء من HTML
container.innerHTML += '<div class="new">جديد</div>';
// insertAdjacentHTML (أفضل للأداء)
container.insertAdjacentHTML("beforeend", '<div>جديد</div>');
// beforebegin, afterbegin, beforeend, afterendحذف العناصر
const element = document.querySelector(".toDelete");
// الحذف
element.remove(); // الطريقة الحديثة
element.parentNode.removeChild(element); // الطريقة القديمة
// إفراغ المحتوى
element.innerHTML = "";
element.textContent = "";التنقل في DOM
const element = document.querySelector(".item");
// الأب
element.parentElement;
element.parentNode;
// الأبناء
element.children; // HTMLCollection
element.childNodes; // NodeList (يشمل النصوص)
element.firstElementChild;
element.lastElementChild;
// الإخوة
element.nextElementSibling;
element.previousElementSibling;
// أقرب أب بشرط
element.closest(".container"); // أقرب أب له class containerالأحداث (Events)
const button = document.querySelector("button");
// إضافة حدث
button.addEventListener("click", function(event) {
console.log("تم النقر!");
console.log(event.target); // العنصر المنقور
});
// مع Arrow Function
button.addEventListener("click", (e) => {
e.preventDefault(); // منع السلوك الافتراضي
console.log("نقرة!");
});
// أحداث شائعة
element.addEventListener("click", handler);
element.addEventListener("dblclick", handler);
element.addEventListener("mouseenter", handler);
element.addEventListener("mouseleave", handler);
element.addEventListener("keydown", handler);
element.addEventListener("keyup", handler);
element.addEventListener("input", handler);
element.addEventListener("change", handler);
element.addEventListener("submit", handler);
element.addEventListener("load", handler);
element.addEventListener("scroll", handler);
// إزالة حدث
button.removeEventListener("click", handler);Event Delegation
// بدلاً من إضافة حدث لكل عنصر...
const list = document.querySelector("ul");
list.addEventListener("click", (e) => {
if (e.target.tagName === "LI") {
console.log(`نقرت على: ${e.target.textContent}`);
}
});
// يعمل حتى مع العناصر المضافة لاحقاً!// اختيار عناصر
const title = document.querySelector("h1");
const buttons = document.querySelectorAll("button");
// تعديل المحتوى
if (title) {
title.textContent = "مرحباً بك!";
title.style.color = "blue";
}
// إنشاء عنصر جديد
const newDiv = document.createElement("div");
newDiv.textContent = "عنصر جديد من JavaScript!";
newDiv.classList.add("highlight");
// إضافة للصفحة
document.body.appendChild(newDiv);
// إضافة حدث
newDiv.addEventListener("click", () => {
alert("تم النقر على العنصر!");
});اختبر فهمك