آموزش رایگان جاوا اسکریپت (JavaScript)

آموزش کامل ساخت و افزودن تقویم فارسی به Input (کامل و استاندارد)

1405/03/14 00:07 محراب حسن زاده
آموزش کامل ساخت و افزودن تقویم فارسی به Input (کامل و استاندارد)

معرفی و اهمیت استفاده از تقویم فارسی در وب

یکی از دغدغه‌های اصلی طراحان و برنامه‌نویسان وب فارسی‌زبان، دریافت تاریخ تولد، تاریخ رزرو یا هر نوع تاریخ شمسی دیگری از کاربر است. متاسفانه تگ پیش‌فرض

< input type="date" / >

در مرورگرها به طور کامل از تقویم جلالی (هجری شمسی) پشتیبانی نمی‌کند. از این رو، ساخت یا استفاده از یک تقویم فارسی (Jalali Datepicker) استاندارد، سبک و بهینه از نظر سئو و تجربه کاربری (UX) اهمیت بسیار زیادی دارد.

 

در این مقاله آموزشی، یاد می‌گیریم که چطور با استفاده از جاوااسکریپت نوین (ES6) و API قدرتمند Intl در مرورگرها، یک دیت‌پیکر فارسی کاملا ریسپانسیو و بدون نیاز به کتابخانه‌های سنگین جانبی مانند jQuery بسازیم.

چرا نباید از کتابخانه‌های سنگین قدیمی استفاده کنیم؟

در گذشته، بیشتر توسعه‌دهندگان از پلاگین‌های مبتنی بر jQuery برای افزودن تقویم شمسی استفاده می‌کردند. این کار حجم صفحه را به شدت افزایش داده و سرعت بارگذاری سایت را در موبایل کاهش می‌داد. گوگل به شدت روی فاکتورهای Core Web Vitals حساس است؛ بنابراین استفاده از جاوااسکریپت خام (Vanilla JS) بهترین راهکار برای ارتقای رتبه سئو سایت شماست.

ساختار HTML برای فیلد ورودی تاریخ

ابتدا باید ساختار پایه سند HTML خود را تعریف کنیم. ما به یک فیلد ورودی متنی (Input) احتیاج داریم که با کلیک روی آن، باکس تقویم به صورت پاپ‌آپ زیر آن باز شود:


< div class="datepicker-wrapper" >
  < label for="shamsi-date" >انتخاب تاریخ شمسی:< / label >
  < div class="input-container" >
    < input type="text" id="shamsi-date" placeholder="----/--/--" readonly >
    < span class="calendar-icon" >📅< / span >
  < / div >
  < div id="datepicker-calendar" class="datepicker-calendar hidden" >< / div >
< / div >

طراحی استایل زیبا و RTL با CSS

برای اینکه تقویم ما با استانداردهای گوگل و اصول طراحی واکنش‌گرا (Responsive) هماهنگ باشد، از CSS Grid و Flexbox استفاده می‌کنیم. همچنین جهت و چیدمان المان‌ها را راست‌چین (RTL) می‌کنیم تا مناسب زبان فارسی باشد:


.datepicker-wrapper {
  position: relative;
  font-family: 'Vazirmatn', Tahoma, sans-serif;
  direction: rtl;
  width: 100%;
  max-width: 320px;
}
.input-container {
  position: relative;
  display: flex;
  align-items: center;
}
.datepicker-calendar {
  position: absolute;
  top: 100%;
  right: 0;
  background: #ffffff;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  z-index: 1000;
  padding: 12px;
  width: 290px;
  margin-top: 8px;
}
.hidden {
  display: none;
}

پیاده‌سازی منطق جاوااسکریپت با شیء Intl

جاوااسکریپت مدرن دارای شیء فوق‌العاده‌ای به نام Intl.DateTimeFormat است که به ما اجازه می‌دهد بدون نیاز به فرمول‌های پیچیده ریاضی، تاریخ میلادی را به شمسی تبدیل کنیم و روزهای ماه را به دست آوریم. در کد زیر، ساختار تقویم را به صورت پویا رندر می‌کنیم:


const dateInput = document.getElementById('shamsi-date');
const calendarEl = document.getElementById('datepicker-calendar');

// گرفتن تاریخ جاری سیستم به شمسی
const getJalaliDateParts = (date) => {
  const formatter = new Intl.DateTimeFormat('fa-IR-u-ca-persian', {
    year: 'numeric', month: 'numeric', day: 'numeric'
  });
  const parts = formatter.formatToParts(date);
  return {
    year: parseInt(parts.find(p => p.type === 'year').value),
    month: parseInt(parts.find(p => p.type === 'month').value),
    day: parseInt(parts.find(p => p.type === 'day').value)
  };
};

نکات دسترسی‌پذیری (Accessibility - A11y) برای گوگل

برای اینکه ربات‌های گوگل و کاربران دارای معلولیت (که از صفحه‌خوان استفاده می‌کنند) بتوانند به راحتی از تقویم شما استفاده کنند، نکات زیر را رعایت کنید:

  • استفاده از خاصیت readonly برای اینپوت تا کاربر مجبور به تایپ اشتباه نشود.
  • اضافه کردن تگ aria-haspopup="grid" برای مطلع کردن صفحه‌خوان‌ها از باز شدن تقویم.
  • طراحی دکمه‌های ناوبری بزرگ (حداقل 44px در 44px) جهت تسهیل کلیک در موبایل بر اساس استانداردهای Lighthouse گوگل.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی
1404/09/24 20:16

درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی

مطالعه بیشتر
تفاوت Callbacks و Promises در جاوا اسکریپت: مقایسه جامع با مثال‌ها
1403/07/30 21:53

تفاوت Callbacks و Promises در جاوا اسکریپت: مقایسه جامع با مثال‌ها

مطالعه بیشتر
آموزش متدهای جادویی Constructor و Destructor در PHP (سازنده و مخرب)
1405/07/28 22:02

آموزش متدهای جادویی Constructor و Destructor در PHP (سازنده و مخرب)

مطالعه بیشتر
تنظیم عرض و ارتفاع عناصر در CSS: استفاده از width، height، max و min برای کنترل دقیق اندازه‌ها
1403/08/09 21:08

تنظیم عرض و ارتفاع عناصر در CSS: استفاده از width، height، max و min برای کنترل دقیق اندازه‌ها

مطالعه بیشتر
درک و استفاده از Watchers در Vue.js | آموزش Watch با مثال کاربردی
1404/09/28 22:00

درک و استفاده از Watchers در Vue.js | آموزش Watch با مثال کاربردی

مطالعه بیشتر
آموزش کامل Super Global ها در PHP (متغیرهای سراسری)
1405/04/27 22:29

آموزش کامل Super Global ها در PHP (متغیرهای سراسری)

مطالعه بیشتر
مقدمه‌ای به رویدادها و دستورات در Vue.js: نحوه مدیریت و استفاده از v-on
1402/06/28 23:53

مقدمه‌ای به رویدادها و دستورات در Vue.js: نحوه مدیریت و استفاده از v-on

مطالعه بیشتر
آموزش سیر تا پیاز تاریخ و زمان در PHP (استاندارد گوگل)
1405/04/27 21:58

آموزش سیر تا پیاز تاریخ و زمان در PHP (استاندارد گوگل)

مطالعه بیشتر
آموزش جامع کار با فرم‌ها در PHP (امنیت و اعتبارسنجی طبق استاندارد گوگل)
1405/04/27 22:01

آموزش جامع کار با فرم‌ها در PHP (امنیت و اعتبارسنجی طبق استاندارد گوگل)

مطالعه بیشتر
مقدمه‌ای به template و دیتابایندینگ در Vue.js: نحوه مدیریت داده‌ها و رندرینگ پویا
1402/06/28 00:49

مقدمه‌ای به template و دیتابایندینگ در Vue.js: نحوه مدیریت داده‌ها و رندرینگ پویا

مطالعه بیشتر
آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)
1405/05/04 23:40

آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)

مطالعه بیشتر
آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی
1405/05/01 20:28

آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد