منابع آموزشی و پژوهشی، برای دانشگاه و مدرسه
پشتیبانیانتشار محتوا
CODEX/سطح ۱؛ مرورگر و رویدادjavascriptDOMContentLoaded and readyState

DOMContentLoaded و آماده‌شدن DOM در جاوااسکریپت

آماده‌شدن DOM در جاوااسکریپت را با DOMContentLoaded و readyState مدیریت کنید؛ چرا انتخاب عنصر پیش از ساخت سند ممکن است null بدهد؟

مفهوم به زبان ساده

وقتی مرورگر HTML را می‌خواند، عنصرها به‌تدریج ساخته می‌شوند. اگر یک اسکریپت زودتر از عنصر مورد نظر اجرا شود، انتخاب آن عنصر ممکن است null بدهد؛ این حالت همیشه به معنی غلط‌بودن انتخابگر نیست. زمان اجرای کد نسبت به آماده‌شدن ساختار سند هم اهمیت دارد. رویداد DOMContentLoaded خبر می‌دهد خواندن اولیهٔ HTML و اجرای اسکریپت‌های defer و ماژول‌های غیر async انجام شده است.

این رویداد منتظر بارگیری همهٔ تصویرها نمی‌ماند و با load یکسان نیست. در بسیاری از صفحه‌ها، استفادهٔ درست از اسکریپت defer راه ساده‌ای برای هماهنگی با ساخت سند است. اما کدی که بعداً به صفحه می‌رسد، ممکن است پس از وقوع DOMContentLoaded اجرا شود. ثبت شنوندهٔ تنها در آن زمان، رویدادی را که قبلاً گذشته دوباره ایجاد نمی‌کند.

الگوی نمونه readyState را بررسی می‌کند: اگر هنوز loading باشد، یک شنوندهٔ یک‌باره ثبت می‌شود؛ وگرنه تابع شروع همان لحظه اجرا می‌شود. خروجی یک پیام است، ولی زمان رسیدن به آن به مرحلهٔ بارگیری بستگی دارد. در برنامهٔ واقعی باید از نصب دوبارهٔ شنونده‌ها هنگام چند بار فراخوانی شروع نیز جلوگیری کنید. برای تمرین، این الگو را در یک فایل defer و سپس در کنسول صفحهٔ آماده مقایسه کنید.

کجا به کار می‌آید؟

  • شروع انتخاب عنصرها پس از آماده‌شدن ساختار اولیهٔ سند
  • پشتیبانی از کدی که قبل یا بعد از DOMContentLoaded بارگذاری می‌شود

از تعریف تا یک مثال واقعی

javascript
function startLesson() {
  console.log('شروع تمرین');
}
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', startLesson, { once: true });
} else {
  startLesson();
}
خروجی مورد انتظار
شروع تمرین

این مثال چطور کار می‌کند؟

  1. readyState مرحلهٔ کنونی سند را مشخص می‌کند.

  2. در حالت loading، تابع برای رویداد آینده ثبت می‌شود.

  3. اگر سند از آن مرحله گذشته باشد، شروع مستقیم انجام می‌شود؛ پیام یک‌بار چاپ می‌شود.

اشتباه رایج

افزودن شنوندهٔ DOMContentLoaded پس از وقوع آن، به‌تنهایی تابع را اجرا نمی‌کند. آماده‌شدن DOM نیز به معنی کامل‌شدن همهٔ تصویرها یا درخواست‌های برنامه نیست.

این را به خاطر بسپارید

پیش از وابسته‌کردن کد به یک عنصر، زمان آماده‌شدن سند و زمان ورود خود اسکریپت را در نظر بگیرید.

بازگشت به نقشهٔ مفاهیم
یکجا انتخاب کن، راحت‌تر دریافت کن

انتخاب‌های من ۰ منبع

مجموعهٔ مطالعه‌ات را بساز.

کنار مقاله‌ها «انتخاب» را بزنید تا چند فایل را با هم دریافت کنید.

انتخاب مقاله‌های رایگان