جاري التحميل...
جاري التحميل...
هيكل DOM، querySelector، الأحداث، Event Delegation
DOM يعني نموذج كائن المستند (Document Object Model). هو واجهة برمجة تطبيقات تمثل محتوى صفحة الويب كشجرة كائنات. يُحوّل المتصفح HTML إلى شجرة يمكن لجافاسكريبت التفاعل معها وتعديلها.
💡 تشبيه::
DOM مثل شجرة عائلية: document هو الجذر، تحته الفروع (عناصر HTML)، وكل فرع يمكن أن يحتوي على فروع أخرى.
بدون DOM، كانت صفحات الويب ثابتة وغير قابلة للتعديل. DOM يسمح بجعل الصفحات تفاعلية: تحديث المحتوى، إظهار/إخفاء العناصر، وإضافة عناصر جديدة دون إعادة تحميل الصفحة.
💡 ملاحظة حول React::
في React، لا نعدّل DOM يدويًا - React يتعامل مع ذلك تلقائيًا. لكن فهم DOM يساعدك على فهم ما يفعله React خلف الكواليس.
قبل DOM، كان المتصفحات تعرض HTML كنص ثابت فقط. DOM يوفر تمثيلًا شجريًا لكل عنصر وواجهة برمجة للبحث والتعديل والتفاعل معه.
ثلاث طرق رئيسية لاختيار العناصر:
getElementById: البحث بالـ id فقط. querySelector: أكثر مرونة ويدعم أي محدد CSS.
تغيير النص وHTML والنمط، إضافة/تبديل الفئات، وتعيين السمات.
قائمة مهام تفاعلية كاملة مع وظائف الإضافة والحذف باستخدام addEventListener و createElement و appendChild.
الأحداث هي طريقة جافاسكريبت للاستجابة لتفاعلات المستخدم.
click / dblclick - النقرinput / change - تغيير الحقولsubmit - إرسال النموذجkeydown / keyup - المفاتيحscroll - التمريرتفويض الأحداث: بدلاً من مستمع لكل عنصر، أضف مستمعًا واحدًا للأب وتحقق من event.target.
💡 لماذا مهم؟:
يعمل مع العناصر المنشأة ديناميكيًا. موفر للذاكرة: مستمع واحد بدلاً من المئات.
عندما يحدث حدث، يمر بثلاث مراحل:
هذه الآلية تجعل تفويض الأحداث ممكنًا - الأحداث تنتقل من الأبناء إلى الآباء عبر مرحلة الفقاعات.
ما هو الفرق بين querySelector و getElementById؟
لماذا نستخدم تفويض الأحداث؟
أنشئ عدادًا مع: عنصر يعرض العداد (يبدأ من 0)، زر +1، زر -1، وزر إعادة تعيين. استخدم querySelector و addEventListener.
الحل:
const countEl = document.getElementById("count");
let count = 0;
document.getElementById("increase").addEventListener("click", () => {
count++;
countEl.textContent = count;
});
document.getElementById("decrease").addEventListener("click", () => {
count--;
countEl.textContent = count;
});
document.getElementById("reset").addEventListener("click", () => {
count = 0;
countEl.textContent = count;
});اختيار العناصر:
document.getElementById("id")
document.querySelector(".class")
document.querySelectorAll("li")
element.parentElement
element.childrenالأحداث:
el.addEventListener("click", fn)
el.removeEventListener("click", fn)
"click" "input" "submit" "keydown"
event.target / event.preventDefault()تعديل العناصر:
el.textContent = "جديد"
el.innerHTML = "<b>جديد</b>"
el.style.color = "red"
el.classList.add("أ")
el.setAttribute("href", "#")الإنشاء والحذف:
document.createElement("div")
parent.appendChild(div)
div.remove()
element.cloneNode(true)