مقدمه
تاکنون با سه نوع گره اصلی و پراستفاده یعنی Document، Element و Text آشنا شدهایم. این سه
نوع، بخش عمدهای از کارهای روزمره با DOM را پوشش میدهند. با این حال، درخت DOM شامل انواع دیگری
از گرهها نیز میشود که هرچند کمتر با آنها سروکار داریم، اما آشنایی با آنها درک ما را از ساختار
کلی DOM کاملتر میکند. در این درس به سه نوع دیگر یعنی Comment،
DocumentType و
DocumentFragment نگاهی خواهیم داشت.
نوع Comment
نوع Comment نمایندهی یک کامنت در سند HTML است. کامنتها توسط مرورگر رندر نمیشوند،
اما بخشی از درخت DOM هستند و با جاوااسکریپت قابل دسترسیاند. این نوع گره از Node ارثبری
میکند و nodeType آن برابر با 8 است. محتوای متن کامنت نیز از طریق پراپرتی data یا
nodeValue قابل دسترسی است.
JAVASCRIPT
const container = document.getElementById('container');
const commentNode = container.firstChild;
console.log(commentNode.nodeType);
console.log(commentNode.data);
همانطور که میبینید، ما میتوانیم گره کامنت را مانند هر گره دیگری پیدا کرده و محتوای آن را
بخوانیم. اگرچه دستکاری کامنتها در عمل کاربرد چندانی ندارد، اما دانستن وجود آنها در درخت DOM
مهم است.
نوع DocumentType
گره `DocumentType` نمایندهی بخش `<!DOCTYPE ...>` در ابتدای
سند HTML است که نوع سند را به مرورگر اعلام میکند. این گره به عنوان
فرزندی از شیء document و از طریق پراپرتی document.doctype قابل دسترسی است.
nodeType آن
برابر با 10 است.
JAVASCRIPT
const doctype = document.doctype;
if (doctype) {
console.log(doctype.name);
}
این نوع گره نیز عمدتاً برای خواندن اطلاعات استفاده میشود و کاربرد چندانی در دستکاریهای روزمره
DOM ندارد، اما بخشی از ساختار استاندارد سند است.
نوع DocumentFragment
برخلاف دو نوع قبلی، DocumentFragment یک نوع گره بسیار کاربردی و مهم، به ویژه برای بهبود
عملکرد، است. DocumentFragment یا «قطعه سند» یک گنجه یا ظرف موقت و سبک برای نگهداری
گرههای
دیگر است که خودش بخشی از درخت اصلی DOM محسوب نمیشود.
مزیت اصلی آن در مسائل عملکردی است. فرض کنید میخواهید یک لیست طولانی از آیتمها را به صفحه اضافه
کنید. اگر هر آیتم li را تک به تک به ul در DOM اصلی اضافه کنید، مرورگر مجبور است پس
از هر
بار اضافه شدن، صفحه را مجدداً محاسبه و رندر کند (فرایندی به نام reflow/repaint). این کار
بسیار پرهزینه است. راهحل بهتر این است که تمام liها را ابتدا به یک
DocumentFragment در حافظه اضافه کنید و سپس کل محتوای فرگمنت را یکجا به DOM اصلی
منتقل کنید. با این کار، فقط یک عملیات reflow/repaint اتفاق میافتد.
JAVASCRIPT
const list = document.getElementById('fruit-list');
const fruits = ['Apple', 'Orange', 'Banana'];
const fragment = document.createDocumentFragment();
fruits.forEach(fruitText => {
const li = document.createElement('li');
li.textContent = fruitText;
fragment.appendChild(li);
});
list.appendChild(fragment);
در این کد، ما ابتدا یک فرگمنت میسازیم. سپس در یک حلقه، آیتمهای لیست را ساخته و به جای افزودن
مستقیم به ul، آنها را به فرگمنت اضافه میکنیم. در نهایت، پس از اتمام حلقه، کل فرگمنت را
با یک دستور appendChild به ul اصلی اضافه میکنیم. این الگو به شکل چشمگیری عملکرد را در هنگام
افزودن دستهای عناصر به صفحه بهبود میبخشد.
در این درس با انواع گره کمتر رایج اما مفید Comment، DocumentType و به خصوص
DocumentFragment آشنا شدیم و دیدیم که چگونه DocumentFragment میتواند به عنوان یک
ابزار بهینهسازی قدرتمند عمل کند. تا به اینجا با انواع مختلف گرهها در DOM آشنا شدهایم
و یاد گرفتیم چطور آنها را پیدا کنیم. اکنون آمادهایم تا وارد بخش هیجانانگیز ماجرا،
یعنی دستکاری واقعی DOM شویم. در درس بعدی، یاد میگیریم که چگونه گرههای
جدیدی بسازیم، آنها را به درخت DOM اضافه، جایگزین یا حذف کنیم.