آشنایی با مدل شیء سند
مدل شیء سند (DOM) چیست و چگونه با querySelector عناصر صفحه را انتخاب و متن، سبک و کلاسهای آنها را تغییر دهید.
آنچه در این درس میآموزید
- بدانید مرورگر چگونه HTML را به مدل شیء سند تبدیل میکند
- عناصر صفحه را با querySelector انتخاب کنید
- متن، سبک و کلاس عناصر را از طریق جاوااسکریپت تغییر دهید
فهرست مطالب
تا اینجا همهٔ برنامهها در خروجی متنی اجرا شدند. از این درس جاوااسکریپت به خانهٔ اصلیاش برمیگردیم: مرورگر. جاوااسکریپتِ مرورگر میتواند صفحهٔ HTML را بخواند، عناصرش را پیدا کند و محتوا، سبک و حتی ساختار آنها را در لحظه تغییر دهد؛ همان کاری که هر برنامهٔ تعاملی وب انجام میدهد. پل بین کد شما و صفحه، مدل شیء سند (Document Object Model) یا بهاختصار DOM است.
صفحه بهشکل درخت
وقتی مرورگر یک فایل HTML را میخواند، تگهای آن را به ساختاری درختی از «گرهها» (Nodes) تبدیل میکند که DOM نامیده میشود. هر تگ یک شیء در این درخت است و DOM رابط برنامهنویسی آن است: از طریق جاوااسکریپت میتوانید گرهها را بخوانید، تغییر دهید، اضافه یا حذف کنید. صفحهای که میبینید همیشه بازتاب همین درخت است؛ تغییر گره یعنی تغییر صفحه — بدون بارگذاری دوباره.
این سند کوچک را در سراسر درس همراه داریم:
<!doctype html>
<html>
<body>
<h1 id="title">Shopping List</h1>
<p class="note">Let's return before 6.</p>
<ul>
<li>Bread</li>
<li>Cheese</li>
</ul>
<script src="app.js"></script>
</body>
</html>فایل app.js را کنار همین فایل بسازید و مثالهای بعدی را در آن بنویسید؛ تگ script کد شما را به صفحه وصل میکند.
انتخاب عناصر با querySelector
اولین قدم در هر کار DOM، پیدا کردن عنصر است. شیء سراسری document نمایندهٔ کل صفحه است و متد querySelector با یک سلکتور CSS، اولین عنصر منطبق را میدهد:
const title = document.querySelector("#title");
const note = document.querySelector(".note");
const heading = document.querySelector("h1");
console.log(title === heading);
console.log(note.textContent);این کد را اجرا کنید و زبانهٔ Console ابزار توسعهدهنده را ببینید:
- سلکتور
"#title"عنصر باid="title"را میگیرد و سلکتور".note"عنصر باclass="note"را — دقیقاً همان قواعد سلکتور CSS. titleوheadingبه یک عنصر اشاره میکنند، پسtrueچاپ میشود.- ویژگی
textContentمتن درونی عنصر است؛ اینجاLet's return before 6.چاپ میشود.
اگر هیچ عنصری با سلکتور منطبق نشود، querySelector مقدار null برمیگرداند؛ فراخوانی متد روی null خطای TypeError میدهد.
تغییر محتوا و سبک
شیئی که querySelector میدهد یک شیء معمولی جاوااسکریپت است — همان درس اشیاء! ویژگیهایش را میخوانید و تغییر میدهید و مرورگر همان لحظه صفحه را بهروز میکند:
const title = document.querySelector("#title");
title.textContent = "Movie Night List";
title.style.color = "teal";
const items = document.querySelectorAll("li");
for (const item of items) {
item.classList.add("done");
}آنچه در صفحه رخ میدهد:
- متن تیتر به «Movie Night List» تغییر میکند.
- رنگ متن تیتر با
style.colorفیروزهای میشود؛ هر سبک CSS یک ویژگی در شیءstyleدارد. querySelectorAll— با S جمع — همهٔ عناصر منطبق را بهصورت آرایهمانند میدهد و حلقهٔfor...ofاز درس حلقهها روی آنها میچرخد.classList.addکلاسdoneرا به هر آیتم میافزاید؛classList.removeحذف میکند وclassList.toggleمیزند و برمیدارد. تغییر ظاهر را بهتر است با کلاس انجام دهید و سبک را در CSS بنویسید، نه در جاوااسکریپت.
ساخت و حذف عنصر
DOM فقط برای ویرایش نیست؛ میتوان عناصر تازه ساخت و به صفحه افزود:
const list = document.querySelector("ul");
const newItem = document.createElement("li");
newItem.textContent = "Walnut";
list.append(newItem);createElement عنصری خالی میسازد که هنوز به صفحه وصل نیست؛ با textContent پرش میکنید و با append آن را به انتهای فهرست میچسبانید. از این لحظه «Walnut» بخشی از صفحه است. برای حذف هم متد remove روی عنصر کافی است: newItem.remove().
تمرینها
تمرین
تمرین ۱ — شخصیسازی تیتر
در فایل app.js تیتر صفحه (id="title") را انتخاب کنید، متنش را به «Today's Tasks» تغییر دهید و با style.color رنگ آن را به purple تغییر دهید.
// Write your code hereنمایش راهحل
const title = document.querySelector("#title");
title.textContent = "Today's Tasks";
title.style.color = "purple";پس از اجرا، تیتر صفحه متن «Today's Tasks» با رنگ بنفش را نشان میدهد و هیچ بارگذاری دوبارهای لازم نبوده است.
:::
خلاصه
- مرورگر HTML را به درختی از گرهها به نام DOM تبدیل میکند و جاوااسکریپت رابط تغییر آن است.
document.querySelectorبا سلکتور CSS اولین عنصر منطبق را میدهد و در نبود عنصرnullبرمیگرداند.textContentمتن عنصر را میخواند و تغییر میدهد؛styleسبکهای درونخطی وclassListکلاسها را مدیریت میکند.querySelectorAllهمهٔ عناصر منطبق را میدهد و روی آن میتوان با حلقه چرخید.- با
createElementوappendعنصر تازه به صفحه اضافه میشود و باremoveحذف میشود.
صفحه را میبینیم و تغییرش میدهیم؛ اما هنوز واکنشی به کاربر نداریم. در درس بعدی با رویدادها، برنامه به کلیک و تایپ گوش میدهد.