فرمها و اعتبارسنجی
ساختار فیلدها، قاعدههای اعتبارسنجی و صفتهایی که رفتار فرم را تعیین میکنند.
صفتهای data#
رفتار فرمها با صفتهای data-* مشخص میشود و نیازی به نوشتن جاوااسکریپت نیست.
روی فرم#
| صفت | معنا |
|---|---|
data-next | الزامی. نشانی مقصد پس از موفقیت؛ مقدار none یعنی در همان صفحه بمان و فرم را خالی کن. بدون این صفت، اسکریپت فرم را مدیریت نمیکند |
data-endpoint | کلید یکی از سرویسهای config.api (مثل login) یا یک نشانی کامل |
data-ok | متن تاست موفقیت (اگر سرور message نفرستاده باشد) |
data-demo-auth | فقط حالت نمایشی: رمز واردشده را با demoPassword مقایسه میکند |
data-steps | فرم چندمرحلهای؛ هر مرحله یک .panel |
روی فیلد و دکمه#
| صفت | روی | معنا |
|---|---|---|
data-rule | input | قاعدهٔ اعتبارسنجی: email، phone، national، req، pass یا قاعدهٔ سفارشی |
data-match | input | انتخابگر فیلد مرجع؛ مثلاً #pw برای تکرار رمز |
data-next-step / data-prev-step | button | رفتن به مرحلهٔ بعد یا قبل |
data-social | button | google یا apple؛ نشانی از config.social خوانده میشود |
data-action="resend-email" | button | درخواست ارسال دوبارهٔ ایمیل |
سایر عناصر#
| صفت | روی | معنا |
|---|---|---|
data-next | .otp | مقصد پس از تأیید کد |
data-purpose | .otp | هدف کد که به سرور فرستاده میشود |
data-timer / data-resend | داخل صفحهٔ کد | نمایش زمان باقیمانده و دکمهٔ ارسال دوباره |
data-count | .cd | شمارش معکوس بر حسب ثانیه از لحظهٔ بارگذاری |
data-until | .cd | شمارش معکوس تا تاریخ ISO |
data-modal / data-close | پیوند / دکمه | باز و بستن مودال با شناسهٔ آن |
data-theme-toggle | button | تغییر تم روشن و تیره |
data-demo-only / data-demo-fill | عنصر | متنهایی که فقط در حالت نمایشی دیده میشوند |
ساختار یک فیلد#
<div class="field">
<input id="email" name="email" type="email" placeholder=" "
autocomplete="email" data-rule="email" dir="ltr">
<label for="email">ایمیل</label>
<div class="msg" role="alert"><span></span></div>
</div>placeholder=" " (یک فاصله) لازم است؛ برچسب شناور با آن کار میکند. name فیلد، نام کلید آن در دادهٔ ارسالی به سرور است. هر input باید id یکتا داشته باشد و داخل .field همراه با .msg قرار بگیرد.
فیلد رمز و نمایشگر قدرت#
<div>
<div class="field">
<input id="pw" name="password" type="password" placeholder=" "
autocomplete="new-password" data-rule="pass">
<label for="pw">رمز عبور</label>
<button type="button" class="eye" aria-label="نمایش رمز" aria-pressed="false">
<svg class="ic" aria-hidden="true"><use href="#i-eye"/></svg>
</button>
<div class="msg" role="alert"><span></span></div>
</div>
<div class="meter" data-s="0" aria-hidden="true"><i></i><i></i><i></i><i></i></div>
</div>
<div class="field">
<input id="pw2" name="password_confirmation" type="password" placeholder=" "
data-rule="pass" data-match="#pw">
<label for="pw2">تکرار رمز عبور</label>
<div class="msg" role="alert"><span></span></div>
</div>نمایشگر .meter باید کنار .field رمز و داخل همان عنصر والد باشد. امتیاز قدرت از چهار معیار ساخته میشود: دستکم ۸ نویسه، ترکیب حروف کوچک و بزرگ، وجود رقم، و وجود نماد یا طول ۱۲ نویسه و بیشتر. فیلد تکرار رمز همیشه لحظهای بررسی میشود.
چکباکس الزامی#
<div class="cb">
<label class="check">
<input type="checkbox" name="terms" required>
با <a href="#" data-modal="terms">قوانین و شرایط</a> موافقم
</label>
<div class="msg" role="alert"><span></span></div>
</div>قاعدههای اعتبارسنجی#
| قاعده | شرط | نکته |
|---|---|---|
email | قالب name@example.com | — |
phone | موبایل ایران: 09 و ۱۱ رقم | ارقام فارسی هم پذیرفته میشود |
national | کد ملی ۱۰ رقمی با بررسی رقم کنترل | کدهای تکراری مثل 1111111111 رد میشوند |
req | دستکم ۲ نویسه | — |
pass | دستکم ۸ نویسه شامل حرف انگلیسی و رقم | — |
فیلدهای type="tel" پیش از ارسال به سرور به ارقام لاتین تبدیل میشوند.
زمان نمایش خطا#
خطای هر فیلد تا وقتی کاربر آن را ترک نکرده نمایش داده نمیشود و پس از آن لحظهای است. هنگام ارسال، فیلدهای خالی الزامی هم علامت میخورند و فوکوس به اولین فیلد نامعتبر میرود. در فرم چندمرحلهای فقط فیلدهای مرحلهٔ فعلی بررسی میشوند.
قاعدهٔ سفارشی#
با Mehmannavaz.addRule قاعدهٔ تازه تعریف کنید. تابع باید true یا متن پیام خطا را برگرداند. نام قاعده در data-rule نوشته میشود:
<script src="../assets/js/mehmannavaz.js"></script>
<script>
Mehmannavaz.addRule("username", v =>
/^[a-z0-9_]{3,20}$/.test(v) || "نام کاربری ۳ تا ۲۰ نویسه (حرف کوچک، عدد و _) باشد");
</script><input id="u" name="username" data-rule="username" placeholder=" ">تعریف دوباره یک قاعدهٔ موجود (مثلاً email) پیام یا منطق آن را جایگزین میکند.
کد یکبارمصرف#
<div class="otp" role="group" aria-label="کد ۶ رقمی"
data-purpose="reset" data-next="reset-password.html">
<input inputmode="numeric" maxlength="6" autocomplete="one-time-code" aria-label="رقم ۱">
<input inputmode="numeric" maxlength="6" autocomplete="off" aria-label="رقم ۲">
<!-- ... تا رقم ۶ -->
</div>
<p class="timer center">ارسال دوباره کد تا <span data-timer></span> دیگر</p>
<button class="linkbtn" type="button" data-resend>ارسال دوباره کد</button>- با پر شدن خانهٔ آخر، کد خودکار تأیید میشود.
- چسباندن کد کامل (
Ctrl+V) و تکمیل خودکار پیامک (autocomplete="one-time-code"روی خانهٔ اول) پشتیبانی میشود. - ارقام فارسی به لاتین تبدیل میشوند.
- مدت انتظار ارسال دوباره از
otpResendSecondsخوانده میشود.
فرم چندمرحلهای#
<div class="steps" aria-hidden="true"><i></i><i></i><i></i></div>
<form data-steps data-endpoint="register" data-next="success.html" novalidate>
<div class="panel on stack">
...
<button class="btn" type="button" data-next-step><span class="lbl">ادامه</span></button>
</div>
<div class="panel stack">
...
<button class="btn ghost" type="button" data-prev-step><span class="lbl">قبلی</span></button>
</div>
</form>تعداد <i> در .steps باید با تعداد .panelها برابر باشد. کلید Enter در فیلدها به مرحلهٔ بعد میرود و فرم را زودهنگام ارسال نمیکند. همهٔ مرحلهها در یک درخواست و با هم ارسال میشوند.