انتقل إلى محتوى الدرس
الدرس 148
تاريخ النشر: تاريخ التحديث:
دورة جافا سكريبت

دوال الإنشاء المتقدمة في كائن المستند DOMDOM Document Creation Methods شرح دوال الإنشاء بكائن المستند، والتجميع عبر createDocumentFragment، وتكامل createElement والعقد النصية

أتقن دوال الإنشاء المتقدمة في كائن المستند لتجميع العناصر بسرعة عبر createDocumentFragment وبناء العقد النصية والتعليقات وإطلاق الأحداث المخصصة CustomEvent.
أقسام الدرس
5
الأمثلة
3
اللغة
العربية
المشاهدات
3,159
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

يعمل الكائن document بوصفه مصنع العقد المركزي في المتصفح؛ فجميع دوال الإنشاء مثل document.createElement() وdocument.createTextNode() وdocument.createDocumentFragment() وdocument.createComment() تبني العقدة في الذاكرة أولاً بمعزل تام عن الصفحة المرئية.

يتيح لك هذا الفصل تجهيز السمات والفئات والأبناء بهدوء خارج الشجرة الحية، ثم إدراج البنية المكتملة دفعةً واحدة دون إرباك المتصفح بحسابات رسم متكررة.

مخطط دوال الإنشاء في كائن المستند وتجميع العقد بالذاكرة عبر DocumentFragment

يؤدي إلحاق مئات العناصر واحداً تلو الآخر داخل قائمة حية إلى استنزاف المعالج بإعادة حساب التخطيط البصري مع كل عنصر. تحل الدالة document.createDocumentFragment() هذه المشكلة بإنشاء حاوية خفيفة بلا وسم خارجي (nodeType === 11) تجمع العناصر في الذاكرة.

وعند استدعاء list.appendChild(frag) تنتقل العناصر الأبناء فقط دفعةً واحدة إلى القائمة برسمة متصفح واحدة، وتفرغ الحاوية المؤقتة تلقائياً كما يوضح الجدول المقارن:

دالة الإنشاءقيمة nodeTypeهل تترك غلافاً بالشجرة؟الاستخدام العملي الأنسب
document.createElement(tag)1نعم (وسم فعلي)بناء عناصر الواجهة القياسية
document.createTextNode(str)3لا (عقدة نصية)إدراج نصوص آمنة بجوار الأيقونات
document.createComment(str)8لا (تعليق HTML)علامات إرشادية غير مرئية بالقوالب
document.createDocumentFragment()11لا (تفرغ فور الإلحاق)تجميع عشرات العناصر وإدراجها برسمة واحدة
JavaScript
const frag = document.createDocumentFragment();
const items = ['DOM Tree', 'Fragment', 'Single Paint'];
for (const label of items) {
  const li = document.createElement('li');
  li.textContent = label;
  frag.appendChild(li);
}
document.getElementById('list').appendChild(frag);

يمنحك الجمع بين document.createElement() وdocument.createTextNode() قدرة دقيقة على بناء عناصر مركبة — مثل زر يضم أيقونة يتبعها نص متغير — دون مسح الأيقونة المجاورة كما يفعل textContent ودون مخاطر حقن الوسوم في innerHTML.

ولأن المتصفح يتعامل مع العقدة النصية بوصفها حروفاً صرفة فقط، يُعرض أي نص يشبه الوسوم مثل <img onerror=1> كما هو بأمان تام دون أدنى تنفيذ برمجي.

JavaScript
const badge = document.createElement('span');
badge.setAttribute('class', 'tag');
const safeText = document.createTextNode('<img onerror=1> Safe!');
badge.appendChild(safeText);
document.getElementById('host').appendChild(badge);

توفّر واجهة المستند دالتين إضافيتين تصادفهما كثيراً عند قراءة محركات القوالب والشيفرات المؤسسية:

  • تنئشئ document.createComment(data) عقدة تعليق غير مرئية (nodeType === 8) تستعملها مكتبات الواجهات الحديثة كعلامات ربط ثابتة لحفظ مواضع العرض الشرطي.
  • تنشئ document.createAttribute(name) كائن سمة مستقل (Attr) يُربط بالعنصر عبر setAttributeNode()، وإن كانت الدالة المباشرة el.setAttribute(name, value) أخصر وأوضح في المشاريع الحديثة.

اعتمدت الشيفرات القديمة سابقاً على الدالة المطولة المهملة document.createEvent("CustomEvent") متبوعةً بـ initCustomEvent(). أما المعيار الحديث النظيف فهو الباني المباشر new CustomEvent(type, options).

مرّر البيانات المرافقة للحدث داخل الخاصية detail، واضبط الخيار bubbles: true إذا أردت صعود الحدث للأب الأعلى، ثم أطلقه فورياً عبر target.dispatchEvent(event).

JavaScript
const box = document.getElementById('out');
document.addEventListener('cart:add', (e) => {
  box.textContent = e.detail.sku + ' x' + e.detail.qty;
});
const ev = new CustomEvent('cart:add', {
  detail: { sku: 'JS-148', qty: 2 },
  bubbles: true,
});
box.dispatchEvent(ev);
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس دوال الإنشاء في كائن المستند: تجميع القوائم عبر createDocumentFragment()، وبناء العناصر والنصوص الآمنة، وفهم createComment() وcreateAttribute()، وإطلاق الأحداث المخصصة عبر new CustomEvent(). الخطوة التالية: انتقل إلى درس تحريك عناصر الواجهة في DOM لبناء حركة بصرية سلسة متزامنة مع معدل تحديث الشاشة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 DocumentFragment حاوية التجميع المؤقتة DocumentFragment
حاوية خفيفة بالذاكرة (نوعها 11) تجمع العقد وتنقلها للشجرة الحية دفعة واحدة دون غلاف إضافي.
للمراجعة
02 CustomEvent الحدث المخصص CustomEvent
باني قياسي ينشئ أحداثاً مخصصة تحمل بيانات التطبيق داخل الخاصية detail للتواصل المرن بين المكونات.
للمراجعة
03 Comment Node عقدة التعليق Comment
عقدة غير مرئية على الصفحة (نوعها 8) تُنشأ لتعليم المواضع الهيكلية داخل شجرة المستند.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 DOM DOM
Document Object Model
نموذج كائن المستند الذي يوفر في جذره دوال بناء العناصر والنصوص والتعليقات والحاويات المؤقتة.
للمراجعة
02 XSS XSS
Cross-Site Scripting
ثغرة حقن الشيفرات التي تمنعها العقد النصية المنشأة بـ createTextNode لأنها تعامل المدخلات كحروف فقط.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أضف عنصراً رابعاً لمصفوفة items في محرر التجربة الأول وتحقق من ظهور 4 عناصر وبقاء طول الحاوية المؤقتة صفراً بعد الإلحاق.

  2. غيّر قيمة qty من 2 إلى 5 داخل كائن detail في المحرر الثالث وتأكد من طباعة العدد المحدث فورياً.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

ماذا يحدث لحاوية DocumentFragment فور تمريرها إلى الدالة parent.appendChild(fragment)؟

02

ما القيمة الرقمية لخاصية nodeType في عقدة DocumentFragment؟

03

استدعاء الدالة document.createElement("div") يدرج العنصر فوراً في نهاية جسم الصفحة تلقائياً.

04

كيف تتعامل الدالة document.createTextNode("<script>alert(1)</script>") مع أقواس الوسوم؟

05

أي خاصية داخل كائن الخيارات في new CustomEvent(name, options) مخصصة لتمرير البيانات الإضافية؟

06

تُعد الدالة document.createEvent("CustomEvent") مهملة، والبديل القياسي الحديث هو الباني new CustomEvent.

07

أي دالة تنشئ عقدة تعليق HTML (نوعها 8) في الذاكرة؟

08

لماذا تُفضّل element.setAttribute(name, val) عملياً على document.createAttribute(name)؟

09

افتراضياً لا يصعد الحدث المنشأ بـ new CustomEvent("ping") للأب الأعلى ما لم تضبط الخيار bubbles على true.

10

أي دالة تُطلق كائن الحدث المخصص فعلياً على العنصر المستهدف؟