← القائمة
LESSON 06 · FORMS & VALIDATION

النماذج والتحقق
بوابة التفاعل الحقيقي مع المستخدم

تعلّم بناء نماذج احترافية وتحقق ذكي من البيانات — من أبسط حقل نصي حتى التحقق المتقدم بـ JavaScript.

القسم الأول

🏗️ بنية النموذج من الصفر

النموذج (<form>) هو حاوية تجمع حقول الإدخال. عند الضغط على زر الإرسال، يجمع المتصفح كل البيانات ويرسلها معاً.

basic-form.html — الهيكل الكامل
1
<!-- tag form: الحاوية الرئيسية -->
كل حقول الإدخال داخله
2
<form
بداية النموذج
3
action="/submit"
action = الرابط الذي ترسل إليه البيانات
4
method="POST"
method = طريقة الإرسال (GET أو POST)
5
id="registration-form"
id للوصول إليه من JS
6
novalidate>
novalidate = نعطّل تحقق المتصفح ونتولى نحن
7
 
8
<!-- حقل الاسم -->
مجموعة label + input
9
<div class="form-group">
div يجمع label والـ input معاً
10
<label for="name">الاسم الكامل *</label>
for="name" يربط الـ label بـ id="name"
11
<input
بداية حقل الإدخال
12
type="text"
نوع النص العادي
13
id="name"
يطابق for في label — إلزامي للربط
14
name="fullname"
المفتاح الذي يصل للسيرفر: fullname=القيمة
15
placeholder="مثال: أحمد محمد"
نص رمادي يختفي عند الكتابة
16
required
حقل إجباري — لا يُرسل فارغاً
17
autocomplete="name">
يساعد المتصفح في الإكمال التلقائي
18
<span class="error-msg" id="name-error"></span>
حاوية رسالة الخطأ — تبقى فارغة عادةً
19
</div>
إغلاق form-group
20
 
21
<!-- زر الإرسال -->
22
<button type="submit">إرسال</button>
type="submit" يُرسل النموذج عند الضغط
23
<button type="reset">مسح</button>
type="reset" يمسح كل الحقول
24
<button type="button">زر عادي</button>
type="button" لا يرسل — للـ JS فقط
25
</form>
إغلاق النموذج
methodمتى تستخدمهملاحظة
GETبحث، فلترة — بيانات غير حساسةالبيانات تظهر في URL — مرئية للجميع
POSTتسجيل، دخول، إرسال بيانات حساسةالبيانات في body الطلب — أكثر أماناً
لماذا label مهمة جداً؟
1️⃣ النقر على نص الـ label يُفعّل الحقل تلقائياً (تجربة مستخدم أفضل)
2️⃣ قارئات الشاشة لذوي الاحتياجات الخاصة تقرأ الـ label عند التركيز على الحقل
3️⃣ مهمة لإمكانية الوصول (Accessibility) وهي متطلب قانوني في كثير من الدول
القسم الثاني

📋 نموذج تسجيل كامل — كل نوع موضّح

complete-form.html
1
<form action="/register" method="POST">
2
 
3
<!── نص عادي ──>
4
<label for="user">اسم المستخدم:</label>
for يطابق id الحقل
5
<input type="text" id="user" name="username" minlength="3" maxlength="20" required>
minlength + maxlength = قيود الطول
6
 
7
<!── بريد إلكتروني ──>
يتحقق من @ تلقائياً
8
<label for="email">البريد الإلكتروني:</label>
9
<input type="email" id="email" name="email" required>
يرفض أي نص بدون @ و domain
10
 
11
<!── كلمة المرور ──>
تُخفى بنقاط
12
<label for="pass">كلمة المرور:</label>
13
<input type="password" id="pass" name="password" minlength="8" required>
يُخفي الكتابة ● — minlength=8 لأمان أفضل
14
 
15
<!── أرقام مقيدة ──>
رقم ضمن نطاق
16
<label for="age">العمر:</label>
17
<input type="number" id="age" name="age" min="13" max="120" step="1">
min/max = الحد الأدنى والأقصى، step = الخطوة
18
 
19
<!── القائمة المنسدلة ──>
select dropdown
20
<label for="country">الدولة:</label>
21
<select id="country" name="country" required>
select = قائمة منسدلة
22
<option value="" disabled selected>اختر دولتك</option>
خيار افتراضي فارغ — disabled يمنع اختياره
23
<option value="sa">السعودية</option>
value يُرسل للسيرفر، النص يظهر للمستخدم
24
<option value="eg">مصر</option>
25
<option value="ae">الإمارات</option>
26
</select>
إغلاق select
27
 
28
<!── مربعات الاختيار ──>
checkboxes — اختيارات متعددة
29
<fieldset>
fieldset يجمع عناصر ذات صلة
30
<legend>اهتماماتك:</legend>
legend = عنوان الـ fieldset
31
<input type="checkbox" id="html" name="interests" value="html">
name متشابه = مجموعة واحدة
32
<label for="html">HTML</label>
النقر على النص يختار الـ checkbox
33
<input type="checkbox" id="css" name="interests" value="css">
يمكن اختيار أكثر من واحد
34
<label for="css">CSS</label>
35
</fieldset>
إغلاق fieldset
36
 
37
<!── أزرار الاختيار الوحيد ──>
radio — اختيار واحد فقط
38
<fieldset>
39
<legend>الجنس:</legend>
40
<input type="radio" id="male" name="gender" value="male">
name متشابه = مجموعة radio — اختيار واحد فقط
41
<label for="male">ذكر</label>
42
<input type="radio" id="female" name="gender" value="female">
نفس الـ name = نفس المجموعة
43
<label for="female">أنثى</label>
44
</fieldset>
45
 
46
<!── منطقة نصية ──>
textarea للنصوص الطويلة
47
<label for="bio">نبذة عنك:</label>
48
<textarea id="bio" name="bio" rows="4" cols="40" maxlength="500"></textarea>
textarea ≠ input — له tag إغلاق. rows/cols للحجم
49
 
50
<button type="submit">تسجيل الحساب</button>
يُرسل النموذج
51
</form>
القسم الثالث

⚡ التحقق بـ JavaScript — المستوى الاحترافي

التحقق المدمج في HTML جيد للبداية، لكن JavaScript يمنحك تحكماً كاملاً في رسائل الخطأ وتوقيتها وشكلها.

validation.js — التحقق الكامل سطراً سطراً
1
// 1. الحصول على النموذج من الصفحة
2
const form = document.querySelector('#registration-form');
نأخذ النموذج بالـ id الخاص به
3
 
4
// 2. الاستماع لحدث الإرسال (submit event)
5
form.addEventListener('submit', (event) => {
'submit' يُطلق عند الضغط على زر الإرسال
6
 
7
// 3. إيقاف إرسال النموذج مؤقتاً
8
event.preventDefault();
يمنع الإرسال الفوري حتى نتحقق من البيانات
9
 
10
// 4. قراءة قيم الحقول
11
const name = document.getElementById('name').value.trim();
.value يأخذ ما كتبه المستخدم، .trim() يحذف المسافات
12
const email = document.getElementById('email').value.trim();
نفس الطريقة للإيميل
13
const pass = document.getElementById('pass').value;
كلمة المرور بدون trim (المسافات قد تكون مقصودة)
14
 
15
// 5. متغير لتتبع صحة النموذج
16
let isValid = true;
نبدأ بافتراض أن كل شيء صحيح
17
 
18
// 6. التحقق من الاسم
19
if (name.length < 3) {
إذا كان الاسم أقل من 3 أحرف
20
showError('name-error', 'الاسم يجب أن يكون 3 أحرف على الأقل');
اعرض رسالة خطأ مخصصة
21
isValid = false;
النموذج غير صحيح
22
} else {
الاسم صحيح
23
clearError('name-error');
امسح رسالة الخطأ السابقة
24
}
25
 
26
// 7. التحقق من الإيميل بـ RegEx
نمط التحقق من الإيميل
27
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
RegEx: لا مسافات، @ إلزامية، نقطة ونطاق بعدها
28
if (!emailPattern.test(email)) {
.test() يُرجع true/false
29
showError('email-error', 'يرجى إدخال بريد إلكتروني صحيح');
30
isValid = false;
31
}
32
 
33
// 8. التحقق من كلمة المرور
متطلبات الأمان
34
const passPattern = /^(?=.*[A-Z])(?=.*\d).{8,}$/;
8+ أحرف، حرف كبير واحد على الأقل، رقم واحد
35
if (!passPattern.test(pass)) {
36
showError('pass-error', '8 أحرف + حرف كبير + رقم');
رسالة توضح المتطلبات
37
isValid = false;
38
}
39
 
40
// 9. إرسال النموذج إذا كل شيء صحيح
41
if (isValid) {
فقط إذا لم يكن هناك أخطاء
42
console.log('كل شيء صحيح — إرسال البيانات...');
43
form.submit();
الإرسال البرمجي
44
}
45
});
نهاية الـ addEventListener
46
 
47
// دوال مساعدة
helper functions
48
function showError(id, msg) {
تظهر رسالة الخطأ في العنصر المحدد
49
document.getElementById(id).textContent = msg;
يكتب الرسالة داخل span الخطأ
50
}
51
function clearError(id) {
تمسح رسالة الخطأ
52
document.getElementById(id).textContent = '';
رسالة فارغة = لا يوجد خطأ
53
}
فهم RegEx المستخدمة:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/ لتحقق الإيميل:
^ = بداية النص | [^\s@]+ = أحرف بدون مسافة أو @ | @ = علامة @ إلزامية | \. = نقطة | $ = نهاية النص

/^(?=.*[A-Z])(?=.*\d).{8,}$/ لكلمة المرور:
(?=.*[A-Z]) = يجب أن يحتوي حرفاً كبيراً | (?=.*\d) = يجب أن يحتوي رقماً | .{8,} = 8 أحرف على الأقل

🛠️ نموذج تفاعلي كامل:

الكود الكامل:
النتيجة:

🧠 اختبار النماذج

5 أسئلة تغطي كل ما تعلمته عن النماذج

س1: ما وظيفة event.preventDefault() عند التحقق من النماذج؟

س2: ما الفرق بين type="checkbox" و type="radio"؟

س3: لماذا يجب أن يتطابق for في label مع id في input؟

س4: ما الفرق بين method="GET" و method="POST"؟

س5: ما وظيفة .trim() عند قراءة قيمة الحقل؟