HTML Academy · درس

استنساخ القوالب باستخدام cloneNode

إنشاء نسخ من محتوى القالب بكفاءة باستخدام cloneNode(true)

الدرس 2 من 413 خطوة

استنساخ القوالب باستخدام cloneNode درس مجاني في HTML Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في HTML Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة HTML Academy 4 دروس في المجموع.

الاستنساخ العميق مقابل السطحي

تقبل الطريقة cloneNode وسيطًا منطقيًا:

const template = document.getElementById('card-tmpl');

// Deep clone (true): copies all descendants
const deep = template.content.cloneNode(true);

// Shallow clone (false): only the root node, no children
const shallow = template.content.cloneNode(false);
// shallow has no children — use deep for templates

إنشاء نسخ متعددة من قالب واحد

يمكن استنساخ القوالب أي عدد من المرات:

const tmpl = document.getElementById('item-tmpl');
const container = document.getElementById('list');

['Alpha', 'Beta', 'Gamma'].forEach((name, i) => {
  const clone = tmpl.content.cloneNode(true);
  clone.querySelector('.item-name').textContent = name;
  clone.querySelector('.item-num').textContent = i + 1;
  container.appendChild(clone);
});
// 3 separate clones — modifying one doesn't affect others

DocumentFragment والأداء

نفّذ تحديثات DOM على دفعات باستخدام DocumentFragment لتحسين الأداء:

const frag = document.createDocumentFragment();
const tmpl = document.getElementById('row-tmpl');

rows.forEach(row => {
  const clone = tmpl.content.cloneNode(true);
  // fill in clone...
  frag.appendChild(clone);
});

// ONE DOM append instead of many:
document.getElementById('table-body').appendChild(frag);
// Appending to a fragment doesn't trigger layout; append once for performance

استنساخ مستمعي الأحداث

لا يتم نسخ مستمعي الأحداث الموجودين على القالب الأصلي:

// Template definition:
const tmpl = document.getElementById('btn-tmpl');
const origBtn = tmpl.content.querySelector('.btn');
origBtn.addEventListener('click', () => console.log('click'));

// Clone:
const clone = tmpl.content.cloneNode(true);
const cloneBtn = clone.querySelector('.btn');
// cloneBtn does NOT have the click listener!
// You must re-add listeners after cloning

إضافة مستمعي الأحداث بعد الاستنساخ

أرفق الأحداث بعد الاستنساخ:

function createCard(data) {
  const clone = document.getElementById('card-tmpl').content.cloneNode(true);

  const deleteBtn = clone.querySelector('.delete-btn');
  deleteBtn.addEventListener('click', () => deleteItem(data.id));

  clone.querySelector('.title').textContent = data.title;

  return clone;  // return the fragment
}

document.getElementById('list').appendChild(createCard(item));

استخدام importNode

يُعد document.importNode بديلًا لـ cloneNode:

const tmpl = document.getElementById('card-tmpl');

// Equivalent to tmpl.content.cloneNode(true):
const clone = document.importNode(tmpl.content, true);
// importNode adopts the node into the current document
// In the same document, this is functionally identical to cloneNode

مقدمة عن فتحات القوالب

تستخدم Web Components فتحات مسماة لحقن المحتوى في القوالب:

<template id="card-tmpl">
  <div class="card">
    <slot name="title">Default Title</slot>
    <slot name="body">Default body text.</slot>
  </div>
</template>
<!-- slot elements become placeholders for projected content -->
<!-- Covered in full in the Shadow DOM course -->

تحديث المحتوى المستنسخ

طرق ملء محتوى القالب المستنسخ:

const clone = tmpl.content.cloneNode(true);

// textContent — safe, no HTML parsing:
clone.querySelector('.name').textContent = user.name;

// innerHTML — only if content is trusted:
clone.querySelector('.bio').innerHTML = trustedHTML;

// setAttribute:
clone.querySelector('.avatar').src = user.avatar;
clone.querySelector('.profile-link').href = `/users/${user.id}`;

مقارنةً بـ document.createElement

مقارنة template بـ createElement للعناصر المتكررة:

// createElement: verbose for complex structures
const card = document.createElement('div');
card.className = 'card';
const title = document.createElement('h2');
card.appendChild(title);
// ... many lines for nested structure

// template: define once, clone efficiently
const clone = tmpl.content.cloneNode(true);
// Complex structure defined in HTML once
// Clone is fast and the template handles nesting

الذاكرة والقوالب

سلوك القوالب في الذاكرة:

  • تُخزَّن القوالب في الذاكرة ككائنات DocumentFragment
  • النسخ المستنسخة مستقلة — ويجمعها GC عند إزالتها من DOM
  • تستمر القوالب نفسها ما دام عنصر DOM موجودًا
  • بالنسبة إلى القوالب الديناميكية، خزّن مرجع القالب خارج الدالة

دعم المتصفحات

دعم عنصر template:

  • مدعوم في جميع المتصفحات الحديثة منذ نحو عام 2014
  • غير مدعوم في IE، إذ انتهى دعم IE
  • لا حاجة إلى polyfill في المشاريع الحديثة

تحقق سريع

لماذا يجب إعادة إضافة مستمعي الأحداث بعد استنساخ قالب؟

مراجعة: cloneNode

أساسيات cloneNode:

  • cloneNode(true) — نسخة عميقة تشمل جميع العناصر التابعة
  • لا يتم نسخ مستمعي الأحداث — أعد إرفاقهم بعد الاستنساخ
  • أضف العناصر على دفعات باستخدام DocumentFragment لتحسين الأداء
  • خزّن مرجع القالب خارج حلقات العرض
  • استخدم textContent لإدراج النص بأمان
البدء مجانًا

تعلم HTML مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
40
الدروس
159

الأسئلة الشائعة

هل درس «استنساخ القوالب باستخدام cloneNode» مجاني؟

نعم — نص درس «استنساخ القوالب باستخدام cloneNode» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة HTML Academy، انتقل إلى CoddyKit PRO. تتضمن دورة HTML Academy 4 دروس في المجموع.

ماذا ستتعلم في «استنساخ القوالب باستخدام cloneNode»؟

إنشاء نسخ من محتوى القالب بكفاءة باستخدام cloneNode(true) تتمرن على HTML Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ HTML Academy؟

لا تُشترط خبرة سابقة. HTML Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «استنساخ القوالب باستخدام cloneNode»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس HTML Academy هذا؟

نعم. كل درس في HTML Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. عنصر template: محتوى غير نشط
  2. استنساخ القوالب باستخدام cloneNode
  3. استخدام template في العرض باستخدام JavaScript
  4. القوالب في مقابل innerHTML من منظور الأمان
← العودة إلى HTML Academy