آموزش جاوااسکریپت مقدماتی
جاوااسکریپت به صفحه رفتار می دهد: واکنش به کاری که کاربر می کند، عوض کردن محتوا بدون بارگذاری دوباره، و گرفتن داده از سرور. اسکلت صفحه کار HTML است و ظاهرش کار CSS؛ جاوااسکریپت فقط جایی لازم می شود که صفحه باید کاری انجام بدهد.
- درس ۴ از ۱۲
- مقدماتی
- رایگان، بدون ثبت نام
سه زبانی که با هم یک صفحه را می چرخانند
هر کدام یک کار دارند و هیچ کدام کار آن یکی را نمی کنند.
-
HTML، ساختار
می گوید هر تکه چیست: تیتر، پاراگراف، دکمه، فرم. مرورگر و صفحه خوان و خزنده همین را می خوانند.
-
CSS، ظاهر
رنگ، فاصله، اندازه و چیدمان. حالت ها را هم خودش می کشد: hover و focus و باز و بسته.
-
جاوااسکریپت، رفتار
کاری که بعد از باز شدن صفحه اتفاق می افتد: واکنش به کاربر، عوض کردن محتوا، حرف زدن با سرور.
وزنشان برابر نیست. صفحه بدون جاوااسکریپت هنوز کار می کند و بدون CSS هنوز خوانده می شود، ولی صفحه بدون HTML اصلا وجود ندارد.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
جاوااسکریپت دقیقا برای چه کاری است؟
برای کاری که بعد از باز شدن صفحه اتفاق می افتد. جاوااسکریپت تنها زبانی است که هر مرورگری بومی اجرا می کند، و کارش این است که صفحه ای که HTML ساخته و CSS رنگ کرده را زنده کند.
شکل بالای صفحه سه چرخ دنده است و همین تقسیم کار را نشان می دهد. HTML می گوید این تیتر است و آن دکمه، CSS می گوید دکمه چه رنگی باشد، و جاوااسکریپت می گوید وقتی کسی دکمه را زد چه اتفاقی بیفتد.
چهار کار هست که فقط از جاوااسکریپت برمی آید: واکنش نشان دادن به کاری که کاربر بعد از بارگذاری صفحه می کند، عوض کردن چیزی که همین حالا روی صفحه است، حرف زدن با سرور بدون اینکه صفحه دوباره بارگذاری شود، و نگه داشتن چیزی در خود مرورگر تا دفعه بعد. هر چیز دیگری که فکر می کنید به جاوااسکریپت نیاز دارد، ارزشش را دارد که دوباره چک کنید؛ در بخش ششم همین درس با یک فهرست مشخص برمی گردیم سراغش.
یک چیز هم هست که کارش نیست و تازه کارها زیاد اشتباه می گیرند: جاوااسکریپتی که در مرورگر اجرا می شود، برنامه سمت سرور نیست. ذخیره کردن یک سفارش، فرستادن ایمیل و چک کردن رمز عبور، همه روی سرور اتفاق می افتند. کد مرورگر فقط درخواست می دهد.
کد را کجا بنویسیم و چطور به صفحه وصلش کنیم؟
در یک فایل جدا با پسوند .js، و با یک خط در head به صفحه وصلش می کنید:
<script src="app.js" defer></script>آن کلمه defer مهم ترین چیزی است که در این بخش یاد می گیرید. یعنی فایل را همزمان با خواندن HTML دانلود کن، ولی اجرایش را بگذار برای وقتی که کل صفحه ساخته شد. بدون آن، اسکریپتی که در head نشسته قبل از وجود داشتن عنصرها اجرا می شود و هر تلاشی برای پیدا کردن یک دکمه، null برمی گرداند. رایج ترین «چرا کار نمی کند» تازه کارها همین است و جوابش یک کلمه است.
ابزار دومتان کنسول مرورگر است. با F12 بازش کنید و باز نگهش دارید: هر خطای جاوااسکریپت با شماره خط همان جا چاپ می شود و console.log هم هر چیزی را که بخواهید همان جا نشانتان می دهد. تا وقتی کنسول را باز نکرده اید، دارید در تاریکی کد می زنید.
const title = document.querySelector("h1");
console.log(title.textContent);و متغیرها: const بنویسید مگر بدانید مقدار باید عوض شود، آن وقت let. کلمه var از دوره قبل جاوااسکریپت مانده و در کد جدید دلیلی برای نوشتنش ندارید.
DOM چیست و چرا همه چیز از آن شروع می شود؟
مرورگر وقتی HTML شما را می خواند، از رویش یک درخت از اشیا در حافظه می سازد. اسم آن درخت DOM است و جاوااسکریپت با همان کار می کند، نه با فایل شما. برای همین وقتی چیزی را با کد عوض می کنید، صفحه فورا تغییر می کند و فایل روی دیسک دست نخورده می ماند؛ یک refresh همه چیز را برمی گرداند.
پیدا کردن یک عنصر یک تابع دارد و همان یکی کافی است. document.querySelector همان انتخابگرهای CSS را می گیرد:
const btn = document.querySelector(".btn");
const rows = document.querySelectorAll(".row");بعد از پیدا کردن، سه کار روزمره دارید. متن را با textContent عوض می کنید، کلاس را با classList اضافه و کم می کنید، و ویژگی ها را با setAttribute.
btn.textContent = "ذخیره شد";
btn.classList.add("is-done");بین این ها یک تصمیم هست که ارزش دارد از همین اول درست یادش بگیرید. textContent هر چه بدهید را متن ساده می بیند، ولی innerHTML آن را مارک آپ حساب می کند و اجرا می کند. اگر متنی که می گذارید از کاربر آمده باشد، یعنی تگ نوشتن در صفحه شما را به او سپرده اید. قاعده ساده است: تا وقتی واقعا HTML نمی سازید، textContent.
و یک عادت که کار را تمیز نگه می دارد: به جای اینکه با جاوااسکریپت رنگ و اندازه را عوض کنید، فقط یک کلاس اضافه کنید و بگذارید CSS ظاهر را بکشد. جاوااسکریپت حالت را عوض می کند، CSS آن حالت را نشان می دهد.
رویداد: وقتی کاربر کاری می کند
هر کاری که کاربر می کند یک رویداد می سازد: کلیک، تایپ، ارسال فرم، اسکرول. شما به مرورگر می گویید کدام رویداد را روی کدام عنصر می خواهید و چه تابعی اجرا شود:
btn.addEventListener("click", function () {
console.log("someone pressed it");
});یک مثال کامل که واقعا کار می کند و در HTML و CSS شدنی نیست: شمارنده کاراکتر زیر یک فیلد متنی.
<label for="msg">متن پیام</label>
<textarea id="msg" maxlength="200"></textarea>
<p id="left">200</p>const box = document.querySelector("#msg");
const left = document.querySelector("#left");
box.addEventListener("input", function () {
left.textContent = 200 - box.value.length;
});پنج خط، و چند نکته که در پنج خط جا شده اند. رویداد input را انتخاب کرده ایم نه keyup، چون keyup فقط کیبورد را می شنود و چسباندن متن با ماوس یا با موبایل را از دست می دهد. value محتوای فعلی فیلد است و length طولش. و maxlength روی خود تگ کار محدود کردن را می کند؛ جاوااسکریپت فقط دارد عدد را نشان می دهد.
در فرم ها یک رویداد دیگر هم لازمتان می شود. اگر می خواهید ارسال فرم را خودتان مدیریت کنید، باید جلوی رفتار پیش فرض مرورگر را بگیرید:
form.addEventListener("submit", function (event) {
event.preventDefault();
});شکل بعدی همین چرخه را قدم به قدم نشان می دهد. چیزی که در آن اهمیت دارد قدم آخر است: شما DOM را عوض می کنید و کشیدن دوباره صفحه کار مرورگر است، نه کار شما.
از کلیک کاربر تا تغییر روی صفحه
شما فقط قدم سوم را می نویسید. بقیه کار مرورگر است.
-
۱
کاربر کاری می کند
کلیک، تایپ، ارسال فرم یا حتی اسکرول.
-
۲
مرورگر رویداد را می سازد
یک شی با تمام جزئیات: کجا، روی کدام عنصر، با کدام کلید.
-
۳
تابع شما اجرا می شود
همان تابعی که با addEventListener ثبت کرده بودید.
-
۴
DOM عوض می شود
یک متن، یک کلاس یا یک ویژگی. فایل روی دیسک دست نمی خورد.
-
۵
مرورگر دوباره می کشد
این قدم را شما نمی نویسید و لازم هم نیست بنویسید.
اگر عنصری را پاک کنید و دوباره بسازید، شنونده اش هم با آن رفته است. رایج ترین دلیل اینکه دکمه ای بعد از یک به روز شدن دیگر کار نمی کند همین است.
fetch: گرفتن داده بدون بارگذاری دوباره صفحه
تا اینجا هر چه بود داخل خود صفحه اتفاق می افتاد. fetch جایی است که صفحه با بیرون حرف می زند: یک آدرس را صدا می زنید، سرور جواب می دهد، و شما جواب را روی صفحه می گذارید. بدون اینکه صفحه دوباره بارگذاری شود.
async function loadPrice() {
const res = await fetch("/api/price.json");
const data = await res.json();
document.querySelector("#price").textContent = data.toman;
}کلمه await یعنی صبر کن تا جواب برسد و بعد خط بعدی را اجرا کن، و فقط داخل تابعی که async است معنا دارد. اینجا اولین جایی است که جاوااسکریپت واقعا سخت تر می شود، چون کارها دیگر خط به خط پشت سر هم نیستند. اگر روز اول تا همین جا جلو آمدید، کافی است؛ باقی اش صبر می کند.
سه چیز را از همین حالا بدانید تا وقتتان تلف نشود. اول اینکه آدرسی که صدا می زنید باید واقعا وجود داشته باشد و جواب بدهد؛ در کنسول، برگه Network نشان می دهد درخواست رفته و چه کدی برگشته. دوم اینکه اگر آدرس مال دامنه دیگری باشد، مرورگر جلوی خواندن جواب را می گیرد مگر آن سرور اجازه اش را داده باشد. و سوم، مهم ترینشان: این کد در مرورگر بازدیدکننده اجرا می شود و او می تواند کل آن را بخواند. هیچ کلید و رمزی در این فایل جایی ندارد.
چقدر جاوااسکریپت واقعا لازم دارید؟
کمتر از آنچه فکر می کنید، و این موضع ماست نه یک سلیقه. بخش بزرگی از کاری که تازه کارها با جاوااسکریپت می کنند را امروز خود HTML و CSS بلدند، بهتر و با کد کمتر:
- باز و بسته شدن یک بخش با
detailsوsummary، بدون یک خط کد - اعتبارسنجی اولیه فرم با
requiredوtype="email"روی خود فیلد - بارگذاری تنبل تصویرها با
loading="lazy" - پنجره مودال با تگ
dialog - واکنش به حالت عنصر با
hoverوfocus-visibleوhasدر CSS - اسلایدر افقی با
scroll-snap، که با انگشت هم درست کار می کند
چرا این مهم است: هر فایل جاوااسکریپت باید دانلود شود، تجزیه شود و اجرا شود، و اجرا روی همان نخی اتفاق می افتد که به لمس کاربر جواب می دهد. تا وقتی کد در حال اجراست، صفحه به انگشت کسی جواب نمی دهد. تصویر سنگین کیفیت را پایین می آورد، ولی جاوااسکریپت سنگین صفحه را کند می کند؛ اگر می خواهید ببینید این روی سرعت واقعی سایت چه اثری دارد، صفحه افزایش سرعت سایت و درس های مسیر سرعت همین را با اندازه گیری نشان می دهند.
حالا مرز این حرف، که هر توصیه ای دارد. اگر چیزی که می سازید یک محصول است و نه یک سایت محتوایی، داشبورد یا ویرایشگر یا چت زنده، آن وقت واقعا به جاوااسکریپت زیادی نیاز دارید و هیچ ایرادی هم ندارد. حرف ما درباره سایت شرکتی، فروشگاه ساده و بلاگ است: آنجا هر کیلوبایتی که ننویسید، برنده شده اید.
یک مثال از همین صفحه: شکل هایی که در این درس می بینید، با صفر خط جاوااسکریپت کشیده شده اند. HTML و CSS، همین.
قبل از نوشتن اولین خط، یک سوال
بخش بزرگی از کارهایی که با جاوااسکریپت انجام می شوند، امروز در خود HTML و CSS جواب دارند.
این کاری که می خواهید، واقعا جاوااسکریپت لازم دارد؟
ننویسیدش
- باز و بسته شدن بخش ها با details و summary
- اعتبارسنجی اولیه فرم با ویژگی های خود فیلد
- بارگذاری تنبل تصویرها با یک ویژگی
- اسلایدر افقی با scroll-snap در CSS
جاوااسکریپت بنویسید
- شمارنده، فیلتر زنده و هر چیزی که با تایپ کاربر عوض می شود
- گرفتن داده از سرور بدون بارگذاری دوباره صفحه
- نگه داشتن چیزی در مرورگر تا مراجعه بعدی
- هر چیزی که باید روی ورودی کاربر حساب کند
این قاعده برای سایت محتوایی است. برای یک محصول تعاملی مثل داشبورد یا ویرایشگر، جواب تقریبا همیشه بله است و مشکلی هم ندارد.
مسیر سریع با هوش مصنوعی
مدل های زبانی برای یاد گرفتن جاوااسکریپت غیرمعمول خوب اند، چون چیزی که تازه کار لازم دارد کد نیست، جواب «چرا» است، پنج بار پشت سر هم و بدون خجالت. ولی مسیر سریع «کد بگیر» نیست؛ «کوچک ترین نسخه ای که کار می کند را بگیر و بعد وادارش کن از تو سوال بپرسد» است. تفاوت این دو، تفاوت کسی است که کد دارد با کسی است که کد را می فهمد. برای این کار مدل سریع و ارزان کافی است؛ انتخاب فعلی ما در <a class="text-link" href="/ai/">بخش هوش مصنوعی</a> هست.
- در یک جمله بنویسید چه اتفاقی باید بیفتد. اگر جمله تان دو تا «و» دارد، دو کار است؛ جدایشان کنید و یکی یکی جلو بروید.
- نسخه پایین را اجرا کنید و مارک آپ واقعی خودتان را در آن بگذارید، نه توصیفش را.
- کد را در فایل بگذارید و کنسول مرورگر را باز نگه دارید. اگر کار نکرد، خط خطا همان جا با شماره خط نوشته می شود.
- حالا قدمی که کپی کردن را از یاد گرفتن جدا می کند: همان کد را برگردانید و بخواهید یک خطش را بردارد و از شما بپرسد چه چیزی خراب می شود. تا وقتی جوابتان درست نیست، آن کد هنوز مال شما نیست.
نسخه آماده کپی
نقش: معلم جاوااسکریپت برای کسی که تازه شروع کرده.
چیزی که باید اتفاق بیفتد:
{در یک جمله بنویسید}
مارک آپ فعلی:
{HTML را اینجا بگذارید}
قواعد:
- کوچک ترین نسخه ای که کار می کند را بده، نه نسخه کامل و حرفه ای.
- جاوااسکریپت امروزی: const و let، addEventListener، fetch. بدون jQuery، بدون var، بدون ویژگی onclick داخل تگ.
- بدون کتابخانه و بدون فریمورک. اگر واقعا بدون کتابخانه نمی شود، اول همین را بگو و دلیلش را بنویس.
- اگر همین کار با HTML یا CSS تنها شدنی است، اول آن راه را نشان بده و بگو چرا بهتر است.
- بعد از کد، هر خط را در یک جمله توضیح بده.
- برای هر قابلیتی که استفاده کرده ای، اسم صفحه اش در MDN را بنویس تا خودم جدول پشتیبانی مرورگرها را ببینم.
- هیچ متن و عدد و نامی ننویس که در ورودی من نیست؛ جایش {...} بگذار.
در پایان: یک خط از کد را بردار و از من بپرس با نبودن آن خط چه چیزی خراب می شود. جواب درست را تا وقتی نپرسیده ام ننویس.
قبل از اعتماد به خروجی: مدل مرورگر ندارد. کدی که «باید کار کند» ممکن است روی صفحه شما به دلیلی که او نمی بیند کار نکند: عنصر هنوز ساخته نشده بود، اسکریپت زود اجرا شد، یا انتخابگر به چیزی نمی خورد. برای این دسته سوال ها اول کنسول، بعد چت. و یک مرز جدی تر: هیچ کدی که با پرداخت، ورود کاربر یا اطلاعات شخصی سر و کار دارد نباید بدون خوانده شدن توسط کسی که زبان را می فهمد منتشر شود. جاوااسکریپت شما روی دستگاه بازدیدکننده اجرا می شود؛ هر چه در آن بگذارید، فرستاده اید.
هوش مصنوعی در این کار
این همان موضوعی است که هوش مصنوعی بیشترین کمک را به یک تازه کار می کند، و موضع ما هم روشن است: از آن به عنوان معلم استفاده کنید نه به عنوان تامین کننده. سه کاری که واقعا خوب انجام می دهد: نوشتن کوچک ترین نسخه کارکن یک کار، توضیح خط به خط کدی که نمی فهمید، و خواندن یک پیام خطا و گفتن اینکه از کجا می آید. کاری که نمی سپاریم: قضاوت درباره اینکه این کد امن است یا نه.
ابزارهایی که واقعا کمک می کنند
- Claude برای توضیح خط به خط و برای همان بازی «یک خط را بردار و از من بپرس» خوب جواب می دهد. ایران در فهرست کشورهای پشتیبانی شده انتروپیک نیست؛ این را از صفحه خود انتروپیک خوانده ایم.
- Gemini برای سوال های پایه ای و اولین نسخه یک تابع کافی است و فارسی را خوب می فهمد. صفحه خود گوگل می گوید اپ وب جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
- Claude Code در ویرایشگر و ترمینال خودتان کار می کند و فایل ها را می بیند، پس برای پروژه ای که چند فایل شده مناسب تر است تا یک پنجره چت. برای مبتدی روز اول لازم نیست. خودش رایگان نصب می شود ولی به اشتراک انتروپیک نیاز دارد و ایران در فهرست کشورهای پشتیبانی شده نیست.
کجا نتیجه معکوس می دهد
دو خطر مشخص، و هیچ کدام «کد اشتباه» نیست. اول الگوی قدیمی: مدل همان چیزی را می دهد که از آن خواسته اید، و اگر نگویید جاوااسکریپت امروزی می خواهید، هیچ چیز جلوی var و ویژگی onclick داخل تگ را نمی گیرد. راه چک کردنش هم دستی است و ده ثانیه طول می کشد: اسم آن قابلیت را در MDN بزنید و جدول پشتیبانی مرورگرها را ببینید. دوم و مهم تر: کدی که نمی توانید بخوانید، بدهی است. روزی که خراب شود، و روزی که خراب می شود همان روزی است که به آن نیاز دارید، هیچ راهی برای تعمیرش ندارید. و یک مرز که ربطی به یادگیری ندارد: چیزی که در پنجره چت می گذارید از دستگاه شما بیرون رفته است، پس کلید، توکن و اطلاعات مشتری در آن جایی ندارند. برای اینکه ببینید هر ابزار از ایران چطور قابل پرداخت است، راهنمای خرید را ببینید.
منبع ها: MDN: The script element MDN: Using the Fetch API Anthropic: supported countries Google: where Gemini Apps are available
حد این توصیه
جاوااسکریپتی که در مرورگر اجرا می شود قابل اعتماد نیست، و این یک ایراد نیست بلکه تعریف آن است: بازدیدکننده می تواند کد را بخواند، عوضش کند و اصلا خاموشش کند. پس هر چیزی که واقعا مهم است، از اعتبارسنجی فرم تا قیمت و دسترسی، باید روی سرور دوباره چک شود؛ چک مرورگر برای راحتی کاربر است نه برای امنیت. یک حد دیگر هم دارد: این درس کف کار است. فریمورک هایی مثل ری اکت و ویو موضوع جدایی هستند و یک سایت محتوایی معمولا هیچ وقت به آن ها نمی رسد. و اگر هدفتان راه اندازی سریع یک سایت است نه یادگیری، سراغ وردپرس بروید؛ آنجا این کدها را کس دیگری نوشته و کار شما انتخاب کردن است.
از تجربه خود ما
اندازه واقعی که خودمان با آن کار می کنیم، روی همین سایت و قابل بررسی در view source. کل جاوااسکریپت سمت کاربر قالب rgb.ir دو فایل است، حدود شانزده و پنج کیلوبایت، هر دو با defer، و همین صفحه ای که می خوانید همان دو تا را بارگذاری می کند به علاوه فایل آنالیتیکس. شکل های این بخش هم صفر بایت جاوااسکریپت دارند: موتور شکل ها هشت فایل PHP است و در هیچ کدامشان یک تگ script وجود ندارد، همه چیز HTML و CSS است. و حالا صداقتی که این حرف را کامل می کند: صفحه اصلی همین سایت با تمام این حساب و کتاب، jQuery نسخه ۳.۷.۱ را هم بارگذاری می کند. ما آن را ننوشته ایم و صدایش نزده ایم؛ افزونه امنیتی سایت اسکریپت کپچای خودش را با وابستگی به jQuery ثبت می کند و همان یک خط، یک کتابخانه کامل را وارد صفحه می کند. درس واقعی همین است: بودجه جاوااسکریپت شما فقط کد خودتان نیست.
سوال هایی که واقعا پرسیده می شوند
جاوااسکریپت با جاوا فرق دارد؟
دو زبان کاملا جدا هستند و شباهت اسمشان تاریخی است. جاوااسکریپت زبان مرورگر است و جاوا بیشتر در برنامه های سازمانی و اندروید استفاده می شود. اگر دنبال ساختن سایت هستید، آن که لازم دارید جاوااسکریپت است.
اول jQuery یاد بگیرم یا جاوااسکریپت خالی؟
خالی. کارهایی که jQuery برایشان ساخته شده بود، امروز خود جاوااسکریپت با querySelector و addEventListener و fetch انجام می دهد. ولی هنوز در پروژه های وردپرسی قدیمی به آن برمی خورید، حتی روی همین سایت، پس خواندنش بلد باشید؛ نوشتنش لازم نیست.
کدم خطا نمی دهد ولی هیچ کاری هم نمی کند. از کجا شروع کنم؟
اول چک کنید انتخابگرتان واقعا چیزی پیدا کرده: در کنسول console.log بگیرید از همان متغیر و ببینید null نیست. بعد ببینید اسکریپت زودتر از ساخته شدن صفحه اجرا نشده باشد، که با defer حل می شود. این دو مورد بیشتر «کار نمی کند» های روز اول را جواب می دهند.