كيف تنشئ نموذجًا في HTML
النموذج عنصر <form> يحتوي على حقول وزر إرسال. كل حقل يحتاج إلى name: فهو المفتاح الذي تُرسل القيمة تحته. املأ النموذج واضغط Send. المعاينة لا ترسل شيئًا إلى أي مكان، بل تعرض بالضبط ما كان المتصفح سيرسله.
الأجزاء:
actionهي العنوان الذي تذهب إليه البيانات، وmethodهي الطريقة (postهنا).nameعلى كل حقل. وقيمته هي ما كتبه القارئ.<label>تسمّي كل حقل على الشاشة ولقارئات الشاشة (راجع label في HTML).requiredوtype="email"تجعلان المتصفح يفحص الحقول قبل الإرسال. جرّب الإرسال باسم فارغ، أو بـabcكبريد إلكتروني.- زر الإرسال يرسل النموذج. والضغط على Enter في حقل نصي يفعل ذلك أيضًا.
action وmethod: إلى أين تذهب البيانات وكيف
| السمة | القيم | الافتراضية |
|---|---|---|
action | أي عنوان URL | عنوان الصفحة الحالية |
method | get أو post أو dialog | get |
enctype | application/x-www-form-urlencoded أو multipart/form-data أو text/plain | application/x-www-form-urlencoded |
مع method="get" تصبح الحقول سلسلة الاستعلام في العنوان: نموذج بحث يحمل name="q" يذهب إلى /search?q=blue+shoes. هذا صحيح لعمليات البحث والتصفية، لأن النتيجة يمكن حفظها في المفضلة ومشاركتها. ومع method="post" تذهب الحقول في جسم الطلب ولا تظهر في شريط العنوان ولا في السجل. استخدم POST لأي شيء يسجّل الدخول أو ينشئ شيئًا أو يغيّره أو يحذفه، ولكلمات المرور.
النموذج الذي فيه رفع ملف (<input type="file">) يحتاج إلى method="post" وenctype="multipart/form-data"، وإلا فلن يُرسل إلا اسم الملف. أما method="dialog" فهي لنموذج داخل <dialog>: الإرسال يغلق مربع الحوار بدلًا من إرسال طلب.
ما الذي يُرسَل
تُرسل فقط الحقول التي تحمل name، وفقط حين لا تكون disabled. اضغط Submit وقارن الحقول بما يرسله النموذج:
يرسل النموذج city وzip وsource وaction. الحقل الذي بلا اسم، والحقل المعطّل، ومربع الاختيار غير المحدد، كلها تُستبعد. الحقول المخفية تُرسل لكنها لا تظهر أبدًا، وزر الإرسال يرسل name وvalue الخاصين به لأنه الزر الذي استُخدم.
تجميع الحقول بـ fieldset وlegend
<fieldset> يرسم صندوقًا حول الحقول المترابطة، و<legend> عنوانه. تعلن قارئات الشاشة عن legend حين ينتقل التركيز إلى المجموعة، وهذا ما يجعل مجموعة أزرار اختيار مثل التي أدناه مفهومة: «Delivery، Standard، زر اختيار».
disabled على fieldset تعطّل كل الحقول بداخله دفعة واحدة، ولا يُرسل أي منها. احذفها وستصبح حقول الهدية قابلة للاستخدام.
التحقق المدمج: required وpattern وأخواتهما
تفحص المتصفحات هذه السمات قبل الإرسال وتعرض رسالة على أول حقل يفشل:
| السمة | تفحص |
|---|---|
required | أن الحقل غير فارغ (وأن مربع الاختيار محدد) |
type="email", type="url" | أن القيمة تبدو كعنوان بريد إلكتروني أو URL |
minlength, maxlength | طول النص |
min, max, step | نطاق الأرقام والتواريخ |
pattern | أن القيمة كاملة تطابق تعبيرًا نمطيًا |
:invalid و:valid تنسّقان الحقول بحسب حالتها. و:user-invalid أفضل عادةً: لا تنطبق إلا بعد أن يغيّر القارئ الحقل وينتقل عنه، أو يحاول الإرسال، فلا يُفتح نموذج فارغ مغطى بالأحمر.
ثلاثة أمور في pattern توقع الناس في الخطأ. يجب أن يطابق القيمة كاملة (لا حاجة إلى ^ أو $). ولا يعمل إلا حين لا يكون الحقل فارغًا، فاقرنه بـ required. ورسالة الخطأ في المتصفح عامة، فصِف الصيغة بنص ظاهر بجانب الحقل. يضيف Chrome وFirefox نص title إلى رسالتهما، لكن من السهل ألا يُلاحظ.
لإيقاف الفحوص، مثلًا أثناء اختبار التحقق على خادمك، أضف novalidate إلى <form>. ويمكن لزر إرسال واحد أن يتخطاها بـ formnovalidate.
التحقق في المتصفح لراحة القارئ. يستطيع أي شخص تعديل الصفحة أو إرسال طلب من دونه، لذلك يجب أن يفحص الخادم كل قيمة مجددًا.
رسائل مخصصة بـ setCustomValidity
حين لا يمكن كتابة قاعدة كسمة، مثل «يجب أن تتطابق كلمتا المرور»، اضبط الرسالة من JavaScript. الحقل الذي يحمل رسالة مخصصة غير فارغة غير صالح، والنص الفارغ يجعله صالحًا مجددًا:
حقل التكرار ليس له name، لذلك تُرسل نسخة واحدة فقط من كلمة المرور.
معالجة الإرسال في JavaScript
لإرسال النموذج من دون مغادرة الصفحة، استمع إلى submit، واستدعِ preventDefault()، واقرأ الحقول بـ FormData. الاستماع إلى submit بدلًا من click على الزر يلتقط كل طرق الإرسال، بما فيها Enter، ولا يعمل إلا بعد نجاح التحقق المدمج:
Object.fromEntries(new FormData(form)) تحوّل الحقول إلى كائن عادي. أما الحقول التي قد تحمل عدة قيم (مربعات اختيار تشترك في اسم، قائمة select متعددة) فاستخدم لها formData.getAll('name') بدلًا من ذلك، لأن الكائن يحتفظ بآخر قيمة فقط.
أخطاء شائعة
- حقول بلا
name. تُستبعد بصمت من البيانات المرسلة. - نص placeholder بدلًا من التسميات. يختفي التلميح بمجرد أن يكتب القارئ. استخدم
<label>. <button>بلاtypeيُستخدم لشيء غير الإرسال. داخل النموذج يكون زر إرسال.- نموذج داخل نموذج. تداخل النماذج غير صالح، ويتجاهل المتصفح الوسم
<form>الداخلي. - الاستماع إلى
clickعلى زر الإرسال بدلًا منsubmitعلى النموذج. تفوتك عمليات الإرسال بمفتاح Enter. - الوثوق بتحقق المتصفح على جانب الخادم. تحقق مجددًا هناك.
- GET لكلمات المرور. ينتهي بها الأمر في العنوان والسجل وسجلات الخادم.
الأسئلة الشائعة
كيف أنشئ نموذجًا في HTML؟
ضع الحقول داخل <form action="/signup" method="post">، وأعطِ كل حقل name و<label>، واختم بـ <button type="submit">. عند إرسال النموذج يرسل المتصفح كل زوج name=value إلى عنوان action.
ما الفرق بين GET وPOST في النموذج؟
method="get" (الافتراضية) تضع الحقول في العنوان، كما في /search?q=shoes، وهذا يناسب عمليات البحث والتصفية التي يجب أن تُحفظ في المفضلة. أما method="post" فترسلها في جسم الطلب، وهي ما تريده لتسجيل الدخول والتسجيل وأي شيء يغيّر البيانات.
لماذا لا يُرسَل حقل في النموذج؟
ليس له سمة name، أو أنه disabled. تُرسل فقط الحقول المسماة والمفعّلة. ومربع الاختيار أو زر الاختيار غير المحدد يُستبعد كليًا أيضًا.
ما فائدة fieldset وlegend؟
<fieldset> يجمع الحقول المترابطة و<legend> هو عنوان المجموعة. تعلن قارئات الشاشة عن legend حين ينتقل التركيز إلى المجموعة، وهذا ما يجعل مجموعة أزرار الاختيار مفهومة، وdisabled على fieldset تعطّل كل الحقول بداخله.
كيف أتحقق من النموذج في HTML من دون JavaScript؟
استخدم السمات: required وtype="email" وminlength وmaxlength وmin وmax وpattern. يمنع المتصفح الإرسال ويعرض رسالة لأول حقل غير صالح. تحقق دائمًا على الخادم أيضًا، لأن هذه الفحوص تعمل في متصفح القارئ ويمكن تجاوزها.
كيف أمنع النموذج من إعادة تحميل الصفحة؟
استمع إلى حدث submit في النموذج واستدعِ event.preventDefault()، ثم أرسل البيانات بنفسك بـ fetch: form.addEventListener('submit', (e) => { e.preventDefault(); fetch(form.action, { method: 'POST', body: new FormData(form) }); }).