انتخاب عنصرها
روی پیشخوان نانوایی یک عنوان است و سه برگه. عنوان میگوید Rye. برگهها شیفت را مینویسند: Morning، Noon، Evening. برگهٔ آخر کلاس sold هم دارد. خود پیشخوان یک main است با id برابر shelf. داخلش یک h2 با id برابر loaf نشسته، بعد سه عنصر p با کلاس tag. انتخاب یعنی از سند زنده همان گرهها را با اسمی که خودت میگذاری بگیری. document.getElementById("loaf") عنوان را برمیگرداند و متنش Rye است. document.getElementsByClassName("tag") فهرست زنده میدهد و طولش ۳ است. document.querySelector(".tag") اولین برگه را میدهد، یعنی Morning. document.querySelectorAll(".tag") فهرست ثابت است و خانهٔ ۱ میشود Noon. اسمی که روی پیشخوان نیست، از querySelector مقدار null میآید و از querySelectorAll فهرستی به طول ۰.
پنج صدا، نه پایین رفتن از درخت
صفحهٔ مدل DOM پدر عنوان را نام میبرد و فرزند عنصری را با همهٔ گرهها میشمرد. اینجا parentElement و nextElementSibling و children خوانده نمیشود و صدای Math هم نیست. درخت از قبل سر جایش است. کار این صفحه این است که ببینی کدام صدا یک گره میدهد، کدام صدا فهرست میدهد، و کدام جواب یعنی هیچ چیز جور نشده.
هر صدا چه چیزی دستت میدهد
عددها را روی پیشخوانی بگیر که فقط عنوان و سه برگه دارد. فایل پایانی یک پاراگراف اضافه دارد، برای همین شمارش عنصر p آنجا یکی نیست.
📊 هر صدا چه چیزی دستت میدهد
| صدا | چه چیزی برمیگردد | روی این پیشخوان | لغزش رایج |
|---|---|---|---|
getElementById("loaf") |
یک عنصر، یا null |
متن عنوان Rye | فهرستی که باید از خانهاش بخوانی |
getElementsByClassName("tag") |
HTMLCollection زنده |
طول ۳ | گذاشتن نقطه، مثل .tag |
getElementsByTagName("p") |
HTMLCollection زنده |
طول ۳ | خود عنوان، که h2 است |
querySelector(".tag") |
اولین تطابق، یا null |
برگهٔ Morning | همهٔ برگهها |
querySelectorAll(".tag") |
NodeList ثابت |
طول ۳؛ خانهٔ ۱ یعنی Noon | یک فهرست زنده |
querySelectorAll(".oven") |
NodeList خالی |
طول ۰ | null |
متد کلاس و انتخابگر CSS نقطه را یکی نمینویسند. getElementsByClassName("tag") اسم خالی tag را میخواهد. getElementsByClassName(".tag") دنبال کلاسی است که اسمش دقیقاً .tag باشد و طول ۰ برمیگرداند. querySelector شکل CSS را میخواهد، پس نقطه روی .tag میماند. querySelector("tag") دنبال عنصری میگردد که نام برچسبش tag باشد؛ چیزی پیدا نمیکند و null میدهد. خانهٔ ۰ اولین برگه است. خانهٔ ۱ یعنی Noon. فهرست getElementsByClassName زنده است: اگر صفحهٔ بعد برگهٔ تازهای با همین کلاس اضافه کند، طولش زیاد میشود. querySelectorAll همان طول لحظهٔ صدا زدن را نگه میدارد. Evening دو کلاس دارد، tag و sold. هم داخل فهرست سهتایی است و هم تنها مورد sold.
یک id، یک عنصر
id روی صفحه باید یکتا باشد. getElementById همان یک عنصر را برمیگرداند. اگر آن id نباشد، جواب null است. فهرست نمیدهد. این متد فقط روی document هست، نه روی خود عنصر.
let loaf = document.getElementById("loaf");
console.log(loaf.textContent);
console.log(loaf === null);
خط اول Rye است. خط دوم false است، چون عنوان واقعاً روی پیشخوان هست. اگر دو عنصر id یکسان loaf داشته باشند، باز هم فقط اولین عنصر سند برمیگردد.
اسم کلاس و اسم برچسب
هر دو صدا یک HTMLCollection زنده میدهند. اول length را بخوان، بعد سراغ یک برگه برو. شمارش مال پیشخوان چهارعنصری است، نه فایل پایانی.
console.log(document.getElementsByClassName("tag").length);
console.log(document.getElementsByTagName("p").length);
console.log(document.getElementsByClassName("sold").length);
خروجی 3 و 3 و 1 است. سه برگه کلاس tag دارند. هر سه عنصر p هستند و عنوان h2 است، برای همین روی این پیشخوان شمارش برچسب با شمارش کلاس یکی است. فقط Evening کلاس sold دارد. getElementsByClassName(".tag") صدای دیگری است: نقطه جزو اسم کلاس نیست، پس آن طول 0 است.
اولین تطابق CSS
querySelector یک عنصر برمیگرداند، اولین مورد به ترتیب سند، و اگر هیچ نباشد null.
console.log(document.querySelector(".tag").textContent);
console.log(document.querySelector("#shelf .sold").textContent);
خط اول Morning است. خط دوم Evening. عبارت #shelf .sold یعنی عنصری با کلاس sold داخل پیشخوان، نه خود پیشخوان. document.getElementById("shelf").querySelector(".sold") جستوجو را از پیشخوان شروع میکند و به همان برگهٔ Evening میرسد.
همهٔ تطابقها، بعد شمارهٔ خانه
querySelectorAll همهٔ موارد را در یک NodeList ثابت میریزد. فهرست میتواند خالی باشد. خودش null نیست.
let tags = document.querySelectorAll(".tag");
console.log(tags.length);
console.log(tags[1].textContent);
طول 3 است. خانهٔ ۱ میشود Noon. خانهٔ ۰ یعنی Morning و خانهٔ ۲ یعنی Evening. اگر اسکریپت بعدی برگهای اضافه کند، این فهرست بزرگ نمیشود. HTMLCollection حاصل getElementsByClassName("tag") بزرگ میشود. یکی عکس همان لحظه است و دیگری زنده میماند.
اسمی که پیشخوان ننوشته
id و کلاسی را صدا بزن که در فایل نیست.
console.log(document.getElementById("oven"));
console.log(document.querySelector(".oven"));
console.log(document.querySelectorAll(".oven").length);
خط اول null است. خط دوم null است. خط سوم 0 است. querySelectorAll حتی وقتی چیزی جور نشود باز فهرست برمیگرداند؛ طولش ۰ است و خود فهرست null نیست. getElementById فهرستی ندارد که پس بدهد، پس نبودن عنصر یعنی null، نه ۰.
یک خط روی صفحه
یک پاراگراف میگوید چند برگهٔ tag هست، برگهٔ اول چیست، و برگهٔ sold کدام است. اسکریپت ته body است، بعد از آنکه عنصرها ساخته شدهاند. پاراگراف خط کلاس tag ندارد، پس جزو آن سه تا نیست.
<!DOCTYPE html>
<html>
<head>
<title>selecting — page</title>
</head>
<body>
<main id="shelf">
<h2 id="loaf">Rye</h2>
<p class="tag">Morning</p>
<p class="tag">Noon</p>
<p class="tag sold">Evening</p>
<p id="line">…</p>
</main>
<script>
let tags = document.querySelectorAll(".tag");
let line = document.getElementById("line");
line.textContent = tags.length + " / " + tags[0].textContent + " / " + document.querySelector(".sold").textContent;
</script>
</body>
</html>
پاراگراف مینویسد 3 / Morning / Evening. روی همین فایل getElementsByTagName("p") عدد ۴ میدهد، چون خط خودش یک p دیگر است. querySelectorAll(".tag") هنوز ۳ است. صفحهٔ بعد HTML همان عنصرهایی را عوض میکند که این صداها از قبل پیدا کردهاند.
پیشخوان را چک کن
- متن عنوان را لاگ کن و Rye بخواه؛ بعد مقایسه با null و انتظار false
- طول کلاس، طول
p، و طول sold را لاگ کن: ۳ و ۳ و ۱ - متن اولین
.tagرا لاگ کن و Morning بخواه؛ بعد#shelf .soldو انتظار Evening - طول
querySelectorAllرا لاگ کن و ۳ بخواه؛ خانهٔ ۱ باید Noon باشد - id غایب و
querySelectorغایب را لاگ کن؛ هر دو null querySelectorAll(".oven").lengthرا لاگ کن و ۰ بخواه- پاراگراف را بخوان و انتظار
3 / Morning / Evening
صدای اشتباه
صفحه باز میشود. صدایی که نوشتی چیز دیگری خواسته.
- دادن
.tagبهgetElementsByClassName؛ نقطه فقط مال انتخابگر CSS است - دادن
tagبدون نقطه بهquerySelectorو انتظار برگهها - خواندن خانهٔ ۱ بهجای برگهٔ اول
- گرفتن نبودِ نتیجهٔ
querySelectorAllبهجایnull، در حالی که طول ۰ است - گرفتن نبودِ
getElementByIdبهجای فهرستی به طول ۰ - شمردن
getElementsByTagName("p")روی فایل پایانی و انتظار ۳ - صدا زدن
.mapرویHTMLCollection؛ این آرایه نیست - خواندن
parentElementدر این صفحه؛ آن کار صفحهٔ درخت بود
اینها را با خودت ببر
getElementByIdیک عنصر میدهد، یاnullgetElementsByClassNameوgetElementsByTagNameیکHTMLCollectionزنده میدهند- متد کلاس
tagمیخواهد، نه.tag querySelectorاولین تطابق CSS را میدهد، یاnullquerySelectorAllیکNodeListثابت میدهد؛ اگر چیزی نباشد طول ۰ است- خانهٔ ۰ یعنی Morning و خانهٔ ۱ یعنی Noon
- صفحهٔ بعد HTML عنصرهایی را عوض میکند که همینجا انتخاب شدهاند
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود