Structure > html
این متن هنوز کامل نیست و در حال بروزرسانی است. نسخه‌ی نهایی پس از تکمیل در دسترس قرار خواهد گرفت.

فرم‌ها و عناصر ورودی

در توسعه وب مدرن فرم‌ها (Forms) به عنوان یکی از مهم‌ترین ابزارهای تعامل بین کاربر و سیستم، نقش محوری در جمع‌آوری داده، مدیریت ورودی و ایجاد تجربه کاربری مؤثر دارند. این فصل به بررسی جامع و تخصصی ساختار کلی فرم‌ها، انواع عناصر ورودی، اعتبارسنجی داخلی، و بهبود دسترسی‌پذیری در HTML5 می‌پردازد. هدف این فصل، ایجاد فرم‌های معتبر، هوشمندانه، دسترسی‌پذیر و قابل تنظیم برای تمام دستگاه‌ها است که همچون یک سازه معنایی، خوانایی، عملکرد و امنیت را تضمین می‌کند.

9.1 ساختار کلی تگ فرم: بنیان تعامل کاربری

9.1.1 <form>: عنصر اصلی فرم

پایه‌ای برای جمع‌آوری و ارسال داده‌های کاربر.
action آدرسی که داده‌ها به آن ارسال می‌شوند (URL)
method روش ارسال داده‌ها با ویژگی method تعیین می‌شود و معمولاً یکی از مقادیر GET (پیش‌فرض) یا POST است.
enctype نوع رمزگذاری داده‌های ارسالی با ویژگی enctype مشخص می‌شود و می‌تواند application/x-www-form-urlencoded، multipart/form-data یا text/plain باشد.
autocomplete ویژگی autocomplete تعیین می‌کند که آیا مرورگر مجاز است فیلدهای فرم را به‌صورت خودکار با اطلاعات قبلی پر کند یا نه؛ مقدار آن on یا off است.
novalidate برای غیرفعال‌سازی اعتبارسنجی پیش‌فرض مرورگر می‌توان از ویژگی novalidate استفاده کرد تا داده‌ها بدون بررسی ارسال شوند.
<form 
 action="/submit" 
 method="POST" 
 enctype="multipart/form-data"
 autocomplete="on"
 novalidate
 >
 <!-- محتوای فرم -->
</form>

9.2 عناصر ورودی متداول: ورودی‌های پایه‌ای

9.2.1 <input type="...">: انواع پایه‌ای

text متن آزاد و معمولی برای دریافت نام، آدرس یا هر نوع داده متنی پایه
email ایمیل معتبر برای ورود آدرس ایمیل با اعتبارسنجی خودکار مرورگر
url آدرس اینترنتی برای وارد کردن لینک وب‌سایت به‌صورت معتبر
tel شماره تلفن برای دریافت شماره تماس بدون فرمت مشخص
number مقدار عددی برای اعداد مانند سن، قیمت یا مقدار قابل شمارش
date انتخاب تاریخ نمایش تقویم برای انتخاب یک روز مشخص
datetime-local تاریخ و زمان انتخاب تاریخ و ساعت بدون ناحیه زمانی (local)
time ساعت برای انتخاب مقدار زمان مانند ساعت و دقیقه
month ماه برای انتخاب یک ماه و سال (بدون روز)
week هفته برای انتخاب هفته خاصی از یک سال
color انتخاب رنگ نمایش انتخابگر رنگ برای تنظیمات گرافیکی یا UI
range نوار لغزنده برای مقادیر پیوسته مانند میزان صدا یا روشنایی
password رمز مخفی ورودی مخفی برای رمز عبور یا اطلاعات محرمانه
search ورودی جستجو برای فیلدهای جستجو با ویژگی‌های خاص UX
file انتخاب فایل برای آپلود فایل از سیستم کاربر
<input type="email" name="email" placeholder="example@domain.com" required>
<input type="date" name="birthday">
<input type="file" name="avatar" accept="image/*">
استفاده از type="email" و type="url" به مرورگر کمک می‌کند تا اعتبارسنجی اولیه انجام دهد. required برای فیلدهای ضروری استفاده می‌شود.

9.3 کنترل‌های ورودی پیشرفته: مدیریت داده‌های پیچیده

9.3.1 <textarea>: متن چندخطی

<textarea 
 name="comment" 
 rows="5" 
 cols="60" 
 placeholder="نظر خود را بنویسید..."
 maxlength="500"
></textarea>

9.3.2 <select> و <option>: لیست انتخابی

برای انتخاب یک مقدار از بین گزینه‌ها.
<select name="country" required>
 <option value="">— انتخاب کنید —</option>
 <option value="ir">ایران</option>
 <option value="us">آمریکا</option>
 <option value="fr">فرانسه</option>
</select>
از required و aria-label برای توضیح لیست استفاده کنید.

9.3.3 <optgroup>: گروه‌بندی گزینه‌ها

برای گروه‌بندی گزینه‌ها (مثلاً ایالت‌های یک کشور).
<select name="state">
 <optgroup label="ایران">
  <option value="tehran">تهران</option>
  <option value="shiraz">شیراز</option>
 </optgroup>
 <optgroup label="آمریکا">
  <option value="ny">نیویورک</option>
 </optgroup>
</select>

9.3.4 <datalist>: لیست پیشنهادی (Autocomplete)

لیست گزینه‌های پیشنهادی برای <input>./t>
<input list="browsers" name="browser">
<datalist id="browsers">
 <option value="Chrome">
 <option value="Firefox">
 <option value="Safari">
 <option value="Edge">
</datalist>    
این تگ بدون id و list کار نمی‌کند. استفاده از آن به جای autocomplete در فرم‌های ساده، مفید است.

9.3.5 <button>: دکمه فرم

<button type="submit">ارسال</button>
<button type="reset">ریست</button>
<button type="button" onclick="alert('Hello')">نوشته</button>

9.3.6 <output>: نمایش نتیجه محاسبه

برای نمایش خروجی یک فرم (مثلاً مجموع، میانگین).
<label for="amount">مبلغ:</label>
<input type="number" id="amount" oninput="updateOutput()">
<output name="result" for="amount">0</output>
    
<script>
function updateOutput() {
const amount = document.getElementById("amount").value;
 document.querySelector("output").textContent = amount * 1.1;
 }
</script>

9.3.7 <meter> و <progress>: نمایش وضعیت

<meter> وضعیت کمّی (مثلاً سطح باتری، پردازش)
<progress> فرآیند پیشرفت (مثلاً آپلود، بارگذاری)
<meter min="0" max="100" value="75">75%</meter>
<progress value="50" max="100">50%</progress>

9.4 اعتبارسنجی فرم در HTML5: امنیت و کیفیت داده

9.4.1 ویژگی‌های اعتبارسنجی داخلی

required فیلد ضروری
pattern الگوی متنی (regex)
max - min حداقل و حداکثر عدد
maxlength - minlength طول کاراکتر
step گام عددی مثلا (0.5)
disabled - readonly فقط خواندنی یا غیرفعال
<input 
 type="text" 
 name="username" 
 pattern="[a-zA-Z]{3,}" 
 minlength="3" 
 maxlength="20" 
 required
 title="نام کاربری باید حداقل ۳ حرف باشد."
>
title به کاربر در صورت خطای اعتبارسنجی راهنمایی می‌کند.
pattern با regex کار می‌کند اما باید به دقت تست شود.

9.4.2 Constraint Validation API: اعتبارسنجی پیشرفته با JavaScript

این API به توسعه‌دهندگان اجازه می‌دهد تا اعتبارسنجی را به صورت برنامه‌نویسی انجام دهند.
<script>
const form = document.querySelector("form");
const input = document.querySelector("input");
    
form.addEventListener("submit", function (e) {
 if (!input.validity.valid) {
  e.preventDefault();
  alert("لطفاً فیلد را به درستی پر کنید.");
  }
});
 </script>
<script>input.setCustomValidity("این فیلد الزامی است.");</script>
اعتبارسنجی داخلی HTML5 فقط برای اولین سطح است. اعتبارسنجی پایانی باید با JavaScript و سرور انجام شود.

9.5 بهبود دسترسی‌پذیری فرم‌ها: از ساختار به اعتماد

9.5.1 <label>: ارجاع به فیلد

<label for="email">ایمیل:</label>
<input type="email" id="email" name="email">
Screen Readers از for و id برای خواندن فیلد استفاده می‌کنند. اگر فیلد بدون label باشد از aria-label استفاده کنید.

9.5.2 ویژگی‌های ARIA برای فرم‌ها

aria-label توضیح فیلد بدون نمایش
aria-labelledby ارجاع به یک یا چند عنوان
aria-describedby توضیحات جانبی
aria-invalid مشخص کردن خطای فرم
aria-required مشخص کردن فیلد ضروری
<input 
 type="email" 
 aria-label="ایمیل کاربر" 
 aria-invalid="true" 
 aria-describedby="error-email"
 >
<p id="error-email">ایمیل وارد شده معتبر نیست.</p>
استفاده از aria-invalid و aria-describedby به ابزارهای دسترسی کمک می‌کند تا خطاهای فرم را به درستی اعلام کنند.
یک فرم موفق فقط با ظاهر زیبا نیست بلکه با ساختار معنایی منظم، اعتبارسنجی هوشمندانه، و دسترسی‌پذیری بالا ساخته می‌شود. این فصل پایه‌ای برای نوشتن محتوای تعاملی معتبر، دسترسی‌پذیر و متناسب با استانداردهای جهانی است.



بعدی قبلی