كيف تنشئ قائمة منسدلة في HTML
القائمة المنسدلة عنصر <select> فيه <option> لكل خيار. قيمة value لكل خيار هي ما يرسله النموذج، والنص بين الوسمين هو ما يراه القارئ. اختر واحدًا واضغط Submit:
يرسل النموذج language=js: اسم select name وقيمة الخيار المختار value. selected تحدد الخيار الافتراضي، ومن دونها يُختار الخيار الأول. وإذا لم يكن للخيار value، يُرسل نصه بدلًا منها.
اربط التسمية بـ select عبر for وid (أو بإحاطتها به) كي ينقل النقر على التسمية التركيز إلى القائمة المنسدلة وتعلن عنها قارئات الشاشة.
سمات select وoption
| العنصر | السمة | وظيفتها |
|---|---|---|
<select> | name | المفتاح الذي تُرسل القيمة تحته |
<select> | required | يجب اختيار خيار حقيقي، لا الخيار الأول الفارغ |
<select> | multiple | يمكن اختيار عدة خيارات |
<select> | size | عدد الصفوف الظاهرة (يحوّلها إلى صندوق قائمة) |
<select> | disabled | القائمة كلها متوقفة ولا تُرسل |
<option> | value | ما يُرسل حين يُختار |
<option> | selected | مختار عند تحميل الصفحة |
<option> | disabled | ظاهر لكن لا يمكن اختياره |
<optgroup> | label | عنوان المجموعة |
خيار العنصر النائب مع required
القائمة المنسدلة لها قيمة دائمًا، لذلك من دون خيار نائب يُرسل أول خيار حقيقي حتى لو لم يلمس القارئ القائمة أبدًا. الخيار الأول الفارغ يصلح ذلك، وrequired تمنع الإرسال حتى يُختار خيار حقيقي:
اضغط Continue قبل الاختيار: يرفض المتصفح ويطلب منك اختيار عنصر. الخيار النائب يحمل value=""، وهذا ما تعدّه required فارغًا، وdisabled كي لا يمكن اختياره مجددًا بعد اختيار دولة.
تجميع الخيارات بـ optgroup
<optgroup label="..."> تضع عنوانًا فوق مجموعة من الخيارات. العنوان لا يمكن اختياره:
لا يمكن تداخل المجموعات: للقائمة مستوى واحد من العناوين، لا أكثر. وdisabled على <optgroup> تعطّل كل الخيارات فيها.
الاختيار المتعدد
multiple تتيح للقارئ اختيار عدة خيارات، وتحوّل القائمة المنسدلة إلى صندوق قائمة. اضغط مطولًا على Ctrl (أو Cmd في Mac) لإضافة الخيارات واحدًا واحدًا، أو على Shift لاختيار نطاق:
يرسل النموذج skills=html وskills=css: الاسم نفسه مرة لكل خيار مختار. كثيرون لا يعرفون حركة Ctrl+نقرة، لذلك في حالة خيارات قليلة تكون مجموعة مربعات اختيار أسهل استخدامًا.
قراءة القيمة وضبطها في JavaScript
select.value تقرأ قيمة الخيار المختار وتضبطها، وحدث change ينطلق حين يختار القارئ خيارًا مختلفًا. من الاستخدامات الشائعة قائمة منسدلة ثانية تعتمد خياراتها على الأولى:
new Option(text, value) تنشئ خيارًا. وselect.selectedIndex هي موضع الخيار المختار، وselect.selectedOptions تسرد الخيارات المختارة، وهكذا تقرأ select المتعدد.
تنسيق select
القائمة المفتوحة يرسمها المتصفح ونظام التشغيل، ولا يمكن تنسيق إلا القليل منها. أما الصندوق المغلق فيمكن تنسيقه: appearance: none تزيل السهم الأصلي، وصورة خلفية تضع سهمك مكانه:
الحشو الإضافي في جهة النهاية يترك مساحة للسهم كي لا يمر نص الخيار الطويل تحته. وfont: inherit مهمة هنا بقدر أهميتها في الأزرار: عناصر select تستخدم خط النماذج الصغير الخاص بالمتصفح افتراضيًا. الخيارات في القائمة المفتوحة تحتفظ بالمظهر الأصلي. يستطيع Chrome تنسيق القائمة المفتوحة أيضًا حين تفعّل ذلك بـ appearance: base-select، والمتصفحات التي لا تدعمه تعرض القائمة الأصلية. أما التحكم الكامل في كل مكان فيحتاج إلى عنصر مخصص مبني بـ ARIA، وإتقانه يتطلب جهدًا أكبر بكثير مما يبدو.
select أم أزرار radio أم datalist؟
| استخدم | متى |
|---|---|
<select> | خيار واحد من قائمة طويلة، أو حين تكون المساحة ضيقة |
| أزرار الاختيار | خيار واحد من خيارات قليلة يجب أن تكون كلها ظاهرة (راجع زر الاختيار radio) |
<input> مع <datalist> | اقتراحات، مع السماح بأي قيمة مكتوبة |
أخطاء شائعة
- غياب خيار نائب في اختيار إلزامي. يُرسل أول خيار حقيقي حتى لو لم يختره القارئ.
- خيار نائب بقيمة حقيقية، مثل
value="none". تعدّهrequiredاختيارًا صالحًا. استخدمvalue="". - خيارات بلا
valueحين يكون النص طويلًا أو مترجمًا. يستقبل الخادم النص الظاهر، وهو يتغير مع اللغة. multipleلخيارات قليلة. مربعات الاختيار أسهل استخدامًا.- الاستماع إلى
clickعلى الخيارات. استخدمchangeعلى<select>، فهو ينطلق أيضًا مع التغييرات بلوحة المفاتيح. - غياب التسمية. القائمة التي لا تحمل إلا خيارًا نائبًا تفقد اسمها بمجرد اختيار خيار.
الأسئلة الشائعة
كيف أنشئ قائمة منسدلة في HTML؟
استخدم <select> مع <option> لكل خيار: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. أعطِ select اسم name و<label>.
كيف أحدد الخيار الافتراضي في select؟
أضف selected إلى ذلك الخيار: <option value="blue" selected>Blue</option>. من دونها يكون الخيار الأول هو المحدد. وفي JavaScript اضبط select.value = 'blue'.
كيف أضيف نصًا توضيحيًا (placeholder) إلى select؟
اجعل الخيار الأول فارغًا وغير قابل للاختيار: <option value="" disabled selected>Choose a country</option>. وأضف required إلى <select> كي لا يُرسل النموذج حتى يُختار خيار حقيقي.
كيف أحصل على القيمة المختارة في select بـ JavaScript؟
select.value هي قيمة الخيار المحدد. ولنصه الظاهر استخدم select.selectedOptions[0].text، واستمع إلى حدث change لتستجيب عند تغيّر الاختيار. وفي select المتعدد، مرّ على select.selectedOptions.
ما الفرق بين select وdatalist؟
<select> لا يسمح إلا بالخيارات المدرجة. أما <input> مع <datalist> فيقترح خيارات أثناء الكتابة لكنه يقبل أي نص. استخدم select حين يجب أن تكون الإجابة أحد خياراتك.