فرمها
چایخانه یک برگه دارد. فرمش #slip است. فیلد متنی #guest که name آن هم guest است، فیلد عددی #cups که name آن هم cups است، و دکمهٔ #send با type="submit". زیر فرم، بند #note هنوز blank میگوید.
فرم چند فیلد نامدار را یکجا جمع میکند. آنچه نوشته شده در value همان فیلد است. این ویژگی همیشه رشته است، حتی وقتی type فیلد number باشد. فرستادن فرم رویداد submit روی خود فرم است، نه کلیکی که روی تکتک فیلدها گوش بدهی. اگر preventDefault را صدا نزنی، مرورگر آدرس فرم را باز میکند و این صفحه میرود. اینجا preventDefault زده میشود تا بند سر جایش بماند. اسکریپت مهمان را lida میگذارد، فنجان را 2، یک بار روی send کلیک میکند، و خط میشود lida / 2 / stayed.
این نوار بلیت نیست
نوار بلیت یک شنوندهٔ کلیک روی پدر داشت و event.target را میخواند. خطش red / blue / gold / 1 بود و preventDefault نداشت. صفحهٔ پلاک preventDefault را روی یک لینک زد. خطش click / seal / plaque / true / quiet بود. این برگه هیچکدام نیست. دکمهٔ gold ندارد و کارش currentTarget نیست. نام رویداد submit است. مقدارهایی که اینجا مهماند lida و رشتهٔ 2 هستند.
getElementById("guest") فیلد را با id پیدا میکند. slip.elements.guest همان فیلد را با name، از داخل فرم، پیدا میکند. در این نشانهگذاری id و name یکی است تا هر دو راه درست کار کند. درس بعدی خالی بودن یا شکل فیلد را وارسی میکند. این صفحه نه. مهمان خالی هم فرستاده میشود.
برگه چه را یادداشت میکند
بند از blank شروع میشود. مهمان و فنجان اول خالیاند. نوشتهٔ دکمه همان send میماند. ردیفها را به ترتیب بخوان. هر قطعه از برگهٔ خالی شروع میشود، جز ردیف صفحه که مال نمایش پایین است. آن نمایش یک بار روی send کلیک میکند.
📊 برگه چه را یادداشت میکند
| لحظه | چه را میخوانی | متن بند | لغزش رایج |
|---|---|---|---|
| گذاشتن lida در مهمان | guest.value |
lida | خواندن id که guest است |
| گذاشتن 2 در فنجان | cups.value |
2، و رشته است | انتظار عدد 2 |
| کلیک send، تابع مینویسد stayed | بند | stayed | صدازدن slip.submit() که شنونده را رد میکند |
| هر دو نام، از داخل فرم | elements.guest و elements.cups |
lida 2 | خواندن elements.slip |
| اسکریپت صفحه | خط | lida / 2 / stayed | red / blue / gold / 1 |
value فیلد عددی را به عدد تبدیل نمیکند. بعد از ذخیرهٔ 2، cups.value همان نویسههای 2 است. typeof cups.value برابر "string" است. اگر بعداً عدد خواستی، خودت تبدیل میکنی. این خط آن کار را نمیکند. رشتهای را نشان میدهد که فیلد واقعاً نگه داشته.
send.click() رویداد submit را روی فرم آتش میکند، چون type دکمه submit است. slip.submit() صدای دیگری است. به مرورگر میگوید فرم را بفرست، و شنوندهٔ submit تو را اجرا نمیکند. پس preventDefault داخل آن شنونده اصلاً نوبت پیدا نمیکند. این صفحه از کلیک دکمه استفاده میکند.
دو راه به یک فیلد
getElementById("cups") از id استفاده میکند. slip.elements.cups از name استفاده میکند، و فقط وقتی فرم را از قبل در دست داشته باشی. اینجا هر دو ویژگی یک واژهاند، پس دو راه با هم جورند. اگر name برابر count بود و id همان cups میماند، elements.cups پیدا نمیشد و فیلد زیر elements.count بود.
نام مهمان
فیلد اول خالی است. اسکریپت lida را در value میگذارد و همان ویژگی را برمیگرداند توی بند. هنوز چیزی فرستاده نشده.
let guest = document.getElementById("guest");
let note = document.getElementById("note");
guest.value = "lida";
note.textContent = guest.value;
console.log(note.textContent);
لاگ lida است. id برابر guest است. بند واژهٔ guest را نشان نمیدهد. هر رشتهای که در value نشسته باشد همان است.
چند فنجان
برگهٔ تازه. فیلد فنجان type="number" است. 2 را ذخیره کن، value را بخوان، بعد typeof را بپرس.
let cups = document.getElementById("cups");
let note = document.getElementById("note");
cups.value = "2";
note.textContent = cups.value + " " + typeof cups.value;
console.log(note.textContent);
لاگ 2 string است. جعبه عددی دیده میشود، ولی اسکریپت متن گرفته. اگر 2 را بدون گیومه ذخیره کنی، باز هم ویژگی به شکل رشتهٔ "2" برمیگردد.
دکمهٔ ارسال
باز برگهٔ تازه. شنونده روی فرم است، برای submit. preventDefault را صدا میزند و stayed مینویسد. بعد صفحه روی دکمهٔ send کلیک میکند. slip.submit() را صدا نمیزند.
let slip = document.getElementById("slip");
let note = document.getElementById("note");
function pour(event) {
event.preventDefault();
note.textContent = "stayed";
}
slip.addEventListener("submit", pour);
document.getElementById("send").click();
console.log(note.textContent);
لاگ stayed است. شنونده اجرا شده، پس مرورگر این صفحه را ترک نکرده. اگر بهجای کلیک send، slip.submit() را صدا بزنی، تابع pour اجرا نمیشود. بند blank میماند.
نامها روی برگه
برگهٔ تازه، این بار بدون شنونده. اسکریپت هر دو فیلد را از راه slip.elements و با name مینویسد، بعد در بند به هم میچسباند.
let slip = document.getElementById("slip");
let note = document.getElementById("note");
slip.elements.guest.value = "lida";
slip.elements.cups.value = "2";
note.textContent = slip.elements.guest.value + " " + slip.elements.cups.value;
console.log(note.textContent);
لاگ lida 2 است. elements.guest همان input است که nameاش guest است، نه عنصری که idاش slip باشد. فاصله فقط جداکنندهٔ بند است. خط صفحه بعداً از / استفاده میکند.
خط زیر برگه
اسکریپت ته body است، بعد از فرم و بندها. mark اول left است. شنونده ارسال پیشفرض را میگیرد، دو مقدار را در بند میگذارد، و mark را stayed میکند. بعد اسکریپت lida و 2 را پر میکند و یک بار send را میزند. خط بعد از همان کلیک نوشته میشود.
<!DOCTYPE html>
<html>
<head>
<title>forms — page</title>
</head>
<body>
<form id="slip">
<input id="guest" name="guest" type="text">
<input id="cups" name="cups" type="number">
<button id="send" type="submit">send</button>
</form>
<p id="note">blank</p>
<p id="line">…</p>
<script>
let slip = document.getElementById("slip");
let note = document.getElementById("note");
let mark = "left";
function pour(event) {
event.preventDefault();
note.textContent =
slip.elements.guest.value + " / " + slip.elements.cups.value;
mark = "stayed";
}
slip.addEventListener("submit", pour);
slip.elements.guest.value = "lida";
slip.elements.cups.value = "2";
document.getElementById("send").click();
document.getElementById("line").textContent =
note.textContent + " / " + mark;
</script>
</body>
</html>
خط lida / 2 / stayed است. واژهٔ اول مهمان است. دومی فنجان، به صورت متن. واژهٔ آخر mark است و چون شنونده اجرا شده، stayed است نه left. بند در پایان lida / 2 است. واژهٔ blank رفته. خط بلیت مال صفحهٔ دیگر است. این برگه پر بودن فیلدها را وارسی نمیکند.
پای پیشخان
- lida را در فیلد مهمان بگذار و
valueرا بخوان. بند lida است. - 2 را در فنجان بگذار و
valueرا باtypeofبخوان. بند 2 string است. - به submit گوش بده،
preventDefaultرا بزن، و send را کلیک کن. بند stayed است. - هر دو فیلد را از
slip.elementsبخوان. بعد خط صفحه: lida / 2 / stayed.
لغزشهای پای پیشخان
برچسبها همان guest و cups و send میمانند. بند واژهٔ slip نیست.
cups.valueرا عدد 2 گرفتنslip.submit()را صدا زدن و منتظر اجرایpourماندن- جا انداختن
preventDefault، تا مرورگر آدرس فرم را باز کند - خواندن id مهمان وقتی
valueرا میخواستی - گشتن دنبال
slip.elements.slip - وارسی فیلد خالی یا الگو در همین صفحه
- خواندن خط به شکل red / blue / gold / 1
این را نگه دار
- بعد از ذخیرهٔ lida،
guest.valueهمان lida است cups.valueرشتهٔ 2 است وtypeofبرابر"string"استsend.click()شنوندهٔ submit را اجرا میکند؛slip.submit()نهpreventDefaultدلیل ماندن صفحه است و به همین خاطر بند میتواند stayed بگویدslip.elements.guestوslip.elements.cupsفیلدهای نامدار را میخوانند- خط صفحه
lida / 2 / stayedاست
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود